Сообщения в 1С:Предприятие — это не просто уведомления для пользователей, но и потенциальный источник проблем: от перегруженной базы данных до ошибок при обновлении. Если в вашей системе накопились тысячи записей в журнале сообщений, регистрах сбоев или логах обмена, рано или поздно это скажется на производительности. Особенно критично это для высоконагруженных конфигураций типа 1С:ERP, 1С:УТ 11 или 1С:ЗУП 3.1, где объем транзакций исчисляется миллионами в год.
В этой статье мы разберём не только стандартные инструменты очистки (которые знают все), но и скрытые механизмы платформы, позволяющие автоматизировать процесс. Вы узнаете, как безопасно удалить сообщения без риска нарушить целостность данных, какие таблицы базы задействованы в процессе, и почему иногда проще написать собственный скрипт, чем использовать типовой обработчик. А для разработчиков — бонус: примеры кода на встроенном языке 1С с комментариями.
Предупреждаем сразу: очистка сообщений в рабочей базе без резервной копии может привести к потере критически важной информации о транзакциях, особенно если они привязаны к документам или регистрам накопления. Если вы не уверены в своих действиях — протестируйте скрипты на копии базы.
1. Стандартные инструменты 1С для очистки сообщений
Начнём с того, что предлагает сама платформа. В большинстве конфигураций (например, 1С:Бухгалтерия 3.0 или 1С:Розница 2.3) есть встроенные обработки для удаления устаревших данных. Их главное преимущество — безопасность: они учитывают ссылки между объектами и не позволяют удалить то, что может нарушить работу системы.
Где искать:
- 📌
Администрирование → Поддержка и обслуживание → Очистка данных(для современных конфигураций на управляемых формах) - 📌
Сервис → Удаление помеченных объектов(для старых версий на обычных формах) - 📌
Все функции → Очистка журнала регистрации(в некоторых отраслевых решениях)
Однако у стандартных инструментов есть ограничения:
- ⚠️ Не всегда позволяют гибко настроить период очистки (например, удалить сообщения старше 30 дней, но оставить критические ошибки).
- ⚠️ Может отсутствовать возможность выбора конкретных типов сообщений (например, только информационные, без ошибок).
- ⚠️ В некоторых конфигурациях (например, 1С:Документооборот) очистка логов требует прав администратора сервера.
2. Ручное удаление через консоль запросов
Если стандартные обработки не подходят, можно воспользоваться консолью запросов (Отладка → Консоль запросов в конфигураторе). Этот метод даёт больше контроля, но требует знания структуры базы данных. Например, для очистки журнала регистрации (таблица _EventLog в SQL-версии) подойдёт такой запрос:
УДАЛИТЬ ИЗ РегистрСведений.ЖурналРегистрации
ГДЕ Дата < ДАТАВРЕМЯ(2023, 1, 1)
Для файловой версии 1С запрос будет аналогичным, но выполняться дольше из-за особенностей работы с файлами. Важно понимать, что прямое удаление из таблиц может нарушить целостность данных, если сообщения связаны с другими объектами (например, с документами или задачами).
Перед выполнением массового удаления через консоль запросов проверьте, не используются ли эти сообщения в отчётах или бизнес-процессах. Например, в 1С:ERP журнал регистрации может быть источником данных для анализа производительности.
Для очистки сообщений обмена данными (например, в 1С:УТ при интеграции с сайтом) подойдёт запрос к регистру РегистрСведений.СообщенияОбменаДанными:
УДАЛИТЬ ИЗ РегистрСведений.СообщенияОбменаДанными
ГДЕ ДатаСоздания < ТЕКУЩАЯДАТА() - 30
3. Автоматизация через внешние обработки
Если очистка нужна регулярно (например, ежемесячно), разумно создать внешнюю обработку с гибкими настройками. Преимущества такого подхода:
- 🔧 Возможность выбирать период очистки (например, "удалить всё старше 6 месяцев").
- 🔧 Фильтрация по типу сообщений (ошибки, предупреждения, информационные).
- 🔧 Логирование действий (чтобы отследить, что именно было удалено).
- 🔧 Интеграция с регламентными заданиями для автоматического запуска.
Пример кода для обработки, которая очищает журнал регистрации с учётом типа сообщения:
Процедура ОчиститьЖурналРегистрации(ПериодДней, ТипСообщения = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЖурналРегистрации.Ссылка КАК Ссылка
|ИЗ
| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации
|ГДЕ
| ЖурналРегистрации.Дата < ТЕКУЩАЯДАТА() - &ПериодДней
| <?(&ТипСообщения = Неопределено, ИСТИНА, ЖурналРегистрации.ТипСобытия = &ТипСообщения)>";
Запрос.УстановитьПараметр("ПериодДней", ПериодДней);
Если ТипСообщения <> Неопределено Тогда
Запрос.УстановитьПараметр("ТипСообщения", ТипСообщения);
КонецЕсли;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
ЖурналРегистрации = Выборка.Ссылка.ПолучитьОбъект();
ЖурналРегистрации.Удалить();
Исключение
ЗаписатьЛог("Ошибка при удалении сообщения: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Эту обработку можно сохранить как внешний файл (.epf) и подключать по мере необходимости. Для автоматического запуска добавьте её в Регламентные задания с нужной периодичностью.
Создать резервную копию базы|Проверить права пользователя (требуются полные права)|Настроить фильтры в обработке (период, тип сообщений)|Протестировать на копии базы|Добавить в регламентные задания-->
4. Очистка через SQL-запросы (для клиент-серверного варианта)
Если ваша 1С работает на 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С одинаково хранят сообщения. Рассмотрим ключевые различия:
| Конфигурация | Где хранятся сообщения | Особенности очистки | Рекомендуемый метод |
|---|---|---|---|
| 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С:ЗУП сообщения о изменениях кадровых данных могут потребоваться для проверок трудовой инспекцией.
- 📊 В распределённых базах (например, с РИБ) логи обмена нужны для отладки синхронизации.
В таких случаях лучше архивировать сообщения, а не удалять. Для этого можно:
- Создать внешнюю обработку, которая переносит старые записи в отдельную таблицу (например,
АрхивСообщений). - Использовать
Регламентные заданиядля автоматического экспорта логов вXMLилиJSON. - Настроить
SQL-триггеры(для клиент-серверного варианта), которые будут копировать данные перед удалением.
Пример кода для архивации сообщений в отдельную таблицу:
Процедура АрхивироватьСообщения(ПериодДней) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЖурналРегистрации.Ссылка КАК Ссылка,
| ЖурналРегистрации.Дата КАК Дата,
| ЖурналРегистрации.ТипСобытия КАК ТипСобытия,
| ЖурналРегистрации.Пользователь КАК Пользователь,
| ЖурналРегистрации.Комментарий КАК Комментарий
|ИЗ
| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации
|ГДЕ
| ЖурналРегистрации.Дата < ТЕКУЩАЯДАТА() - &ПериодДней";
Запрос.УстановитьПараметр("ПериодДней", ПериодДней);
Результат = Запрос.Выполнить();
Архив = Новый ТаблицаЗначений;
Архив.Колонки.Добавить("Ссылка");
Архив.Колонки.Добавить("Дата");
Архив.Колонки.Добавить("ТипСобытия");
Архив.Колонки.Добавить("Пользователь");
Архив.Колонки.Добавить("Комментарий");
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Архив.Добавить();
НоваяСтрока.Ссылка = Выборка.Ссылка;
НоваяСтрока.Дата = Выборка.Дата;
НоваяСтрока.ТипСобытия = Выборка.ТипСобытия;
НоваяСтрока.Пользователь = Выборка.Пользователь;
НоваяСтрока.Комментарий = Выборка.Комментарий;
КонецЦикла;
// Сохраняем архив в файл
Архив.Записать("C:\АрхивСообщений\" + Формат(ТЕКУЩАЯДАТА(), "ДФ=yyyyMMdd") + ".json");
// Удаляем оригинальные записи
УдалитьСообщения(ПериодДней);
КонецПроцедуры
7. Ошибки при очистке и как их избежать
Даже опытные администраторы 1С сталкиваются с проблемами при очистке сообщений. Рассмотрим типичные ошибки и способы их предотвращения:
🔴 Ошибка 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, если они занимают сотни гигабайт?
Для крупных баз рекомендуется:
- Создать резервную копию.
- Использовать
SQL-запросы(если база клиент-серверная) с разбивкой на пакеты:WHILE 1=1BEGIN
DELETE TOP (10000) FROM [dbo].[_DataExchangeLog]
WHERE [MessageDate] < DATEADD(month, -12, GETDATE())
IF @@ROWCOUNT = 0 BREAK
WAITFOR DELAY '00:00:01' -- Пауза, чтобы не блокировать базу
END
- После очистки выполнить
REINDEXиUPDATE STATISTICS.
Если база файловая, используйте внешнюю обработку с постраничным удалением (по 5000–10000 записей за итерацию).
Что будет, если очистить журнал регистрации в 1С:ЗУП 3.1?
В 1С:Зарплата и Управление Персоналом журнал регистрации может содержать:
- 📋 История изменений кадровых данных (пригодится при проверках).
- 📋 Логи расчёта зарплаты (нужны для пересчётов).
- 📋 Сообщения о ошибках при выгрузке в ПФР или ФНС.
Если эти данные критичны, не удаляйте их, а архивируйте. Для очистки используйте стандартную обработку Очистка истории данных с фильтром по дате.
Как очистить сообщения в 1С:Документооборот без нарушения бизнес-процессов?
В 1С:Документооборот сообщения тесно связаны с:
- 📄 Маршрутами согласования документов.
- 📄 Задачами пользователям.
- 📄 Историей изменений.
Рекомендации:
- Используйте только стандартные обработки из раздела
Администрирование → Очистка данных. - Перед очисткой проверьте, не используются ли сообщения в отчётах по
KPIилиSLA. - Архивируйте данные перед удалением (например, в
XML).
⚠️ Внимание: Удаление сообщений может сбросить статус задач (например, "На согласовании" → "Не выполнено").
Можно ли автоматизировать очистку сообщений в 1С:ERP через регламентные задания?
Да, для этого:
- Создайте внешнюю обработку с процедурой очистки (пример кода см. в разделе 3).
- Добавьте её в
Регламентные задания(Администрирование → Поддержка и обслуживание → Регламентные задания). - Настройте расписание (например, раз в месяц в нерабочее время).
Пример настройки регламентного задания:
Параметры = Новый Структура;
Параметры.Вставить("ПериодДней", 90);
Параметры.Вставить("ТипСообщения", Перечисление.ТипыСобытийЖурналаРегистрации.Информация);
Задание = РегламентныеЗадания.СоздатьЗадание(
"ОчисткаЖурналаРегистрации",
"Обработка.ОчисткаСообщений.ОчиститьЖурналРегистрации",
Ложь,
Параметры
);
Задание.Расписание.ДобавитьЕжемесячно(3, 2, 0); // Каждую третью среду в 02:00
Для клиент-серверного варианта лучше использовать SQL-Agent (в MS SQL Server) или cron (в PostgreSQL).