Очистка очереди исходящих сообщений

Иногда возникает ситуация, что при отправке сообщений из 1С в Платформу на уровне обработчика происходит фильтрация сообщений и назначение им соответствующих статусов, например, Обработка отменена. Сообщения с данным статусом накапливаются в очереди исходящих сообщений и забивают ее. Чтобы очистить очередь есть два варианта.

Вариант №1. Настройка времени хранения сообщений

Можно указать количество дней - сколько будут храниться проблемные сообщения в конфигурации внешней системы 1С в параметре liveTimeDefault:

../../_images/image47.png

Данный параметр определяет, как долго сообщения с определенными статусами будут храниться в системе перед автоматическим удалением.

Вариант №2. Создание функции 1С

Ниже представлен код, который используется для удаления записей из регистра сведений сшпОчередьИсходящихСообщений на основе определенного условия. В данном примере удаляются записи, которые имеют статус ОбработкаОтменена.

Запрос = Новый Запрос;
Запрос.Текст =
        "ВЫБРАТЬ
        |   сшпОчередьИсходящихСообщений.ИдентификаторСобытия КАК ИдентификаторСобытия
        |ИЗ
        |   РегистрСведений.сшпОчередьИсходящихСообщений КАК сшпОчередьИсходящихСообщений
        |   ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.сшпПотокиОбработкиИсходящихСообщений КАК сшпПотокиОбработки
        |   ПО сшпОчередьИсходящихСообщений.ИдентификаторСобытия = сшпПотокиОбработки.ИдентификаторСобытия
        |ГДЕ
        |   сшпПотокиОбработки.Состояние = ЗНАЧЕНИЕ(Перечисление.сшпСтатусыСообщений.ОбработкаОтменена)";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
        // Работа с регистром сшпПотокиОбработкиИсходящихСообщений (МенеджерЗаписи)
        МЗ_Потоки = РегистрыСведений.сшпПотокиОбработкиИсходящихСообщений.СоздатьМенеджерЗаписи();
        МЗ_Потоки.ИдентификаторСобытия = Выборка.ИдентификаторСобытия;
        МЗ_Потоки.Прочитать();
        Если МЗ_Потоки.Выбран() Тогда
                МЗ_Потоки.Удалить();
        КонецЕсли;

        // Работа с регистром сшпОчередьИсходящихСообщений (НаборЗаписей)
        НЗ_Очередь = РегистрыСведений.сшпОчередьИсходящихСообщений.СоздатьНаборЗаписей();
        НЗ_Очередь.Отбор.ИдентификаторСобытия.Установить(Выборка.ИдентификаторСобытия);
        НЗ_Очередь.Прочитать();
        Если НЗ_Очередь.Количество() > 0 Тогда
                НЗ_Очередь.Очистить();
                НЗ_Очередь.Записать();
        КонецЕсли;
КонецЦикла;

Данный код можно использовать в обработчике с типом Функция 1С.

Описание кода

  • Этот запрос выбирает идентификаторы событий из регистра сведений сшпОчередьИсходящихСообщений, соединенного с регистром сведений сшпПотокиОбработкиИсходящихСообщений по полю ИдентификаторСобытия, при условии, что состояние события равно ОбработкаОтменена.

  • Выполняется запрос и получается выборка результатов.

  • В цикле обрабатывается каждая запись выборки: удаляется запись из двух регистров сведений (сшпПотокиОбработкиИсходящихСообщений и сшпОчередьИсходящихСообщений) по идентификатору события, полученному из выборки.

Рекомендации по использованию

Вариант №1 (liveTimeDefault). Рекомендуется для автоматического обслуживания системы без дополнительного вмешательства.

Вариант №2 (обработчик 1С). Предоставляет больше контроля над процессом очистки и может быть адаптирован под специфические требования.

Важно

Перед выполнением массового удаления сообщений рекомендуется:
  • Создать резервную копию данных.

  • Протестировать обработчик на тестовой базе.

  • Убедиться в правильности условий отбора.