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