Доставить сообщения. Выполняет немедленную отправку быстрых сообщений из общей очереди сообщений.
// Выполняет немедленную отправку быстрых сообщений из общей очереди сообщений.
// Отправка сообщений выполняется в цикле до тех пор, пока из очереди сообщений не будут отправлены все быстрые
// сообщения.
// На время отправки сообщений блокируется немедленная отправка сообщений из других сеансов.
//
Процедура ДоставитьСообщения() Экспорт
Если ТранзакцияАктивна() Тогда
ВызватьИсключение НСтр("ru = 'Доставка быстрых сообщений системы не может выполняться в активной транзакции.'");
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Если Не НачатьОтправкуБыстрыхСообщений() Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = "";
СправочникиСообщений = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений();
Для Каждого СправочникСообщений Из СправочникиСообщений Цикл
ЭтоПервыйФрагмент = ПустаяСтрока(ТекстЗапроса);
Если Не ЭтоПервыйФрагмент Тогда
ТекстЗапроса = ТекстЗапроса + "
|
|ОБЪЕДИНИТЬ ВСЕ
|"
КонецЕсли;
ТекстЗапроса = ТекстЗапроса
+ "ВЫБРАТЬ
| ТаблицаИзменений.Узел КАК КонечнаяТочка,
| ТаблицаИзменений.Ссылка КАК Сообщение
|[ПОМЕСТИТЬ]
|ИЗ
| [СправочникСообщений].Изменения КАК ТаблицаИзменений
|ГДЕ
| ТаблицаИзменений.Ссылка.ЭтоБыстроеСообщение
| И ТаблицаИзменений.НомерСообщения ЕСТЬ NULL
| И НЕ ТаблицаИзменений.Узел В (&НедоступныеКонечныеТочки)";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СправочникСообщений]", СправочникСообщений.ПустаяСсылка().Метаданные().ПолноеИмя());
Если ЭтоПервыйФрагмент Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПОМЕСТИТЬ]", "ПОМЕСТИТЬ ВТ_Изменения");
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПОМЕСТИТЬ]", "");
КонецЕсли;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + "
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Изменения.КонечнаяТочка КАК КонечнаяТочка,
| ВТ_Изменения.Сообщение
|ИЗ
| ВТ_Изменения КАК ВТ_Изменения
|
|УПОРЯДОЧИТЬ ПО
| ВТ_Изменения.Сообщение.Код
|ИТОГИ ПО
| КонечнаяТочка";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
НедоступныеКонечныеТочки = Новый Массив;
Попытка
Пока Истина Цикл
Запрос.УстановитьПараметр("НедоступныеКонечныеТочки", НедоступныеКонечныеТочки);
РезультатЗапроса = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос);
Если РезультатЗапроса.Пустой() Тогда
Прервать;
КонецЕсли;
Группы = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Для Каждого Группа Из Группы.Строки Цикл
Сообщения = Группа.Строки.ВыгрузитьКолонку("Сообщение");
Попытка
ДоставитьСообщенияПолучателю(Группа.КонечнаяТочка, Сообщения);
УдалитьРегистрациюИзменений(Группа.КонечнаяТочка, Сообщения);
Исключение
НедоступныеКонечныеТочки.Добавить(Группа.КонечнаяТочка);
ЗаписьЖурналаРегистрации(ОбменСообщениямиВнутренний.СобытиеЖурналаРегистрацииЭтойПодсистемы(),
УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецЦикла;
Исключение
ОтменитьОтправкуБыстрыхСообщений();
ВызватьИсключение;
КонецПопытки;
ЗавершитьОтправкуБыстрыхСообщений();
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)