При разработке расширений для конфигураций на платформе 1С:Предприятие 8.3 (особенно версий ниже 8.3.24) программисты часто сталкиваются с существенным ограничением: в расширение нельзя напрямую добавить объект метаданных РегламентноеЗадание. Это создает сложности, когда необходимо автоматизировать выполнение определенных действий, не снимая основную конфигурацию с поддержки. В данной статье мы подробно разберем, как обойти это ограничение, используя механизмы БСП и современные возможности платформы.
Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), например, 1С:Розница, 1С:Управление торговлей или 1С:ERP, этот метод является наиболее правильным и «безопасным». Рассмотрим его по шагам.
Суть метода заключается в том, что мы создаем внешнюю обработку, которая будет служить «пусковым механизмом», а вся основная логика останется внутри расширения. Разберем алгоритм реализации:
.epf. В модуле объекта этой обработки прописываем стандартную функцию СведенияОВнешнейОбработке() для интеграции с БСП.Проанализируем пример кода для модуля объекта внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Запуск регламента из расширения";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Выполнить регламентную операцию";
НоваяКоманда.Идентификатор = "ВыполнитьОперацию";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
// Вызываем экспортную процедуру из общего модуля вашего расширения
МойРасширенныйМодуль.ВыполнитьДействиеПоРасписанию();
КонецПроцедуры
После этого вам достаточно загрузить эту обработку в справочник ДополнительныеОтчетыИОбработки, настроить ей расписание, и система будет автоматически выполнять код вашего расширения раз в сутки или по иному графику.
Важно отметить, что фирма «1С» прислушалась к пожеланиям разработчиков. Начиная с версии платформы 8.3.24, ограничение на создание регламентных заданий в расширениях было снято. Если у вас есть возможность обновить платформу, это будет самым современным решением.
В новых версиях вы можете просто добавить объект РегламентноеЗадание непосредственно в дерево метаданных расширения. При этом не забудьте указать метод (процедуру), который должен выполняться. Этот метод должен находиться в общем модуле расширения с установленным флагом Сервер.
Рассмотрим ситуацию, когда платформа старая, а внешние обработки использовать не хочется. В основной конфигурации всегда есть стандартные регламентные задания, которые либо не используются в вашей организации, либо выполняются с подходящей периодичностью. Мы можем «внедриться» в их работу.
Выберем любое типовое регламентное задание и через расширение перехватим его процедуру с помощью аннотации &Вместо. Проанализируем пример кода в расширении:
&Вместо("ПроцедураТиповогоЗадания")
Процедура Мой_ПроцедураТиповогоЗадания()
// Вызываем оригинальный код, чтобы не нарушить логику системы
ПродолжитьВызов();
// Добавляем свою логику
Если НачалоДня(ТекущаяДата()) <> НачалоДня(ОбъектПараметры.ДатаПоследнегоЗапуска) Тогда
МойРасширенныйМодуль.ВыполнитьДействиеПоРасписанию();
КонецЕсли;
КонецПроцедуры
Важный нюанс: при таком подходе нужно быть осторожным, чтобы не замедлить выполнение критически важных системных процессов. Выбирайте задания, которые работают в фоновом режиме и не влияют на оперативную работу пользователей.
В современных конфигурациях БСП существует механизм ОчередьЗаданий. Это программный интерфейс, который позволяет ставить задачи на выполнение в фоновом режиме без создания новых объектов метаданных. Выясним, как это работает.
Вы можете программно добавить задание в очередь, указав имя метода из вашего расширения. Это особенно удобно для разовых задач или задач, которые должны запускаться после определенного события (например, после загрузки данных).
Пример добавления задания в очередь:
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяМетода", "МойРасширенныйМодуль.ВыполнитьДействиеПоРасписанию");
ПараметрыЗадания.Вставить("Ключ", "УникальныйКлючМоегоЗадания");
// Используем программный интерфейс БСП для добавления в очередь
ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
Чтобы любой из вышеперечисленных методов заработал, необходимо соблюдать строгие правила оформления модулей в расширении. Проверим себя по списку:
Экспорт.БезопасныйРежим) установлены соответствующие разрешения.Таким образом, даже при отсутствии прямой поддержки регламентных заданий в старых версиях платформы, у разработчика есть как минимум три надежных способа реализации фоновых задач. Выбор конкретного метода зависит от архитектуры вашей системы и возможности обновления платформы.