При разработке в среде 1С:Предприятие часто возникает задача расширения функционала типовой конфигурации без снятия её с поддержки. Двумя наиболее востребованными механизмами для этого являются регламентные задания (для автоматизации периодических действий) и подписки на события (для реакции на действия пользователя или системы). Долгое время возможности расширений в этом плане были ограничены, но с развитием платформы ситуация изменилась. Разберем подробно, как реализовать эти задачи современными методами и какие существуют альтернативы.
Прежде всего, проанализируем текущие возможности платформы. Если раньше программистам приходилось искать обходные пути, то в актуальных релизах многие ограничения сняты. Рассмотрим основные вехи развития:
8.3.11, разработчики получили возможность создавать собственные объекты РегламентныеЗадания непосредственно внутри расширения. Это позволяет настраивать расписание и логику выполнения процедур, не затрагивая основную конфигурацию.8.3.15, платформа позволяет добавлять подписки на события. Это критически важное обновление, так как оно позволяет «перехватывать» события объектов основной конфигурации (например, ПередЗаписью справочника или ПриПроведении документа) и выполнять свой код.Для того чтобы эти механизмы заработали, нам необходимо убедиться, что режим совместимости расширения и основной конфигурации установлен не ниже указанных версий. Если конфигурация находится на старом режиме совместимости (например, 8.3.10), добавить регламентное задание напрямую в расширение не получится.
Рассмотрим по шагам процесс создания регламентного задания в расширении:
Общие -> Регламентные задания и нажмем «Добавить».Сервер.Пример кода в общем модуле расширения для выполнения регламентной операции:
Процедура ВыполнитьОбновлениеСтатусов() Экспорт
// Логика фонового задания
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ЗаказыГде Статус = &Статус";
Запрос.УстановитьПараметр("Статус", Перечисления.Статусы.Новый);
// ... дальнейшая обработка данных
КонецПроцедуры
Помним, что регламентное задание будет активно только в том случае, если само расширение успешно подключено к информационной базе и не имеет ошибок применения.
Если по каким-то причинам использование расширений для регламентных заданий невозможно (например, из-за ограничений версии платформы или политик обновления), проанализируем вариант с использованием механизма Дополнительные отчеты и обработки, который есть практически в любой современной типовой конфигурации.
Этот способ позволяет добавить регламентное задание даже без создания расширения. Рассмотрим алгоритм:
СведенияОВнешнейОбработке().ВызовСерверногоМетода.Проанализируем пример кода модуля внешней обработки для БСП:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запуск регламентной очистки";
НоваяКоманда.Идентификатор = "ОчисткаДанных";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "ОчисткаДанных" Тогда
// Код, который будет выполняться по расписанию
КонецЕсли;
КонецПроцедуры
Разберем типичную ошибку начинающих разработчиков, упомянутую в обсуждении: попытка использования метода Сообщить() внутри регламентного задания. Поскольку задание выполняется в фоновом сеансе на сервере, у него нет привязки к конкретному пользовательскому интерфейсу (окну). Следовательно, метод Сообщить() сработает «в пустоту».
Как же нам отслеживать результат работы? Рассмотрим правильные подходы:
ЗаписьЖурналаРегистрации() для фиксации начала, окончания и ошибок выполнения.
ЗаписьЖурналаРегистрации("МоеРасширение.РегламентноеЗадание",
УровеньЖурналаРегистрации.Информация, , ,
"Обработка завершена успешно в " + ТекущаяДата());
При использовании подписок на события в расширениях важно понимать порядок их срабатывания. Если для одного и того же объекта (например, документа РеализацияТоваровУслуг) существует несколько обработчиков события ПриЗаписи, они выполняются в следующей последовательности:
Если у вас подключено несколько расширений, порядок выполнения подписок между ними будет зависеть от приоритета расширений. Это необходимо учитывать при проектировании сложных систем, где логика одного расширения может зависеть от результатов работы другого.
Мы выяснили, что современный механизм расширений платформы 1С:Предприятие 8.3 предоставляет полноценный инструментарий для создания регламентных заданий и подписок на события. Если ваша платформа соответствует требованиям (8.3.11+ для заданий и 8.3.15+ для подписок), используйте прямое создание объектов в расширении. Для более старых систем или специфических задач отличной альтернативой остается механизм дополнительных обработок БСП с запуском по расписанию. В любом случае, для мониторинга работы всегда используйте Журнал регистрации, так как интерактивные методы вывода информации в фоновых процессах недоступны.