Стальной Глеб | Руководитель офиса БИТ:ERP | Первый БИТ

«Как запустить 1С:ERP 2 на тысячу пользователей и не написать ни одной страницы ТЗ?»

В рамках доклада расскажу о процессе и результатах перехода 3 scrum-команд на использование современных инженерных практик (разработка через поведение, ночные сборки, непрерывный анализ качества кода) на проектах 1С. - Почему мы всегда готовим EPC-диаграммы, и как они помогают нам проектировать не только систему, но и все интеграции (да, мы на проектах, как правило, используем RabbitMQ); - Как мы разрабатываем фичи (BDD), как структурируем, чтобы сохранить читаемость на больших проектах (когда BDD-сценарии занимают 10 тысяч строк) и как мы смогли отказаться от постановок задач в других форматах (кроме задач по обмену, там xsd); - Зачем гит консультанту; Рассмотрю полный цикл работ на примерах конкретных проектов. Также покажу какие инструменты и как мы используем (Slack, Zoom, Jira, Confluence, JSD, Bitbucket, Vanessa Behavior, Jenkins, SonarQube, Allure и т.п.)

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

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

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

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

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

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

Показать


Как работает механизм повторной отправки? Что нужно добавить??
Ответы
Сортировка: Древо
2. user627612_petroa 10.07.18 09:27 Сейчас в теме
Может записывать неудачно отправленные в регистр, а потом с помощью рег.задания неудачно отправленные по новой пытаться отправить?
3. Johney20 10.07.18 09:31 Сейчас в теме
(2) Не совсем подходит. Это нужно создавать новый регистр, новое РЗ, слишком много согласований получится для создания новых объектов. Должен быть способ попроще..
4. MamatovIA 10.07.18 09:37 Сейчас в теме
А если сделать так?
Пока Истина цикл
Попытка
        Результат = Почта.Послать(Сообщение);
    Исключение
        Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
        Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
        Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
        Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
        Продолжить;
    КонецПопытки;
Прервать;
КонецЦикла;
Показать
5. Johney20 10.07.18 09:42 Сейчас в теме
(4) Мм.. Оператор "Прервать" выйдет из цикла после удачной отправки?? Не зациклится?
6. MamatovIA 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 256 10.07.18 09:54 Сейчас в теме
Я бы просто сделал это фоновым заданием, в нем тупо падал по исключению (т.е. просто пытался отправить без всяких Попытка/исключение), для фонового бы настроил штатные повторы при сбоях. Но лог отправок и ошибок при отправке все равно какой-то отдельный нужен. Можно просто в текстовый файлик писать. Потом его можно анализировать автоматически и выдавать нужным людям предупреждения в 1С, что почта или системные рассылки отвалились.
9. herfis 256 10.07.18 10:03 Сейчас в теме
Хотя, если в лог писать, то "Попытка" таки нужна.
Тогда так:
Попытка
        Результат = Почта.Послать(Сообщение);
        // запись в лог об успешной отправке
        ........
Исключение
        // запись в лог об ошибке отправки
        ........
        ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
Показать
10. necropunk 5 10.07.18 10:07 Сейчас в теме
Я делаю переменную выхода, а сам цикл Пока Сч = 1 По 5.
То есть, если отправилось - ок. Если не отправилось - пять попыток, потом хорош, значит проблема глобальная, долбиться смысла нет.
11. Johney20 10.07.18 10:28 Сейчас в теме
(10) Вот, это логично! Спасибо!
13. herfis 256 10.07.18 10:57 Сейчас в теме
А в фоновом задании даже кодить не надо - там количество повторов при сбоях параметрически настраивается :)
14. user633533_encantado 2 10.07.18 11:15 Сейчас в теме
Суть в том, что метод Послать() не всегда даст исключение, если не удалось послать почту.
После какой-то версии платформы он стал возвращать соответствие с результатом отправки. Вот его и надо анализировать.
15. herfis 256 10.07.18 11:29 Сейчас в теме
(14) Таки да. С 8.3.9
У меня до сих пор 8.3.6 :)
16. kadild 12.07.18 10:53 Сейчас в теме
Ну так оберните весь ваш код в функцию в возвратом параметра удачной отправки и вызывайте его пока не останетесь довольны. В чем проблема-то?
Оставьте свое сообщение
Все разделы

Вакансии


Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

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

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

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