Очистка очереди исходящих сообщений
Иногда возникает ситуация, что при отправке сообщений из 1С в Платформу на уровне обработчика происходит фильтрация сообщений и назначение им соответствующих статусов, например, Обработка отменена. Сообщения с данным статусом накапливаются в очереди исходящих сообщений и забивают ее. Чтобы очистить очередь есть два варианта.
Вариант №1. Настройка времени хранения сообщений
Можно указать количество дней - сколько будут храниться проблемные сообщения в конфигурации внешней системы 1С в параметре liveTimeDefault:
Данный параметр определяет, как долго сообщения с определенными статусами будут храниться в системе перед автоматическим удалением.
Вариант №2. Создание функции 1С
Ниже представлен код, который используется для удаления записей из регистра сведений сшпОчередьИсходящихСообщений на основе определенного условия. В данном примере удаляются записи, которые имеют статус ОбработкаОтменена.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | сшпОчередьИсходящихСообщений.ИдентификаторСобытия КАК ИдентификаторСобытия |ИЗ | РегистрСведений.сшпОчередьИсходящихСообщений КАК сшпОчередьИсходящихСообщений | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.сшпПотокиОбработкиИсходящихСообщений КАК сшпПотокиОбработки | ПО сшпОчередьИсходящихСообщений.ИдентификаторСобытия = сшпПотокиОбработки.ИдентификаторСобытия |ГДЕ | сшпПотокиОбработки.Состояние = ЗНАЧЕНИЕ(Перечисление.сшпСтатусыСообщений.ОбработкаОтменена)"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // Работа с регистром сшпПотокиОбработкиИсходящихСообщений (МенеджерЗаписи) МЗ_Потоки = РегистрыСведений.сшпПотокиОбработкиИсходящихСообщений.СоздатьМенеджерЗаписи(); МЗ_Потоки.ИдентификаторСобытия = Выборка.ИдентификаторСобытия; МЗ_Потоки.Прочитать(); Если МЗ_Потоки.Выбран() Тогда МЗ_Потоки.Удалить(); КонецЕсли; // Работа с регистром сшпОчередьИсходящихСообщений (НаборЗаписей) НЗ_Очередь = РегистрыСведений.сшпОчередьИсходящихСообщений.СоздатьНаборЗаписей(); НЗ_Очередь.Отбор.ИдентификаторСобытия.Установить(Выборка.ИдентификаторСобытия); НЗ_Очередь.Прочитать(); Если НЗ_Очередь.Количество() > 0 Тогда НЗ_Очередь.Очистить(); НЗ_Очередь.Записать(); КонецЕсли; КонецЦикла;
Данный код можно использовать в обработчике с типом Функция 1С.
Описание кода
Этот запрос выбирает идентификаторы событий из регистра сведений сшпОчередьИсходящихСообщений, соединенного с регистром сведений сшпПотокиОбработкиИсходящихСообщений по полю ИдентификаторСобытия, при условии, что состояние события равно ОбработкаОтменена.
Выполняется запрос и получается выборка результатов.
В цикле обрабатывается каждая запись выборки: удаляется запись из двух регистров сведений (сшпПотокиОбработкиИсходящихСообщений и сшпОчередьИсходящихСообщений) по идентификатору события, полученному из выборки.
Рекомендации по использованию
Вариант №1 (liveTimeDefault). Рекомендуется для автоматического обслуживания системы без дополнительного вмешательства.
Вариант №2 (обработчик 1С). Предоставляет больше контроля над процессом очистки и может быть адаптирован под специфические требования.
Важно
- Перед выполнением массового удаления сообщений рекомендуется:
Создать резервную копию данных.
Протестировать обработчик на тестовой базе.
Убедиться в правильности условий отбора.