Как настроить автоматическую отправку писем по расписанию из внешней обработки 1С?

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

Разберем типичную и крайне востребованную задачу по автоматизации рутинных процессов в среде 1С:Предприятие. Часто у пользователей возникает необходимость отправлять отчетность, уведомления или напоминания сотрудникам по определенному графику — например, каждую пятницу в 08:00. В исходном сообщении темы автор описал рабочую внешнюю обработку, которая умеет ставить письма в очередь на отправку с помощью процедуры РаботаСПочтой.ПоставитьПисьмоВОчередьНаОтправку. Однако запуск этой процедуры сейчас привязан к кнопке на управляемой форме и требует ручного нажатия.

Наша цель — сделать так, чтобы рассылка происходила полностью автоматически. Для решения этой задачи в платформе 1С существует мощный механизм — РегламентныеЗадания. Они работают в фоновом режиме на стороне сервера и запускаются по заранее настроенному расписанию. Выясним, как связать внешнюю обработку с механизмом регламентных заданий.

Мы подробно рассмотрим два наиболее эффективных способа решения этой задачи:

  1. Через механизм БСП (Библиотеки Стандартных Подсистем) — самый современный, гибкий и безопасный способ, не требующий изменения конфигурации.
  2. Создание регламентного задания в Конфигураторе — классический способ, подходящий для самописных или старых конфигураций.

Способ 1. Интеграция внешней обработки с механизмом БСП «Дополнительные отчеты и обработки»

Если вы работаете в любой современной типовой конфигурации (например, 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей, 1С:Бухгалтерия или 1С:ЗУП), в вашу систему уже встроена Библиотека Стандартных Подсистем (БСП). Она позволяет загружать внешние обработки прямо в режиме «1С:Предприятие» и настраивать для них расписание запуска без изменения самой конфигурации.

Чтобы система распознала внешнюю обработку и позволила запускать её по расписанию, нам необходимо доработать её программный код. Вся логика интерактивной формы (кнопки, клиентские процедуры) должна быть перенесена в Модуль объекта внешней обработки, так как фоновые задания выполняются на сервере без создания оконного интерфейса.

Выполним пошаговую модернизацию кода внешней обработки. Откроем обработку в конфигураторе, перейдем в её модуль объекта и добавим туда следующие процедуры:


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

// Стандартный метод БСП, который автоматически вызывается при срабатывании расписания
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    Если ИдентификаторКоманды = "ОтправитьНапоминанияПоРасписанию" Тогда
        ОтправкаНапоминаний();
    КонецЕсли;
КонецПроцедуры

// Основной алгоритм рассылки писем, перенесенный из модуля формы
Процедура ОтправкаНапоминаний() Экспорт
    Получатели = Справочники.Параметры.НайтиПоНаименованию("ПолучателиПланаПроизводства").Строка;
    ТемаПисьма = "НАПОМИНАНИЕ! Сумма плана производства";
    ТекстПисьма = "В течение 3 часов необходимо предоставить Кузнецовой ВМ актуальную информацию по сумме плана производства на ближайшие 4 месяца для формирования отчета ""Загрузка производства СЭТЗ"".";
    РаботаСПочтой.ПоставитьПисьмоВОчередьНаОтправку(Получатели, ТемаПисьма, ТекстПисьма);    
КонецПроцедуры

Проанализируем ключевые моменты этого кода. Функция СведенияОВнешнейОбработке() сообщает БСП, что данная обработка регистрируется как ДополнительнаяОбработка и предоставляет одну команду с идентификатором ОтправитьНапоминанияПоРасписанию. Тип использования ВызовСерверногоМетода критически важен — именно он указывает системе, что команда должна запускаться на сервере без открытия окон и участия пользователя.

Теперь настроим расписание в режиме «1С:Предприятие»:

  1. Перейдем в меню НСИ и администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  2. Нажмем кнопку Добавить из файла и выберем наш подготовленный файл внешней обработки .epf. При появлении предупреждения безопасности подтвердим доверие к источнику.
  3. В открывшейся карточке система автоматически заполнит поля. Обратим внимание на табличную часть «Команды».
  4. В колонке Расписание нажмем на ссылку «Не установлено».
  5. В открывшемся окне настройки расписания перейдем на вкладку Недельное и отметим галочкой день недели Пятница.
  6. На вкладке Дневное в поле «Время начала» укажем 08:00:00.
  7. Нажмем кнопку ОК, укажем раздел размещения для удобства (например, «Администрирование») и нажмем Записать и закрыть.

