В процессе эксплуатации 1С:Зарплата и управление персоналом часто возникает необходимость автоматизировать уведомления сотрудников, например, о предстоящих отпусках. Однако разработчики нередко сталкиваются с ситуацией, когда созданная рассылка отчетов при ручном запуске работает безупречно, а при выполнении по расписанию через регламентное задание — дает сбои. При этом первое письмо в очереди уходит успешно, а все последующие блокируются с неясными ошибками в журнале Контроль рассылки отчетов.
В этой статье мы подробно проанализируем причины такого поведения системы, разберем влияние настроек почтовых сервисов на работу 1С и выясним, как программно обойти ограничения, мешающие стабильной доставке уведомлений.
Когда мы сталкиваемся с тем, что регламентное задание по рассылке выполняется частично, первым делом необходимо определить контекст ошибки. Разберем основные шаги диагностики:
1C:Enterprise Server. Убедимся, что у этого пользователя есть права на чтение и запись в папку временных файлов (обычно это C:\Windows\Temp или профиль службы). Если отчет сохраняется во временный файл перед отправкой, отсутствие прав приведет к ошибке.C:\Temp\\Report.pdf, проанализируем код формирования имени файла. Избыточный разделитель может возникать при некорректном использовании функции ПолучитьРазделительПути() или ручной склейке строк, что иногда сбивает файловую систему сервера.Одной из наиболее вероятных причин того, что уходит только одно письмо, являются антиспам-фильтры почтовых провайдеров. Разберем, как это работает на примере Mail.ru. Современные почтовые системы крайне подозрительно относятся к автоматизированным рассылкам, выполняемым через протокол SMTP с короткими интервалами между сообщениями.
Основные ограничения:
Как показывает практика, эффективным способом обхода "подозрительности" почтовых серверов является внедрение небольшой паузы между отправками. Рассмотрим, как это реализовать в коде обработки, которая подготавливает данные для рассылки.
Если мы используем цикл для формирования и отправки уведомлений, добавим в него принудительное ожидание. Проанализируем пример реализации задержки на 2 секунды:
Для Каждого Получатель Из СписокПолучателей Цикл
// Код формирования отчета и подготовки письма
Письмо = СформироватьПисьмоДляСотрудника(Получатель);
Попытка
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.НайтиПоНаименованию("Основная");
РаботаСПочтой.ОтправитьПисьмо(УчетнаяЗапись, Письмо);
// Внедряем паузу, чтобы сервер успел обработать запрос и не заблокировал нас
// В 1С 8.3 для этого можно использовать метод СистемнаяИнформация.Пауза (если доступно)
// или универсальный способ:
НачалоПаузы = ТекущаяДата();
Пока ТекущаяДата() < НачалоПаузы + 2 Цикл
// Ждем 2 секунды перед следующим витком цикла
КонецЦикла;
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Такой подход позволяет "размазать" нагрузку на SMTP-сервер и сделать рассылку похожей на действия обычного пользователя, что значительно снижает риск попадания в бан-лист.
Разберем ситуацию с ошибками сохранения файлов. В контексте фонового задания путь к временному файлу должен определяться функцией КаталогВременныхФайлов(). Однако стоит помнить, что на серверной стороне этот каталог отличается от клиентского.
Проанализируем типичную ошибку склейки пути:
// Неправильно:
Путь = "C:\Reports\" + "\\" + ИмяФайла; // Порождает двойной слеш
// Правильно:
Путь = ОбщегоНазначенияКлиентСервер.КомбинированныйПуть("C:\Reports", ИмяФайла);
Использование типовых функций 1С (БСП) для работы с путями гарантирует корректную работу кода как на Windows, так и на Linux серверах, предотвращая ошибки доступа к файлам при рассылке.
Важно помнить, что в 1С:ЗУП 3.1 существует мощный штатный механизм уведомлений. Рассмотрим, почему иногда стоит отказаться от кастомных доработок в пользу типового функционала:
Подводя итог, если ваша рассылка в ЗУП обрывается после первого сообщения, выполните следующие действия:
USR1CV8 к папкам, где формируются временные PDF-файлы.Соблюдение этих правил позволит сделать систему уведомлений в 1С надежной и обеспечит своевременное информирование сотрудников без ручного вмешательства программиста.