При разработке расширений конфигурации часто возникает необходимость автоматизировать обработку данных, добавленных в это самое расширение. Однако разработчики сталкиваются с тем, что регламентные задания в расширениях имеют свои особенности функционирования, а в старых версиях платформы они и вовсе не поддерживались напрямую. Разберем, как реализовать этот механизм наиболее эффективно, используя как современные возможности платформы, так и проверенные временем методы для конфигураций на базе БСП (Библиотеки стандартных подсистем).
Начиная с версии 8.3.11, компания «1С» добавила возможность включать объект РегламентноеЗадание непосредственно в состав расширения. Это самый правильный и современный метод. Проанализируем последовательность действий для его реализации:
ИмяМетода укажем нашу процедуру в формате ОбщийМодульРасширения.ИмяПроцедуры.Важный нюанс: Если регламентное задание не запускается, проверим настройки безопасности. По умолчанию расширения часто подключаются в Безопасном режиме. В этом режиме выполнение регламентных заданий может быть заблокировано. Чтобы исправить ситуацию, в режиме «1С:Предприятие» в справочнике Расширения необходимо снять флаг Безопасный режим для данного расширения.
В некоторых случаях нам требуется создать регламентное задание «на лету» или обойти ограничения старых версий платформы. Рассмотрим программный способ создания задания через стандартный механизм БСП. Посмотрим на пример кода, который позволяет зарегистрировать задание в системе:
Процедура РАСШ_ДобавитьРегламентноеЗадание() Экспорт
КлючРЗ = "РАСШ_ОбщийМодуль.ОбработатьОбъектыРасширенияВФоне";
РезультатПоиска = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Ключ", КлючРЗ));
Если РезультатПоиска.Количество() = 0 Тогда
// Используем стандартный шаблон БСП для запуска дополнительных обработок
РЗ = РегламентныеЗадания.СоздатьРегламентноеЗадание("ЗапускДополнительныхОбработок");
РЗ.Наименование = "РАСШ: Обработка объектов расширения";
РЗ.Ключ = КлючРЗ;
РЗ.Использование = Истина;
// Настраиваем периодичность (например, каждый день)
РЗ.Расписание.ПериодПовтораДней = 1;
РЗ.Расписание.ВремяНачала = Дата('00010101000005');
// Добавляем параметры. В данном примере передаем пустую ссылку на обработку
// и ключ, который мы будем перехватывать позже.
РЗ.Параметры.Добавить(Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка());
РЗ.Параметры.Добавить(КлючРЗ);
РЗ.Записать();
КонецЕсли;
КонецПроцедуры
В данном коде обратим внимание на то, что мы используем предопределенное регламентное задание ЗапускДополнительныхОбработок. Это позволяет нам встроиться в существующую экосистему конфигурации, не создавая новых объектов метаданных в основной базе.
Если конфигурация использует БСП, проанализируем вариант с использованием справочника ДополнительныеОтчетыИОбработки. Мы можем создать внешнюю обработку, которая будет выполнять роль «прокладки» между системой и расширением.
Алгоритм работы будет следующим:
ВызовСерверногоМетода.Выясним причину, почему этот метод удобен: при удалении расширения обработка просто перестанет работать, но не вызовет критических ошибок в системе. Кроме того, все настройки расписания хранятся в стандартном месте, понятном системному администратору.
Для опытных разработчиков разберем способ, основанный на подмене логики выполнения команд БСП. Мы можем расширить общий модуль ДополнительныеОтчетыИОбработки и перехватить выполнение команды, даже если она не находит физическую внешнюю обработку в справочнике.
Рассмотрим пример кода для расширения общего модуля:
&Вместо("ВыполнитьКоманду")
Функция РАСШ_ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата)
// Проверяем, относится ли команда к нашему расширению по префиксу идентификатора
Если СтрНачинаетсяС(ПараметрыКоманды.ИдентификаторКоманды, "РАСШ_") Тогда
ПутьКОбработчику = СтрРазделить(ПараметрыКоманды.ИдентификаторКоманды, ".");
Если ПутьКОбработчику.ВГраница() < 1 Тогда
Возврат Неопределено;
КонецЕсли;
// Пытаемся получить доступ к модулю расширения
ОбщийМодуль = ОбщегоНазначения.ОбщийМодуль(ПутьКОбработчику[0]);
Если ОбщийМодуль = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// Динамически вызываем функцию из расширения
Возврат ОбщегоНазначения.ВызватьФункциюКонфигурации(ПараметрыКоманды.ИдентификаторКоманды, АдресРезультата);
КонецЕсли;
// Если команда не наша, продолжаем стандартный вызов
Возврат ПродолжитьВызов(ПараметрыКоманды, АдресРезультата);
КонецФункции
Этот метод позволяет создавать очень гибкие системы, где регламентное задание выступает лишь триггером, а вся логика управления потоками выполнения сосредоточена внутри расширения. Обратим внимание, что при использовании такого подхода нам не нужно заботиться о хранении ссылок на внешние файлы — весь код находится внутри расширения.
Подводя итог, выделим ключевые моменты:
РегламентноеЗадание в расширении. Это наиболее стабильный путь.Попытка...Исключение с записью ошибок.Таким образом, мы изучили основные способы запуска автоматизированных процессов для объектов расширения. Выбор конкретного метода зависит от требований к стабильности, версии платформы и необходимости интеграции со стандартными подсистемами вашей конфигурации.