Поздравляем! Система автоматически создала внутреннее регламентное задание БСП, которое теперь каждую пятницу в 08:00 будет активировать метод ВыполнитьКоманду() нашей обработки.


Способ 2. Создание встроенного регламентного задания в Конфигураторе

Если конфигурация сильно изменена или БСП не используется, мы можем создать регламентное задание непосредственно в дереве метаданных. Этот способ требует внесения изменений в конфигурацию (она должна быть снята с поддержки или находиться на поддержке с возможностью изменения), однако он гарантирует максимальную производительность.

Выясним, как реализовать этот подход по шагам:

Шаг 1. Создание общего модуля

Регламентные задания могут запускать только процедуры, расположенные в неглобальных общих модулях с установленным признаком выполнения на сервере.

  1. В дереве конфигурации найдем ветку Общие -> Общие модули.
  2. Нажмем правую кнопку мыши и выберем Добавить. Назовем новый модуль, например, РегламентныеПроцедурыСервер.
  3. В свойствах созданного модуля установим флажки: Сервер и Вызов сервера. Убедимся, что флажки «Глобальный» и «Клиент» сняты.
  4. Пропишем в модуле процедуру, которая будет программно подключать и запускать нашу внешнюю обработку:

Процедура ВыполнитьРассылкуНапоминаний() Экспорт
    
    // Путь к файлу внешней обработки на сервере. Убедитесь, что сервер 1С имеет доступ к этой папке!
    ПутьКФайлу = "C:\ExternalProcessings\РассылкаНапоминаний.epf"; 
    
    Попытка
        // Программное создание объекта внешней обработки
        ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
        // Запуск целевой процедуры
        ОбработкаОбъект.ОтправкаНапоминаний();
    Исключение
        ЗаписьЖурналаРегистрации("РегламентнаяРассылка",
            УровеньЖурналаРегистрации.Ошибка,
            ,
            ,
            "Ошибка при выполнении рассылки: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Рассмотрим код подробнее. Метод ВнешниеОбработки.Создать() принимает два параметра: путь к файлу обработки на диске сервера и булево значение, отвечающее за безопасный режим. Мы передаем Ложь вторым параметром, чтобы у обработки была возможность отправлять сетевые запросы для работы с электронной почтой.

Шаг 2. Создание объекта регламентного задания

  1. В дереве конфигурации перейдем в ветку Общие -> Регламентные задания и нажмем Добавить.
  2. В поле Имя укажем: РассылкаНапоминанийПоПятницам.
  3. В поле Имя метода нажмем кнопку выбора с тремя точками и найдем нашу созданную процедуру: РегламентныеПроцедурыСервер.ВыполнитьРассылкуНапоминаний.
  4. Установим флажок Использование (это означает, что задание будет активно сразу после обновления конфигурации).
  5. Нажмем на свойство Расписание и настроим его аналогично первому способу:
    • Вкладка «Недельное»: флажок на «Пятница».
    • Вкладка «Дневное»: время начала «08:00:00».
  6. Сохраним изменения и обновим конфигурацию базы данных (клавиша F7).

Важные технические нюансы, о которых нужно знать каждому разработчику

При работе с фоновыми и регламентными заданиями часто возникают подводные камни, которые могут запутать начинающего программиста. Проанализируем ключевые особенности, от которых зависит стабильность работы рассылки.

Файловый режим работы базы данных против клиент-серверного

Поведение регламентных заданий кардинально отличается в зависимости от архитектуры вашей базы данных:

Безопасный режим исполнения кода

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

Отладка фоновых заданий в Конфигураторе

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

  1. Убедитесь, что служба сервера 1С запущена с параметром отладки -debug (для клиент-серверного режима).
  2. Откройте Конфигуратор, перейдите в меню Отладка -> Подключение...
  3. В появившемся списке доступных локальных диалогов нажмите кнопку Автоматическое подключение.
  4. Установите флажок напротив пункта Фоновые задания и нажмите OK.
  5. Теперь при срабатывании расписания (или при принудительном запуске регламентного задания через консоль заданий) Конфигуратор успешно перехватит выполнение кода на вашей точке останова.

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

← На главную