Часто при работе с типовыми конфигурациями (например, 1С:Управление торговлей 11) возникает неприятная ситуация: требуется настроить автоматическую рассылку внешнего отчета клиентам по расписанию. Вы настраиваете расписание, добавляете отчет, но в назначенное время ничего не происходит. При этом, если зайти в справочник рассылок и нажать кнопку выполнения вручную (команду "Выполнить сейчас"), письма успешно уходят. Проанализируем эту ситуацию и разберем по шагам, как правильно подготовить внешний отчет для подсистемы рассылок БСП (Библиотеки стандартных подсистем).
Чтобы понять причину проблемы, рассмотрим архитектурную разницу между запуском отчета пользователем и запуском по расписанию.
Когда вы нажимаете кнопку выполнения вручную, рассылка формируется в вашем текущем клиентском сеансе. Система может открыть интерфейс, сформировать отчет в табличный документ и отправить его. Однако расписание в 1С реализовано через регламентные задания, которые выполняются в фоне на сервере. На сервере полностью отсутствует пользовательский интерфейс. Любая попытка системы обратиться к клиентским формам, диалоговым окнам или интерактивным процедурам при фоновом выполнении вызывает скрытую ошибку, и процесс рассылки прерывается.
Как было выяснено в ходе обсуждения проблемы, частой ошибкой является регистрация внешнего отчета с командой запуска ОткрытиеФормы. Именно это не позволяет регламентному заданию выполнить рассылку.
Откроем модуль объекта нашего внешнего отчета в Конфигураторе. Найдем экспортную функцию СведенияОВнешнейОбработке(). Для того чтобы отчет мог формироваться на сервере без открытия окон, команда запуска должна быть изменена на ВызовСерверногоМетода.
Посмотрим на пример правильной регистрации внешнего отчета:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Обратите внимание на этот параметр
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Сформировать отчет для рассылки";
Команда.Идентификатор = "РассылкаОтчета";
// Указываем правильный тип команды для работы в фоне:
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Вторая критически важная деталь, без которой подсистема рассылок не сможет работать с внешним отчетом — это свойство отчета Хранилище вариантов отчета.
Подсистема рассылок в 1С оперирует не просто отчетами, а их сохраненными вариантами (настройками СКД). Если у внешнего отчета не указано хранилище, фоновое задание не сможет получить нужные настройки компоновки данных. Разберем, как это исправить:
ХранилищеВариантовОтчетов (в разделе "Представление" или "Основные").ХранилищеВариантовОтчетов.Также важно помнить, что отчет для корректной работы с рассылками должен быть построен исключительно с использованием Системы Компоновки Данных (СКД).
Рассмотрим еще одну частую причину сбоев — безопасный режим. При добавлении внешнего отчета в базу через справочник "Дополнительные отчеты и обработки", система по умолчанию запускает его в безопасном режиме. Это защитный механизм платформы 1С.
Если ваш отчет обращается к внешним источникам данных, использует COM-объекты, читает или записывает файлы на диск сервера, безопасный режим заблокирует эти действия при выполнении фонового задания. При ручном запуске под правами администратора этот режим иногда обходится, что и создает иллюзию работоспособности. Выясним причину в коде: если отчет требует расширенных прав, установите свойство БезопасныйРежим в значение Ложь в функции СведенияОВнешнейОбработке() (как показано в примере кода выше), а также снимите галочку безопасного режима в самой карточке внешнего отчета в режиме Предприятия (если таковая имеется).
Проанализируем работу с электронной почтой. При ручном старте рассылки платформа может использовать персональную учетную запись почты того пользователя, который нажал кнопку. Но регламентное задание выполняется системным пользователем (или пользователем, указанным в настройках регламентного задания).
Если вы выполнили все вышеописанные шаги, но рассылка всё равно не работает, не стоит гадать. Посмотрим, как точно определить причину сбоя.
Откройте ЖурналРегистрации (обычно находится в разделе "Администрирование" -> "Обслуживание"). Установите отбор по времени, когда должна была сработать рассылка по расписанию. Отфильтруйте события по уровню "Ошибки". В деталях ошибки для фонового задания платформа прямым текстом укажет причину: например, "Интерактивные операции недоступны на сервере" (если остался вызов форм) или ошибку авторизации на почтовом SMTP-сервере. Это позволит точечно устранить оставшиеся недочеты.