Массовая рассылка расчетных листков из программы «1С:Зарплата и Управление Персоналом 3.1» — это удобный инструмент, который существенно экономит время бухгалтера. Однако при отправке большого объема писем (сотни или тысячи адресатов) пользователи часто сталкиваются с техническими сложностями: почтовые серверы начинают блокировать сессии, расценивая мгновенную отправку сотен писем как спам-атаку, а часть сотрудников и вовсе не получает свои листки без видимых причин.
В этой статье мы подробно разберем, как решить проблему с лимитами почтовых серверов программным путем, рассмотрим штатные альтернативы разделения писем, а также выясним причины, по которым некоторые сотрудники загадочным образом исчезают из очереди отправки.
Если ваш почтовый сервер накладывает жесткие ограничения на количество транзакций в единицу времени, самым надежным решением будет внедрение искусственной паузы непосредственно в цикл отправки писем. Вся логика рассылки в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) сосредоточена в общем модуле РассылкаОтчетов.
Проанализируем структуру процедуры рассылки. В этом модуле за генерацию и отправку писем отвечает функция ВыполнитьРассылку. Именно внутри нее происходит обход сформированных пакетов отчетов и отправка их получателям.
Для реализации задержки выполним следующие шаги по модификации кода:
РассылкаОтчетов и найдем функцию ВыполнитьРассылку.
// Доставка.
Попытка
ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель);
РассылкаВыполнена = Истина;
ПараметрыДоставки.ВыполненаПоЭлектроннойПочте = Истина;
Исключение
ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Не удалось отправить отчеты получателю %1:'"), ИнформацияОбОшибке, "'"+ Строка(СтрокаПолучатель.Ключ) +"'");
КонецПопытки;
// Внедрение искусственной паузы (задержки) в секундах
ВремяОкончания = ТекущаяДата() + 10; // 10 — это количество секунд задержки
Пока ТекущаяДата() <= ВремяОкончания Цикл
// Пустой цикл для ожидания
КонецЦикла;
// Далее следует стандартный блок отправки
Попытка
ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель);
...
Важное предупреждение: Данный метод эмуляции задержки через пустой цикл Пока ... Цикл является «блокирующим» для процесса сервера «1С:Предприятие». Во время выполнения цикла поток процессора загружается вычислениями. Если у вас более 1000 получателей, суммарное время ожидания составит около 3 часов, что может привести к аварийному завершению фонового задания по таймауту. Используйте небольшие задержки (от 1 до 3 секунд) или применяйте этот метод только для средних объемов баз.
Если вы не хотите вносить изменения в типовую конфигурацию, проблему лимитов почтового сервера можно решить организационно-настройкиными методами:
Бывают ситуации, когда даже после настройки задержки часть писем все равно не доходит. При детальном анализе в отладчике выясняется, что в функции ВыполнитьРассылку при обходе дерева получателей:
Для Каждого СтрокаПолучатель Из ДеревоОтчетов.Строки Цикл
количество элементов в коллекции ДеревоОтчетов.Строки оказывается меньше, чем количество получателей, изначально выбранных на форме настройки рассылки. Это означает, что система на этапе подготовки пакетов отсеяла часть людей. Рассмотрим основные причины, по которым это происходит:
Основные сотрудники физических лиц. Если база данных переносилась из других программ или велась некорректно, этот регистр может быть не заполнен для некоторых людей. В результате система не может сопоставить физлицо с его рабочим местом, отчет не формируется, и строка не попадает в итоговое дерево.[Получатель] (устанавливается по кнопке «Указать получателя рассылки»). Если там случайно выбран конкретный сотрудник, система будет формировать отчет только по нему, игнорируя остальных получателей.Чтобы быстро выявить, какие именно физические лица были отсеяны системой на этапе подготовки отчетов, мы можем дописать небольшой отладочный код. Разместим его в общем модуле РассылкаОтчетов непосредственно перед циклом отправки писем:
// Сбор исходного списка получателей, настроенных в рассылке
МассивИсходныхПолучателей = Новый Массив;
Для Каждого СтрокаПараметров Из ПараметрыРассылки.Получатели Цикл
МассивИсходныхПолучателей.Добавить(СтрокаПараметров.Получатель);
КонецЦикла;
// Сбор фактически сформированных получателей в Дереве Отчетов
МассивУспешныхПолучателей = Новый Массив;
Для Каждого СтрокаДерева Из ДеревоОтчетов.Строки Цикл
МассивУспешныхПолучателей.Добавить(СтрокаДерева.Получатель);
КонецЦикла;
// Поиск расхождений
Для Каждого ИсходныйПолучатель Из МассивИсходныхПолучателей Цикл
Если МассивУспешныхПолучателей.Найти(ИсходныйПолучатель) = Неопределено Тогда
ЗаписьЖурналаРегистрации("РассылкаЛистков.Пропуск",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Сотрудник " + Строка(ИсходныйПолучатель) + " исключен из отправки. Проверьте настройки email или наличие начислений.");
КонецЕсли;
КонецЦикла;
Этот простой алгоритм запишет в Журнал регистрации подробный список всех «пропущенных» сотрудников, что позволит администратору или расчетчику быстро выявить и устранить проблему в данных (заполнить email или проверить расчетную базу).
Помимо доработок внутри 1С, стабильность массовой рассылки сильно зависит от настроек самого почтового домена вашей организации. Если письма отправляются, но не доходят до адресатов (особенно на внешние личные адреса вроде Mail.ru, Yandex.ru, Gmail.com), системному администратору необходимо выполнить следующие действия: