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

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

Перенос логики из внешних обработок в расширения конфигурации — это современный стандарт разработки в экосистеме «1С:Предприятие». Расширения позволяют кастомизировать систему, не снимая основную конфигурацию с поддержки. Однако при переносе функционала, который ранее выполнялся по расписанию (например, каждые 30 секунд через справочник дополнительных отчетов и обработок), разработчики часто сталкиваются с вопросом: как запустить регламентное выполнение кода, находящегося внутри расширения?

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

Решение 1: Использование нативных регламентных заданий в расширениях (для платформы 8.3.23 и выше)

Если ваша информационная база работает под управлением платформы версии 8.3.23 или более новой, вам больше не нужно использовать сложные обходные пути. Фирма «1С» добавила полноценную поддержку собственных регламентных заданий непосредственно внутри расширений.

Разберем этот процесс по шагам:

  1. Откройте конфигуратор вашей базы данных и перейдите в свойства расширения.
  2. Убедитесь, что режим совместимости расширения и основной конфигурации установлен в значение не ниже 8.3.23. Если режим совместимости ниже, нативные регламентные задания создать не удастся.
  3. В дереве метаданных расширения найдите ветку Общие, нажмите правой кнопкой мыши по пункту Регламентные задания и выберите команду Добавить.
  4. В свойствах созданного регламентного задания укажите имя метода (процедуры общего модуля), который должен выполняться. Этот общий модуль также должен быть создан внутри вашего расширения. Обратите внимание, что модуль должен иметь флаг Сервер.
  5. Настройте расписание запуска (например, каждые 30 секунд), заполнив соответствующее свойство регламентного задания.
  6. Важный нюанс: определите область действия регламентного задания. Доступны два варианта:
    • Информационная база — стандартный вариант для обычных файловых или клиент-серверных баз.
    • Область данных — используется в разделенных базах (например, в сервисах 1С:Fresh), где задание должно выполняться в контексте конкретного абонента.

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

Решение 2: Внешняя обработка-«пускач» (универсальный метод для платформы ниже 8.3.23)

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

Суть метода заключается в том, что сама внешняя обработка регистрируется в подсистеме БСП «Дополнительные отчеты и обработки» и настраивается на запуск по расписанию. При этом она не содержит тяжелой бизнес-логики — её единственная задача заключается в вызове экспортного метода из вашего расширения.

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


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт

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

КонецПроцедуры

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

Решение 3: Интеграция через механизмы БСП (программный перехват)

Если вы хотите избежать создания внешних файлов-«пускачей» на старых платформах, можно пойти путем программной интеграции. Для этого мы можем задействовать механизм расширения общих модулей БСП.

Выясним, как это устроено. В Библиотеке стандартных подсистем за выполнение регламентных задач дополнительных обработок отвечает общий модуль ДополнительныеОтчетыИОбработки. Мы можем перехватить выполнение стандартного сценария и внедрить туда вызов нашего кода.

Разберем алгоритм по шагам:

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

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

Критически важный нюанс: безопасный режим и привилегированные права

Очень часто при переносе кода из внешней обработки в расширение разработчики сталкиваются с тем, что код перестает работать или выдает ошибки прав доступа. Выясним причину этой проблемы.

Все дело в механизме Безопасного режима, который по умолчанию накладывает жесткие ограничения на выполнение кода:

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

← На главную