Разберем типичную и крайне востребованную задачу по автоматизации рутинных процессов в среде 1С:Предприятие. Часто у пользователей возникает необходимость отправлять отчетность, уведомления или напоминания сотрудникам по определенному графику — например, каждую пятницу в 08:00. В исходном сообщении темы автор описал рабочую внешнюю обработку, которая умеет ставить письма в очередь на отправку с помощью процедуры РаботаСПочтой.ПоставитьПисьмоВОчередьНаОтправку. Однако запуск этой процедуры сейчас привязан к кнопке на управляемой форме и требует ручного нажатия.
Наша цель — сделать так, чтобы рассылка происходила полностью автоматически. Для решения этой задачи в платформе 1С существует мощный механизм — РегламентныеЗадания. Они работают в фоновом режиме на стороне сервера и запускаются по заранее настроенному расписанию. Выясним, как связать внешнюю обработку с механизмом регламентных заданий.
Мы подробно рассмотрим два наиболее эффективных способа решения этой задачи:
Если вы работаете в любой современной типовой конфигурации (например, 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей, 1С:Бухгалтерия или 1С:ЗУП), в вашу систему уже встроена Библиотека Стандартных Подсистем (БСП). Она позволяет загружать внешние обработки прямо в режиме «1С:Предприятие» и настраивать для них расписание запуска без изменения самой конфигурации.
Чтобы система распознала внешнюю обработку и позволила запускать её по расписанию, нам необходимо доработать её программный код. Вся логика интерактивной формы (кнопки, клиентские процедуры) должна быть перенесена в Модуль объекта внешней обработки, так как фоновые задания выполняются на сервере без создания оконного интерфейса.
Выполним пошаговую модернизацию кода внешней обработки. Откроем обработку в конфигураторе, перейдем в её модуль объекта и добавим туда следующие процедуры:
// Функция описывает обработку для БСП, чтобы система распознала её возможности
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Регламентная рассылка напоминаний");
ПараметрыРегистрации.Вставить("Версия", "1.0");
// ВАЖНО: для работы с почтой требуется отключить безопасный режим,
// чтобы у обработки были права на выполнение сетевых запросов к SMTP-серверу
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Обработка для автоматической отправки напоминаний по пятницам в 08:00.");
// Описываем команду для регламентного запуска
ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Отправить напоминания";
НоваяКоманда.Идентификатор = "ОтправитьНапоминанияПоРасписанию";
// Обязательно указываем "ВызовСерверногоМетода", иначе расписание настроить не удастся
НоваяКоманда.Использование = "ВызовСерверногоМетода";
НоваяКоманда.ПоказыватьОповещение = Ложь;
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
// Стандартный метод БСП, который автоматически вызывается при срабатывании расписания
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ОтправитьНапоминанияПоРасписанию" Тогда
ОтправкаНапоминаний();
КонецЕсли;
КонецПроцедуры
// Основной алгоритм рассылки писем, перенесенный из модуля формы
Процедура ОтправкаНапоминаний() Экспорт
Получатели = Справочники.Параметры.НайтиПоНаименованию("ПолучателиПланаПроизводства").Строка;
ТемаПисьма = "НАПОМИНАНИЕ! Сумма плана производства";
ТекстПисьма = "В течение 3 часов необходимо предоставить Кузнецовой ВМ актуальную информацию по сумме плана производства на ближайшие 4 месяца для формирования отчета ""Загрузка производства СЭТЗ"".";
РаботаСПочтой.ПоставитьПисьмоВОчередьНаОтправку(Получатели, ТемаПисьма, ТекстПисьма);
КонецПроцедуры
Проанализируем ключевые моменты этого кода. Функция СведенияОВнешнейОбработке() сообщает БСП, что данная обработка регистрируется как ДополнительнаяОбработка и предоставляет одну команду с идентификатором ОтправитьНапоминанияПоРасписанию. Тип использования ВызовСерверногоМетода критически важен — именно он указывает системе, что команда должна запускаться на сервере без открытия окон и участия пользователя.
Теперь настроим расписание в режиме «1С:Предприятие»:
.epf. При появлении предупреждения безопасности подтвердим доверие к источнику.Поздравляем! Система автоматически создала внутреннее регламентное задание БСП, которое теперь каждую пятницу в 08:00 будет активировать метод ВыполнитьКоманду() нашей обработки.
Если конфигурация сильно изменена или БСП не используется, мы можем создать регламентное задание непосредственно в дереве метаданных. Этот способ требует внесения изменений в конфигурацию (она должна быть снята с поддержки или находиться на поддержке с возможностью изменения), однако он гарантирует максимальную производительность.
Выясним, как реализовать этот подход по шагам:
Регламентные задания могут запускать только процедуры, расположенные в неглобальных общих модулях с установленным признаком выполнения на сервере.
РегламентныеПроцедурыСервер.
Процедура ВыполнитьРассылкуНапоминаний() Экспорт
// Путь к файлу внешней обработки на сервере. Убедитесь, что сервер 1С имеет доступ к этой папке!
ПутьКФайлу = "C:\ExternalProcessings\РассылкаНапоминаний.epf";
Попытка
// Программное создание объекта внешней обработки
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Запуск целевой процедуры
ОбработкаОбъект.ОтправкаНапоминаний();
Исключение
ЗаписьЖурналаРегистрации("РегламентнаяРассылка",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при выполнении рассылки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Рассмотрим код подробнее. Метод ВнешниеОбработки.Создать() принимает два параметра: путь к файлу обработки на диске сервера и булево значение, отвечающее за безопасный режим. Мы передаем Ложь вторым параметром, чтобы у обработки была возможность отправлять сетевые запросы для работы с электронной почтой.
РассылкаНапоминанийПоПятницам.РегламентныеПроцедурыСервер.ВыполнитьРассылкуНапоминаний.При работе с фоновыми и регламентными заданиями часто возникают подводные камни, которые могут запутать начинающего программиста. Проанализируем ключевые особенности, от которых зависит стабильность работы рассылки.
Поведение регламентных заданий кардинально отличается в зависимости от архитектуры вашей базы данных:
По умолчанию все внешние файлы запускаются в системе в безопасном режиме. Это сделано для защиты базы от потенциально вредоносного кода. Однако в безопасном режиме платформа блокирует доступ к внешним ресурсам: запрещено обращаться к файловой системе сервера, вызывать внешние компоненты, а самое главное — запрещено совершать интернет-соединения. Если вы оставите безопасный режим включенным, попытка подключиться к вашему почтовому серверу SMTP вызовет критическую ошибку выполнения. Обязательно проверяйте отключение безопасного режима при регистрации обработки.
Обычная точка останова внутри процедуры ОтправкаНапоминаний() не сработает при регламентном запуске, так как код выполняется в отдельном фоновом сеансе на сервере, к которому ваш Конфигуратор по умолчанию не подключен. Чтобы отладить этот код, выполните следующие действия:
-debug (для клиент-серверного режима).Используя предложенные методики, вы сможете легко автоматизировать рассылку писем, избавив пользователей от необходимости помнить о ручном нажатии кнопок каждую пятницу.