Как настроить рассылку расчетных листков в 1С:ЗУП 3.1 без блокировок почтового сервера и найти «потерянных» получателей?

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

Массовая рассылка расчетных листков из программы «1С:Зарплата и Управление Персоналом 3.1» — это удобный инструмент, который существенно экономит время бухгалтера. Однако при отправке большого объема писем (сотни или тысячи адресатов) пользователи часто сталкиваются с техническими сложностями: почтовые серверы начинают блокировать сессии, расценивая мгновенную отправку сотен писем как спам-атаку, а часть сотрудников и вовсе не получает свои листки без видимых причин.

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

Решение 1. Внедрение программной задержки (паузы) между отправками писем

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

Проанализируем структуру процедуры рассылки. В этом модуле за генерацию и отправку писем отвечает функция ВыполнитьРассылку. Именно внутри нее происходит обход сформированных пакетов отчетов и отправка их получателям.

Для реализации задержки выполним следующие шаги по модификации кода:

  1. Откроем общий модуль РассылкаОтчетов и найдем функцию ВыполнитьРассылку.
  2. Найдем блок кода, отвечающий за непосредственную отправку сформированного вложения получателю. Он выглядит следующим образом:

// Доставка.
Попытка
    ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель);
    РассылкаВыполнена = Истина;
    ПараметрыДоставки.ВыполненаПоЭлектроннойПочте = Истина;
Исключение
    ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Не удалось отправить отчеты получателю %1:'"), ИнформацияОбОшибке, "'"+ Строка(СтрокаПолучатель.Ключ) +"'");
КонецПопытки;
  1. Для того чтобы сервер успевал обрабатывать запросы и не блокировал отправку, добавим перед этим блоком или сразу после него цикл эмуляции задержки. Например, установим паузу в 5 или 10 секунд перед отправкой каждого следующего письма:

// Внедрение искусственной паузы (задержки) в секундах
ВремяОкончания = ТекущаяДата() + 10; // 10 — это количество секунд задержки
Пока ТекущаяДата() <= ВремяОкончания Цикл
    // Пустой цикл для ожидания
КонецЦикла;

// Далее следует стандартный блок отправки
Попытка
    ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель);
    ...

Важное предупреждение: Данный метод эмуляции задержки через пустой цикл Пока ... Цикл является «блокирующим» для процесса сервера «1С:Предприятие». Во время выполнения цикла поток процессора загружается вычислениями. Если у вас более 1000 получателей, суммарное время ожидания составит около 3 часов, что может привести к аварийному завершению фонового задания по таймауту. Используйте небольшие задержки (от 1 до 3 секунд) или применяйте этот метод только для средних объемов баз.

Решение 2. Разделение рассылки штатными средствами (без изменения кода)

Если вы не хотите вносить изменения в типовую конфигурацию, проблему лимитов почтового сервера можно решить организационно-настройкиными методами:

  1. Разбиение на несколько рассылок: Создайте несколько элементов в справочнике «Рассылки отчетов». Например, разделите сотрудников по подразделениям (Администрация, Цех 1, Цех 2 и т.д.).
  2. Настройка индивидуального расписания: Для каждой созданной рассылки настройте свое собственное расписание в регламентных заданиях с временным интервалом. Например, Администрация — отправка в 9:00, Цех 1 — в 9:30, Цех 2 — в 10:00. Это полностью снимет пиковую нагрузку с вашего почтового сервера.

Анализ проблемы: Почему некоторые физические лица не попадают в «ДеревоОтчетов»?

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

Для Каждого СтрокаПолучатель Из ДеревоОтчетов.Строки Цикл

количество элементов в коллекции ДеревоОтчетов.Строки оказывается меньше, чем количество получателей, изначально выбранных на форме настройки рассылки. Это означает, что система на этапе подготовки пакетов отсеяла часть людей. Рассмотрим основные причины, по которым это происходит:

  1. Пустые расчетные листки. По умолчанию в настройках рассылки (вкладка Дополнительно) снят флаг «Отправлять пустой». Если у сотрудника в выбранном периоде не было начислений (например, декретный отпуск, длительный отпуск за свой счет, увольнение в прошлом периоде), расчетный листок формируется пустым. Программа корректно принимает решение не отправлять пустой файл и исключает физлицо из дерева отправки.
  2. Отсутствие заполненного адреса Email. Проверьте карточку физического лица. Адрес электронной почты должен быть внесен строго в соответствующее поле контактной информации в разделе «Личные данные». Если адрес пустой или занесен в некорректное поле (например, записан текстом в комментариях), алгоритм БСП отсеет получателя еще на этапе компоновки дерева.
  3. Сбой сопоставления в регистре «Основные сотрудники физических лиц». Рассылка расчетных листков формируется в разрезе Физических лиц, тогда как сам отчет строится по справочнику Сотрудники. Для связи этих объектов программа обращается к регистру сведений Основные сотрудники физических лиц. Если база данных переносилась из других программ или велась некорректно, этот регистр может быть не заполнен для некоторых людей. В результате система не может сопоставить физлицо с его рабочим местом, отчет не формируется, и строка не попадает в итоговое дерево.
  4. Ошибки в настройках отборов. Перейдите на вкладку Отчеты в настройках рассылки. Проверьте строку отбора по полю «Сотрудник». В колонке «Значение» должно быть жестко указано специальное системное выражение [Получатель] (устанавливается по кнопке «Указать получателя рассылки»). Если там случайно выбран конкретный сотрудник, система будет формировать отчет только по нему, игнорируя остальных получателей.

Как программно найти «потерянных» сотрудников в процессе отладки?

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


// Сбор исходного списка получателей, настроенных в рассылке
МассивИсходныхПолучателей = Новый Массив;
Для Каждого СтрокаПараметров Из ПараметрыРассылки.Получатели Цикл
    МассивИсходныхПолучателей.Добавить(СтрокаПараметров.Получатель);
КонецЦикла;

// Сбор фактически сформированных получателей в Дереве Отчетов
МассивУспешныхПолучателей = Новый Массив;
Для Каждого СтрокаДерева Из ДеревоОтчетов.Строки Цикл
    МассивУспешныхПолучателей.Добавить(СтрокаДерева.Получатель);
КонецЦикла;

// Поиск расхождений
Для Каждого ИсходныйПолучатель Из МассивИсходныхПолучателей Цикл
    Если МассивУспешныхПолучателей.Найти(ИсходныйПолучатель) = Неопределено Тогда
        ЗаписьЖурналаРегистрации("РассылкаЛистков.Пропуск",
            УровеньЖурналаРегистрации.Предупреждение, , ,
            "Сотрудник " + Строка(ИсходныйПолучатель) + " исключен из отправки. Проверьте настройки email или наличие начислений.");
    КонецЕсли;
КонецЦикла;

Этот простой алгоритм запишет в Журнал регистрации подробный список всех «пропущенных» сотрудников, что позволит администратору или расчетчику быстро выявить и устранить проблему в данных (заполнить email или проверить расчетную базу).

Рекомендации по настройке почтовой инфраструктуры

Помимо доработок внутри 1С, стабильность массовой рассылки сильно зависит от настроек самого почтового домена вашей организации. Если письма отправляются, но не доходят до адресатов (особенно на внешние личные адреса вроде Mail.ru, Yandex.ru, Gmail.com), системному администратору необходимо выполнить следующие действия:

← На главную