Повтор отправки сообщений при ошибке.

1. Johney20 10.07.18 09:15 Сейчас в теме
Добрый день!

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

Необходимо при ошибке отправки сообщения, повторять отправку, пока сообщение не отправится.

Отправка помещена в попытку, конечно.

Попытка
		Результат = Почта.Послать(Сообщение);
	Исключение
		Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
		Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
		Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
		Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
	КонецПопытки;

Показать


Как работает механизм повторной отправки? Что нужно добавить??
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. SagittariusA 10.07.18 09:27 Сейчас в теме
Может записывать неудачно отправленные в регистр, а потом с помощью рег.задания неудачно отправленные по новой пытаться отправить?
3. Johney20 10.07.18 09:31 Сейчас в теме
(2) Не совсем подходит. Это нужно создавать новый регистр, новое РЗ, слишком много согласований получится для создания новых объектов. Должен быть способ попроще..
4. Ildar13 10.07.18 09:37 Сейчас в теме
А если сделать так?
Пока Истина цикл
Попытка
        Результат = Почта.Послать(Сообщение);
    Исключение
        Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
        Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
        Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
        Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
        Продолжить;
    КонецПопытки;
Прервать;
КонецЦикла;
Показать
5. Johney20 10.07.18 09:42 Сейчас в теме
(4) Мм.. Оператор "Прервать" выйдет из цикла после удачной отправки?? Не зациклится?
6. Ildar13 10.07.18 09:44 Сейчас в теме
(5)Да, должен выйти.
Если сообщение отправится, то блок Исключение не сработает. Следующий оператор будет Прервать.
12. Johney20 10.07.18 10:29 Сейчас в теме
(6) Да, это пойдет, если только добавить счетчик. А то в случае, например, если упадет почтовый сервер, то отправка сообщений просто зациклится бесконечно и все.
7. qazaas 10.07.18 09:49 Сейчас в теме
(5) Хм...
Если вас предложенный метод устраивает, но вы опасаетесь за вечный цикл, тогда сделайте с меткой, типа так:

~ОтправкаСообщения:
Попытка
        Результат = Почта.Послать(Сообщение);
    Исключение
        Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
        Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
        Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
        Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
Перейти ~ОтправкаСообщения;
    КонецПопытки;
Показать


Что-то типа такого...
8. herfis 498 10.07.18 09:54 Сейчас в теме
Я бы просто сделал это фоновым заданием, в нем тупо падал по исключению (т.е. просто пытался отправить без всяких Попытка/исключение), для фонового бы настроил штатные повторы при сбоях. Но лог отправок и ошибок при отправке все равно какой-то отдельный нужен. Можно просто в текстовый файлик писать. Потом его можно анализировать автоматически и выдавать нужным людям предупреждения в 1С, что почта или системные рассылки отвалились.
9. herfis 498 10.07.18 10:03 Сейчас в теме
Хотя, если в лог писать, то "Попытка" таки нужна.
Тогда так:
Попытка
        Результат = Почта.Послать(Сообщение);
        // запись в лог об успешной отправке
        ........
Исключение
        // запись в лог об ошибке отправки
        ........
        ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
Показать
10. necropunk 9 10.07.18 10:07 Сейчас в теме
Я делаю переменную выхода, а сам цикл Пока Сч = 1 По 5.
То есть, если отправилось - ок. Если не отправилось - пять попыток, потом хорош, значит проблема глобальная, долбиться смысла нет.
11. Johney20 10.07.18 10:28 Сейчас в теме
(10) Вот, это логично! Спасибо!
13. herfis 498 10.07.18 10:57 Сейчас в теме
А в фоновом задании даже кодить не надо - там количество повторов при сбоях параметрически настраивается :)
14. user633533_encantado 11 10.07.18 11:15 Сейчас в теме
Суть в том, что метод Послать() не всегда даст исключение, если не удалось послать почту.
После какой-то версии платформы он стал возвращать соответствие с результатом отправки. Вот его и надо анализировать.
15. herfis 498 10.07.18 11:29 Сейчас в теме
(14) Таки да. С 8.3.9
У меня до сих пор 8.3.6 :)
16. kild 89 12.07.18 10:53 Сейчас в теме
Ну так оберните весь ваш код в функцию в возвратом параметра удачной отправки и вызывайте его пока не останетесь довольны. В чем проблема-то?
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)