Сообщения в 1С:Предприятие — это не просто уведомления для пользователей, но и потенциальный источник проблем: от перегруженной базы данных до ошибок при обновлении. Если в вашей системе накопились тысячи записей в журнале сообщений, регистрах сбоев или логах обмена, рано или поздно это скажется на производительности. Особенно критично это для высоконагруженных конфигураций типа 1С:ERP, 1С:УТ 11 или 1С:ЗУП 3.1, где объем транзакций исчисляется миллионами в год.

В этой статье мы разберём не только стандартные инструменты очистки (которые знают все), но и скрытые механизмы платформы, позволяющие автоматизировать процесс. Вы узнаете, как безопасно удалить сообщения без риска нарушить целостность данных, какие таблицы базы задействованы в процессе, и почему иногда проще написать собственный скрипт, чем использовать типовой обработчик. А для разработчиков — бонус: примеры кода на встроенном языке 1С с комментариями.

Предупреждаем сразу: очистка сообщений в рабочей базе без резервной копии может привести к потере критически важной информации о транзакциях, особенно если они привязаны к документам или регистрам накопления. Если вы не уверены в своих действиях — протестируйте скрипты на копии базы.

1. Стандартные инструменты 1С для очистки сообщений

Начнём с того, что предлагает сама платформа. В большинстве конфигураций (например, 1С:Бухгалтерия 3.0 или 1С:Розница 2.3) есть встроенные обработки для удаления устаревших данных. Их главное преимущество — безопасность: они учитывают ссылки между объектами и не позволяют удалить то, что может нарушить работу системы.

Где искать:

  • 📌 Администрирование → Поддержка и обслуживание → Очистка данных (для современных конфигураций на управляемых формах)
  • 📌 Сервис → Удаление помеченных объектов (для старых версий на обычных формах)
  • 📌 Все функции → Очистка журнала регистрации (в некоторых отраслевых решениях)

Однако у стандартных инструментов есть ограничения:

  • ⚠️ Не всегда позволяют гибко настроить период очистки (например, удалить сообщения старше 30 дней, но оставить критические ошибки).
  • ⚠️ Может отсутствовать возможность выбора конкретных типов сообщений (например, только информационные, без ошибок).
  • ⚠️ В некоторых конфигурациях (например, 1С:Документооборот) очистка логов требует прав администратора сервера.
📊 Как часто вы очищаете сообщения в 1С?
Раз в месяц
Раз в квартал
Только при замедлении работы
Никогда не очищал

2. Ручное удаление через консоль запросов

Если стандартные обработки не подходят, можно воспользоваться консолью запросов (Отладка → Консоль запросов в конфигураторе). Этот метод даёт больше контроля, но требует знания структуры базы данных. Например, для очистки журнала регистрации (таблица _EventLog в SQL-версии) подойдёт такой запрос:

УДАЛИТЬ ИЗ РегистрСведений.ЖурналРегистрации

ГДЕ Дата < ДАТАВРЕМЯ(2023, 1, 1)

Для файловой версии 1С запрос будет аналогичным, но выполняться дольше из-за особенностей работы с файлами. Важно понимать, что прямое удаление из таблиц может нарушить целостность данных, если сообщения связаны с другими объектами (например, с документами или задачами).

💡

Перед выполнением массового удаления через консоль запросов проверьте, не используются ли эти сообщения в отчётах или бизнес-процессах. Например, в 1С:ERP журнал регистрации может быть источником данных для анализа производительности.

Для очистки сообщений обмена данными (например, в 1С:УТ при интеграции с сайтом) подойдёт запрос к регистру РегистрСведений.СообщенияОбменаДанными:

УДАЛИТЬ ИЗ РегистрСведений.СообщенияОбменаДанными

ГДЕ ДатаСоздания < ТЕКУЩАЯДАТА() - 30

3. Автоматизация через внешние обработки

Если очистка нужна регулярно (например, ежемесячно), разумно создать внешнюю обработку с гибкими настройками. Преимущества такого подхода:

  • 🔧 Возможность выбирать период очистки (например, "удалить всё старше 6 месяцев").
  • 🔧 Фильтрация по типу сообщений (ошибки, предупреждения, информационные).
  • 🔧 Логирование действий (чтобы отследить, что именно было удалено).
  • 🔧 Интеграция с регламентными заданиями для автоматического запуска.

Пример кода для обработки, которая очищает журнал регистрации с учётом типа сообщения:

Процедура ОчиститьЖурналРегистрации(ПериодДней, ТипСообщения = Неопределено) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЖурналРегистрации.Ссылка КАК Ссылка

|ИЗ

| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации

|ГДЕ

| ЖурналРегистрации.Дата < ТЕКУЩАЯДАТА() - &ПериодДней

