Перенос логики из внешних обработок в расширения конфигурации — это современный стандарт разработки в экосистеме «1С:Предприятие». Расширения позволяют кастомизировать систему, не снимая основную конфигурацию с поддержки. Однако при переносе функционала, который ранее выполнялся по расписанию (например, каждые 30 секунд через справочник дополнительных отчетов и обработок), разработчики часто сталкиваются с вопросом: как запустить регламентное выполнение кода, находящегося внутри расширения?
В этой статье мы подробно разберем все доступные варианты решения этой задачи — от классических обходных путей, используемых в старых версиях платформы, до современных нативных механизмов, появившихся в последних релизах «1С:Предприятие».
Если ваша информационная база работает под управлением платформы версии 8.3.23 или более новой, вам больше не нужно использовать сложные обходные пути. Фирма «1С» добавила полноценную поддержку собственных регламентных заданий непосредственно внутри расширений.
Разберем этот процесс по шагам:
Сервер.Этот способ является наиболее предпочтительным, так как он не требует изменения основной конфигурации и написания лишнего «транзитного» кода.
На старых версиях платформы попытка добавить регламентное задание напрямую в расширение завершится ошибкой. В этом случае идеальным и наиболее безопасным решением является использование внешней обработки в качестве «триггера» или «пускача».
Суть метода заключается в том, что сама внешняя обработка регистрируется в подсистеме БСП «Дополнительные отчеты и обработки» и настраивается на запуск по расписанию. При этом она не содержит тяжелой бизнес-логики — её единственная задача заключается в вызове экспортного метода из вашего расширения.
Рассмотрим пример реализации модуля такой внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Регламентный запуск процедур расширения";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Важно для выполнения привилегированного кода
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить фоновое задание расширения";
НоваяКоманда.Идентификатор = "ВыполнитьЗапуск";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "ВыполнитьЗапуск" Тогда
// Вызываем экспортный метод общего модуля, который находится в расширении
Попытка
МойОбщийМодульРасширения.ВыполнитьНужноеДействие();
Исключение
ЗаписьЖурналаРегистрации("Ошибка запуска из расширения",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Проанализируем преимущества этого подхода. Во-первых, вы можете обновлять основной код внутри расширения без необходимости перезагружать внешнюю обработку в справочнике БСП. Во-вторых, этот метод полностью сохраняет типовую конфигурацию на поддержке и работает абсолютно на любых версиях платформы 8.3.
Если вы хотите избежать создания внешних файлов-«пускачей» на старых платформах, можно пойти путем программной интеграции. Для этого мы можем задействовать механизм расширения общих модулей БСП.
Выясним, как это устроено. В Библиотеке стандартных подсистем за выполнение регламентных задач дополнительных обработок отвечает общий модуль ДополнительныеОтчетыИОбработки. Мы можем перехватить выполнение стандартного сценария и внедрить туда вызов нашего кода.
Разберем алгоритм по шагам:
ДополнительныеОтчетыИОбработки или аналогичный в вашей версии БСП).&Вместо или &После, расширяем процедуру, которая инициирует выполнение регламентных заданий.Этот метод требует хорошего понимания архитектуры БСП конкретно вашей конфигурации, поэтому применять его стоит только опытным разработчикам.
Очень часто при переносе кода из внешней обработки в расширение разработчики сталкиваются с тем, что код перестает работать или выдает ошибки прав доступа. Выясним причину этой проблемы.
Все дело в механизме Безопасного режима, который по умолчанию накладывает жесткие ограничения на выполнение кода:
БезопасныйРежим = Истина, то любые попытки вызвать метод УстановитьПривилегированныйРежим(Истина) внутри этой обработки будут полностью проигнорированы платформой. Код выполнится под правами текущего сеанса без возможности обхода RLS. Чтобы решить эту проблему во внешней обработке, необходимо обязательно указывать ПараметрыРегистрации.БезопасныйРежим = Ложь; в процедуре СведенияОВнешнейОбработке, а также принудительно подтверждать небезопасный режим в интерфейсе «1С:Предприятия» администратором базы данных.Таким образом, если вашему регламентному заданию в расширении требуется работа с привилегированным режимом, убедитесь, что у расширения отключен безопасный режим как на уровне конфигуратора, так и в настройках расширений в режиме «1С:Предприятие».