Как исправить дублирование писем при автоматической рассылке по просроченным заявкам в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему отправляется много писем?

В большинстве случаев проблема кроется в том, что функция отправки сообщения вызывается внутри цикла, который перебирает найденные документы. Если система находит 10 просроченных заявок у одного менеджера, алгоритм выполняет отправку 10 раз. Чтобы решить эту задачу, нам необходимо разделить процесс на три логических этапа: сбор данных, группировка и финальная отправка.

Шаг 1: Получение и обработка данных

Прежде чем приступать к отправке, мы должны собрать все необходимые номера заявок. Вместо того чтобы сразу отправлять письмо, мы сначала сформируем массив или список. Полезным инструментом здесь выступает метод СтрСоединить, который позволяет объединить массив значений в одну строку через нужный разделитель.

Если вам нужно убрать лидирующие нули в номерах документов (например, превратить \"000000001\" в \"1\"), воспользуйтесь предварительной обработкой массива:


НомераЗаявокМассив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Номер");
Для Каждого НомерЗаявки Из НомераЗаявокМассив Цикл
    НомерЗаявки = НомерБезЛидирующихНулей(НомерЗаявки);
КонецЦикла;
НомераЗаявокСтрока = СтрСоединить(НомераЗаявокМассив, ", ");

Шаг 2: Правильная архитектура цикла

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

Алгоритм действий должен выглядеть следующим образом:

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

Шаг 3: Формирование HTML-писем

При формировании текста письма в формате HTML важно следить за тем, чтобы все строки добавлялись к общему телу письма до того, как будет вызвана процедура отправки. Использование Символы.ПС поможет корректно переносить строки в HTML-структуре.

Давайте посмотрим на пример оптимизированного подхода к сбору заявок:


// Оптимизированный сбор заявок для одного сотрудника
ТекстСписка = "";
Счетчик = 1;
Для Каждого СтрТЧ Из ДокументыДляРассылки Цикл
    Если СтрТЧ.Сотрудник = НужныйСотрудник Тогда
        ТекстСписка = ТекстСписка + Строка(Счетчик) + ". " + СтрТЧ.Номер + " от " + Формат(СтрТЧ.Дата, "ДФ=dd.MM.yyyy") + "<br>";
        Счетчик = Счетчик + 1;
    КонецЕсли;
КонецЦикла;

Рекомендации по реализации

Используйте шаблоны: Вместо конкатенации строк (склеивания через +), что часто приводит к ошибкам, используйте СтрШаблон или макеты в формате ТекстовыйДокумент. Это сделает код чище и позволит легко изменять дизайн письма в будущем.

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

Следуя этим шагам, вы сможете реализовать рассылку, которая будет работать быстро и корректно, отправляя ровно одно письмо каждому сотруднику, вне зависимости от количества просроченных у него заявок.

← На главную