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

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

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

Использование штатных механизмов расширений в современных версиях платформы

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

Для того чтобы эти механизмы заработали, нам необходимо убедиться, что режим совместимости расширения и основной конфигурации установлен не ниже указанных версий. Если конфигурация находится на старом режиме совместимости (например, 8.3.10), добавить регламентное задание напрямую в расширение не получится.

Реализация регламентного задания через расширение

Рассмотрим по шагам процесс создания регламентного задания в расширении:

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

Пример кода в общем модуле расширения для выполнения регламентной операции:


Процедура ВыполнитьОбновлениеСтатусов() Экспорт
    // Логика фонового задания
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ЗаказыГде Статус = &Статус";
    Запрос.УстановитьПараметр("Статус", Перечисления.Статусы.Новый);
    // ... дальнейшая обработка данных
КонецПроцедуры

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

Альтернативный вариант: Использование Библиотеки Стандартных Подсистем (БСП)

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

Этот способ позволяет добавить регламентное задание даже без создания расширения. Рассмотрим алгоритм:

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

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


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

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

Проблема вывода сообщений в фоновых заданиях

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

Как же нам отслеживать результат работы? Рассмотрим правильные подходы:

Подписки на события в расширении: нюансы выполнения

При использовании подписок на события в расширениях важно понимать порядок их срабатывания. Если для одного и того же объекта (например, документа РеализацияТоваровУслуг) существует несколько обработчиков события ПриЗаписи, они выполняются в следующей последовательности:

  1. Обработчик в модуле самого объекта (основная конфигурация).
  2. Подписки на события, созданные в основной конфигурации.
  3. Подписки на события, созданные в расширениях.

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

Выводы

Мы выяснили, что современный механизм расширений платформы 1С:Предприятие 8.3 предоставляет полноценный инструментарий для создания регламентных заданий и подписок на события. Если ваша платформа соответствует требованиям (8.3.11+ для заданий и 8.3.15+ для подписок), используйте прямое создание объектов в расширении. Для более старых систем или специфических задач отличной альтернативой остается механизм дополнительных обработок БСП с запуском по расписанию. В любом случае, для мониторинга работы всегда используйте Журнал регистрации, так как интерактивные методы вывода информации в фоновых процессах недоступны.

← На главную