| <?(&ТипСообщения = Неопределено, ИСТИНА, ЖурналРегистрации.ТипСобытия = &ТипСообщения)>";

Запрос.УстановитьПараметр("ПериодДней", ПериодДней);

Если ТипСообщения <> Неопределено Тогда

Запрос.УстановитьПараметр("ТипСообщения", ТипСообщения);

КонецЕсли;

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Попытка

ЖурналРегистрации = Выборка.Ссылка.ПолучитьОбъект();

ЖурналРегистрации.Удалить();

Исключение

ЗаписатьЛог("Ошибка при удалении сообщения: " + ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

КонецПроцедуры

Эту обработку можно сохранить как внешний файл (.epf) и подключать по мере необходимости. Для автоматического запуска добавьте её в Регламентные задания с нужной периодичностью.

Создать резервную копию базы|Проверить права пользователя (требуются полные права)|Настроить фильтры в обработке (период, тип сообщений)|Протестировать на копии базы|Добавить в регламентные задания-->

4. Очистка через SQL-запросы (для клиент-серверного варианта)

Если ваша работает на SQL-сервере (Microsoft SQL Server, PostgreSQL), можно ускорить процесс, выполнив очистку напрямую в базе данных. Это особенно актуально для крупных баз, где стандартные методы работают слишком долго.

Пример запроса для Microsoft SQL Server (удалит сообщения старше 90 дней из журнала регистрации):

DELETE FROM [dbo].[_EventLog]

WHERE [EventDate] < DATEADD(day, -90, GETDATE())

Для PostgreSQL синтаксис будет немного другим:

DELETE FROM "_eventlog"

WHERE "eventdate" < CURRENT_DATE - INTERVAL '90 days';

Какие таблицы отвечают за сообщения в 1С?

В SQL-версии 1С сообщения хранятся в нескольких таблицах в зависимости от типа:

- _EventLog — журнал регистрации (основные события).

- _DataExchangeLog — логи обмена данными (для распределённых баз).

- _OperLog — операционный журнал (в некоторых конфигурациях).

- _MsgLog — сообщения обмена (например, для интеграции с внешними системами).

Перед очисткой проверьте актуальные имена таблиц в вашей базе — они могут отличаться в зависимости от версии платформы и конфигурации.

⚠️ Внимание: Прямое вмешательство в базу данных может нарушить целостность данных, если сообщения связаны с другими объектами через ссылки. Всегда делайте резервную копию перед такими операциями и тестируйте запросы на копии базы.

Для 1С:Управление торговлей 11 и 1С:ERP часто требуется очистка не только журнала регистрации, но и таблиц обмена данными. Например, для удаления устаревших сообщений обмена с сайтом:

DELETE FROM [dbo].[_DataExchangeLog]

WHERE [MessageDate] < DATEADD(month, -6, GETDATE())

5. Особенности очистки в разных конфигурациях 1С

Не все конфигурации одинаково хранят сообщения. Рассмотрим ключевые различия:

Конфигурация Где хранятся сообщения Особенности очистки Рекомендуемый метод
1С:Бухгалтерия 3.0 Журнал регистрации, регистр СообщенияОбмена Сообщения привязаны к документам (например, к проводкам). Удаление может нарушить отчёты. Стандартная обработка или скрипт с проверкой ссылочной целостности.
1С:Управление торговлей 11 Журнал регистрации, таблицы обмена с сайтом (ВзаимодействиеССайтом) Сообщения обмена могут блокировать заказы. Очистка требует согласования с администратором сайта. SQL-запросы (для клиент-серверного варианта) или внешняя обработка.
1С:Зарплата и Управление Персоналом 3.1 Журнал регистрации, регистр ЛогИзменений Сообщения о изменениях кадровых данных критичны для отчётности. Ручная очистка с подтверждением или архивация перед удалением.
1С:ERP Управление предприятием 2 Журнал регистрации, РегистрСведений.СообщенияОбменаДанными, РегистрСведений.ЛогБизнесПроцессов Высокая нагрузка на базу. Очистка может занять часы. Регламентное задание с внешней обработкой или SQL-запросы.
1С:Документооборот Журнал регистрации, таблицы ДокОснова и ДокСвязи Сообщения привязаны к документам и задачам. Удаление может нарушить маршруты согласования. Только стандартные обработки с проверкой зависимостей.

В 1С:УТ 11 и 1С:ERP особое внимание уделите очистке сообщений обмена данными. Если интеграция настроена с внешними системами (например, с Bitrix24 или МойСклад), удаление логов может привести к дублированию данных при следующем обмене. В таких случаях лучше архивировать сообщения, а не удалять.

💡

В конфигурациях с бизнес-процессами (например, 1С:Документооборот) очистка логов может нарушить историю выполнения задач. Перед удалением проверьте, не используются ли эти данные в отчётах по KPI или аудиту.

6. Архивация вместо удаления: когда это необходимо

В некоторых случаях удаление сообщений недопустимо. Например:

  • 📊 В 1С:ERP или 1С:УТ журнал регистрации используется для анализа пиковых нагрузок.
  • 📊 В 1С:ЗУП сообщения о изменениях кадровых данных могут потребоваться для проверок трудовой инспекцией.
  • 📊 В распределённых базах (например, с РИБ) логи обмена нужны для отладки синхронизации.

В таких случаях лучше архивировать сообщения, а не удалять. Для этого можно:

  1. Создать внешнюю обработку, которая переносит старые записи в отдельную таблицу (например, АрхивСообщений).
  2. Использовать Регламентные задания для автоматического экспорта логов в XML или JSON.
  3. Настроить SQL-триггеры (для клиент-серверного варианта), которые будут копировать данные перед удалением.

Пример кода для архивации сообщений в отдельную таблицу:

Процедура АрхивироватьСообщения(ПериодДней) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЖурналРегистрации.Ссылка КАК Ссылка,

| ЖурналРегистрации.Дата КАК Дата,

| ЖурналРегистрации.ТипСобытия КАК ТипСобытия,

| ЖурналРегистрации.Пользователь КАК Пользователь,

| ЖурналРегистрации.Комментарий КАК Комментарий

|ИЗ

| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации

|ГДЕ

| ЖурналРегистрации.Дата < ТЕКУЩАЯДАТА() - &ПериодДней";

Запрос.УстановитьПараметр("ПериодДней", ПериодДней);

Результат = Запрос.Выполнить();

Архив = Новый ТаблицаЗначений;

Архив.Колонки.Добавить("Ссылка");

Архив.Колонки.Добавить("Дата");

Архив.Колонки.Добавить("ТипСобытия");

Архив.Колонки.Добавить("Пользователь");

Архив.Колонки.Добавить("Комментарий");

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

НоваяСтрока = Архив.Добавить();

НоваяСтрока.Ссылка = Выборка.Ссылка;

НоваяСтрока.Дата = Выборка.Дата;

НоваяСтрока.ТипСобытия = Выборка.ТипСобытия;

НоваяСтрока.Пользователь = Выборка.Пользователь;

НоваяСтрока.Комментарий = Выборка.Комментарий;

КонецЦикла;

// Сохраняем архив в файл

Архив.Записать("C:\АрхивСообщений\" + Формат(ТЕКУЩАЯДАТА(), "ДФ=yyyyMMdd") + ".json");

// Удаляем оригинальные записи

УдалитьСообщения(ПериодДней);

КонецПроцедуры

7. Ошибки при очистке и как их избежать

Даже опытные администраторы сталкиваются с проблемами при очистке сообщений. Рассмотрим типичные ошибки и способы их предотвращения:

🔴 Ошибка 1: "Нарушение ссылочной целостности" при удалении из журнала регистрации.

⚠️ Внимание: Если сообщение привязано к документу (например, к заказу покупателя), его нельзя удалить напрямую. Сначала нужно удалить ссылку в документе или использовать метод ПометитьНаУдаление() с проверкой зависимостей.

🔴 Ошибка 2: Зависание базы при массовом удалении через консоль запросов.

Решение: разбивайте удаление на пакеты (например, по 1000 записей за раз) или используйте SQL-запросы для клиент-серверного варианта.

🔴 Ошибка 3: После очистки перестали работать отчёты, использующие журнал регистрации.

Решение: перед удалением проверьте, какие отчёты используют таблицу _EventLog или ЖурналРегистрации. При необходимости архивируйте данные.

🔴 Ошибка 4: В распределённой базе (РИБ) после очистки логов обмена данные перестали синхронизироваться.

Решение: не удаляйте сообщения обмена руками — используйте стандартную обработку Очистка истории обмена в конфигураторе.

🔴 Ошибка 5: При очистке через SQL-запрос удалились не те данные.

⚠️ Внимание: Всегда проверяйте условие WHERE в SQL-запросе на тестовой базе. Например, если вместо EventDate < DATEADD(day, -90, GETDATE()) вы укажете EventDate > ..., удалите все актуальные сообщения.

Для диагностики ошибок используйте:

  • 🔍 Журнал регистрации (фильтр по дате и типу ошибки).
  • 🔍 SQL Profiler (для клиент-серверного варианта).
  • 🔍 Тестирование и исправление ИБ в конфигураторе.

8. Оптимизация базы после очистки

Удаление сообщений — только половина дела. Чтобы база работала быстрее, после очистки выполните:

🛠 Для файлового варианта 1С:

  • 📉 Тестирование и исправление ИБ (с флагом "Перестроить таблицы").
  • 📉 Дефрагментация файла базы (например, утилитой chdbfl.exe).
  • 📉 Оптимизация индексов (если используется SQLite).

🛠 Для клиент-серверного варианта:

  • 📉 Перестроение индексов в SQL Server Management Studio или pgAdmin (для PostgreSQL).
  • 📉 Обновление статистики (UPDATE STATISTICS в SQL Server).
  • 📉 Очистка кэша 1С на сервере (Расширение кэша = 0 в параметрах запуска).

Пример команды для перестроения индексов в Microsoft SQL Server:

EXEC sp_MSforeachtable @command1="PRINT '?' DBCC DBREINDEX ('?', ' ', 80)"

GO

EXEC sp_updatestats

GO

Для PostgreSQL подойдёт:

REINDEX DATABASE имя_базы;

ANALYZE;

После оптимизации проверьте производительность базы с помощью:

  • 📊 Встроенного Монитора производительности в 1С.
  • 📊 Запросов к системным представлениям SQL (например, sys.dm_db_index_usage_stats).
  • 📊 Внешних утилит типа SQL Diagnostic Manager или pgBadger.
💡

После массовой очистки сообщений обязательно перезапустите сервер 1С и клиентские сессии. В некоторых случаях изменения вступают в силу только после рестарта.

FAQ: Частые вопросы по очистке сообщений в 1С

Можно ли очистить сообщения в 1С:Бухгалтерии 3.0 без прав администратора?

Нет, для очистки журнала регистрации или логов обмена требуются полные права (роль "Администратор" или специальная роль с правом на удаление данных). Если у вас ограниченный доступ, обратитесь к администратору базы. В некоторых конфигурациях (например, 1С:УТ 11) можно настроить профили доступа, чтобы делегировать право на очистку конкретному пользователю.

Как очистить сообщения обмена данными в 1С:УТ 11, если они занимают сотни гигабайт?

Для крупных баз рекомендуется:

  1. Создать резервную копию.
  2. Использовать SQL-запросы (если база клиент-серверная) с разбивкой на пакеты:
    WHILE 1=1
    

    BEGIN

    DELETE TOP (10000) FROM [dbo].[_DataExchangeLog]

    WHERE [MessageDate] < DATEADD(month, -12, GETDATE())

    IF @@ROWCOUNT = 0 BREAK

    WAITFOR DELAY '00:00:01' -- Пауза, чтобы не блокировать базу

    END

  3. После очистки выполнить REINDEX и UPDATE STATISTICS.

Если база файловая, используйте внешнюю обработку с постраничным удалением (по 5000–10000 записей за итерацию).

Что будет, если очистить журнал регистрации в 1С:ЗУП 3.1?

В 1С:Зарплата и Управление Персоналом журнал регистрации может содержать:

  • 📋 История изменений кадровых данных (пригодится при проверках).
  • 📋 Логи расчёта зарплаты (нужны для пересчётов).
  • 📋 Сообщения о ошибках при выгрузке в ПФР или ФНС.

Если эти данные критичны, не удаляйте их, а архивируйте. Для очистки используйте стандартную обработку Очистка истории данных с фильтром по дате.

Как очистить сообщения в 1С:Документооборот без нарушения бизнес-процессов?

В 1С:Документооборот сообщения тесно связаны с:

  • 📄 Маршрутами согласования документов.
  • 📄 Задачами пользователям.
  • 📄 Историей изменений.

Рекомендации:

  1. Используйте только стандартные обработки из раздела Администрирование → Очистка данных.
  2. Перед очисткой проверьте, не используются ли сообщения в отчётах по KPI или SLA.
  3. Архивируйте данные перед удалением (например, в XML).

⚠️ Внимание: Удаление сообщений может сбросить статус задач (например, "На согласовании" → "Не выполнено").

Можно ли автоматизировать очистку сообщений в 1С:ERP через регламентные задания?

Да, для этого:

  1. Создайте внешнюю обработку с процедурой очистки (пример кода см. в разделе 3).
  2. Добавьте её в Регламентные задания (Администрирование → Поддержка и обслуживание → Регламентные задания).
  3. Настройте расписание (например, раз в месяц в нерабочее время).

Пример настройки регламентного задания:

Параметры = Новый Структура;

Параметры.Вставить("ПериодДней", 90);

Параметры.Вставить("ТипСообщения", Перечисление.ТипыСобытийЖурналаРегистрации.Информация);

Задание = РегламентныеЗадания.СоздатьЗадание(

"ОчисткаЖурналаРегистрации",

"Обработка.ОчисткаСообщений.ОчиститьЖурналРегистрации",

Ложь,

Параметры

);

Задание.Расписание.ДобавитьЕжемесячно(3, 2, 0); // Каждую третью среду в 02:00

Для клиент-серверного варианта лучше использовать SQL-AgentMS SQL Server) или cronPostgreSQL).