Как запустить регламентное задание в расширении конфигурации 1С?

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

При разработке расширений для конфигураций на платформе 1С:Предприятие 8.3 (особенно версий ниже 8.3.24) программисты часто сталкиваются с существенным ограничением: в расширение нельзя напрямую добавить объект метаданных РегламентноеЗадание. Это создает сложности, когда необходимо автоматизировать выполнение определенных действий, не снимая основную конфигурацию с поддержки. В данной статье мы подробно разберем, как обойти это ограничение, используя механизмы БСП и современные возможности платформы.

Метод 1: Использование механизма «Дополнительные отчеты и обработки» (БСП)

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

Суть метода заключается в том, что мы создаем внешнюю обработку, которая будет служить «пусковым механизмом», а вся основная логика останется внутри расширения. Разберем алгоритм реализации:

  1. Создаем экспортный метод в расширении. В серверном модуле вашего расширения (например, в общем модуле с включенными флагами Сервер и Внешнее соединение) создаем процедуру, которую нужно запускать по расписанию.
  2. Подготавливаем внешнюю обработку. Создаем файл .epf. В модуле объекта этой обработки прописываем стандартную функцию СведенияОВнешнейОбработке() для интеграции с БСП.
  3. Вызываем код расширения из обработки. В процедуре выполнения обработки прописываем вызов вашего метода из расширения.

Проанализируем пример кода для модуля объекта внешней обработки:


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

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    // Вызываем экспортную процедуру из общего модуля вашего расширения
    МойРасширенныйМодуль.ВыполнитьДействиеПоРасписанию();
КонецПроцедуры

После этого вам достаточно загрузить эту обработку в справочник ДополнительныеОтчетыИОбработки, настроить ей расписание, и система будет автоматически выполнять код вашего расширения раз в сутки или по иному графику.

Метод 2: Обновление платформы до версии 8.3.24 и выше

Важно отметить, что фирма «1С» прислушалась к пожеланиям разработчиков. Начиная с версии платформы 8.3.24, ограничение на создание регламентных заданий в расширениях было снято. Если у вас есть возможность обновить платформу, это будет самым современным решением.

В новых версиях вы можете просто добавить объект РегламентноеЗадание непосредственно в дерево метаданных расширения. При этом не забудьте указать метод (процедуру), который должен выполняться. Этот метод должен находиться в общем модуле расширения с установленным флагом Сервер.

Метод 3: Перехват существующих заданий (&Вместо)

Рассмотрим ситуацию, когда платформа старая, а внешние обработки использовать не хочется. В основной конфигурации всегда есть стандартные регламентные задания, которые либо не используются в вашей организации, либо выполняются с подходящей периодичностью. Мы можем «внедриться» в их работу.

Выберем любое типовое регламентное задание и через расширение перехватим его процедуру с помощью аннотации &Вместо. Проанализируем пример кода в расширении:


&Вместо("ПроцедураТиповогоЗадания")
Процедура Мой_ПроцедураТиповогоЗадания()
    // Вызываем оригинальный код, чтобы не нарушить логику системы
    ПродолжитьВызов();
    
    // Добавляем свою логику
    Если НачалоДня(ТекущаяДата()) <> НачалоДня(ОбъектПараметры.ДатаПоследнегоЗапуска) Тогда
        МойРасширенныйМодуль.ВыполнитьДействиеПоРасписанию();
    КонецЕсли;
КонецПроцедуры

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

Метод 4: Использование «Очереди заданий» (Job Queue)

В современных конфигурациях БСП существует механизм ОчередьЗаданий. Это программный интерфейс, который позволяет ставить задачи на выполнение в фоновом режиме без создания новых объектов метаданных. Выясним, как это работает.

Вы можете программно добавить задание в очередь, указав имя метода из вашего расширения. Это особенно удобно для разовых задач или задач, которые должны запускаться после определенного события (например, после загрузки данных).

Пример добавления задания в очередь:


ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяМетода", "МойРасширенныйМодуль.ВыполнитьДействиеПоРасписанию");
ПараметрыЗадания.Вставить("Ключ", "УникальныйКлючМоегоЗадания");

// Используем программный интерфейс БСП для добавления в очередь
ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);

Критически важные требования к коду расширения

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

  1. Экспортность: Метод, вызываемый регламентным заданием, обязательно должен быть помечен ключевым словом Экспорт.
  2. Доступность модулей: Общий модуль, в котором располагается код, должен иметь флаг Сервер. Для корректной работы в разных режимах запуска рекомендуется также установить флаг Внешнее соединение.
  3. Безопасный режим: Помните, что расширения часто работают в безопасном режиме. Если вашему коду требуется доступ к файловой системе или внешним COM-объектам, убедитесь, что в профиле безопасности или в настройках расширения (свойство БезопасныйРежим) установлены соответствующие разрешения.

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

← На главную