При автоматизации почтовых рассылок из 1С часто возникает ситуация, когда вместо одного письма с консолидированной информацией пользователю приходят десятки отдельных сообщений. Это происходит из-за некорректной организации цикла обработки данных. Давайте разберем, как правильно перестроить архитектуру такой обработки, чтобы отправлять одно структурированное письмо каждому адресату.
В большинстве случаев проблема кроется в том, что функция отправки сообщения вызывается внутри цикла, который перебирает найденные документы. Если система находит 10 просроченных заявок у одного менеджера, алгоритм выполняет отправку 10 раз. Чтобы решить эту задачу, нам необходимо разделить процесс на три логических этапа: сбор данных, группировка и финальная отправка.
Прежде чем приступать к отправке, мы должны собрать все необходимые номера заявок. Вместо того чтобы сразу отправлять письмо, мы сначала сформируем массив или список. Полезным инструментом здесь выступает метод СтрСоединить, который позволяет объединить массив значений в одну строку через нужный разделитель.
Если вам нужно убрать лидирующие нули в номерах документов (например, превратить \"000000001\" в \"1\"), воспользуйтесь предварительной обработкой массива:
НомераЗаявокМассив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Номер");
Для Каждого НомерЗаявки Из НомераЗаявокМассив Цикл
НомерЗаявки = НомерБезЛидирующихНулей(НомерЗаявки);
КонецЦикла;
НомераЗаявокСтрока = СтрСоединить(НомераЗаявокМассив, ", ");
Чтобы избежать дублей, вынесите функцию ОтправитьПочтовоеСообщение за пределы цикла перебора заявок. Вместо отправки в цикле, используйте структуру данных Соответствие, где ключом будет выступать получатель (сотрудник), а значением — структура или массив с текстом его заявок.
Алгоритм действий должен выглядеть следующим образом:
Соответствие для группировки данных по сотрудникам.При формировании текста письма в формате HTML важно следить за тем, чтобы все строки добавлялись к общему телу письма до того, как будет вызвана процедура отправки. Использование Символы.ПС поможет корректно переносить строки в HTML-структуре.
Давайте посмотрим на пример оптимизированного подхода к сбору заявок:
// Оптимизированный сбор заявок для одного сотрудника
ТекстСписка = "";
Счетчик = 1;
Для Каждого СтрТЧ Из ДокументыДляРассылки Цикл
Если СтрТЧ.Сотрудник = НужныйСотрудник Тогда
ТекстСписка = ТекстСписка + Строка(Счетчик) + ". " + СтрТЧ.Номер + " от " + Формат(СтрТЧ.Дата, "ДФ=dd.MM.yyyy") + "<br>";
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Используйте шаблоны: Вместо конкатенации строк (склеивания через +), что часто приводит к ошибкам, используйте СтрШаблон или макеты в формате ТекстовыйДокумент. Это сделает код чище и позволит легко изменять дизайн письма в будущем.
Разделение ответственности: Помните, что одна функция должна отвечать за сбор данных, другая — за верстку письма, и третья — исключительно за взаимодействие с почтовым сервером (РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение). Такой подход позволяет быстро находить ошибки и упрощает отладку кода.
Следуя этим шагам, вы сможете реализовать рассылку, которая будет работать быстро и корректно, отправляя ровно одно письмо каждому сотруднику, вне зависимости от количества просроченных у него заявок.