Разработка шаблонов шагов сценария в Modus ETL. Руководство для 1С-разработчика - Публичная база знаний Modus
Общая информация
Шаблоны шагов сценария — это механизм расширения функциональности сценариев Modus ETL. С их помощью разработчик может создавать собственные типовые операции (запросы к БД, скрипты, вызовы внешних сервисов) и многократно использовать их в разных сценариях.
Когда используются шаблоны:
- нужно выполнить однотипные действия в нескольких сценариях;
- требуется стандартизировать сложную логику обработки данных;
- необходимо предоставить аналитикам готовые «кирпичики» для построения сценариев без программирования.
Перейти к «Шаблонам шагов сценариев» - «Главное / Настройки / Шаблоны шагов сценариев».


Как устроен шаблон
Шаблон определяет:
- Тип шага — что делает шаг (возвращает данные или выполняет действие);
- Вид шага — какими средствами реализована логика (SQL, 1С, произвольный код);
- Текст запроса / скрипта — может различаться для разных типов БД;
- Параметры — значения, которые подставляются при выполнении.
Когда в сценарий добавляется шаг, созданный на основе шаблона, он появляется в списке доступных шагов в соответствующей группе. При этом в сценарии отображаются только те шаблоны, для которых в шаблоне задан соответствующий тип базы данных.

Тип шага
Тип шага определяет то, зачем создается шаблон, будут ли возвращены строки с данными после выполнения шага или он выполняет какие-либо действия или он нужен для дальнейшего использования.
У «Типа шага» есть 3 возможных значения:
- «EXEC» — шаг не возвращает данные из БД. Используется для изменения данных, выполнения скриптов или реализации промежуточной логики. Шаг может содержать выборку для внутренних вычислений, но в итоге данные не возвращаются.
- «SEL» — шаг возвращает данные из БД. Может содержать операции изменения данных, но конечным результатом всегда является выборка.
- «Вложенный запрос» — шаг используется для сохранения запроса с целью его дальнейшего применения. В текущей версии для шаблонов считается устаревшим (в сценариях реализован собственный механизм вложенных запросов).
Вид шага
«Вид шага» определяет инструмент и способ реализации логики шага: SQL-запрос, язык запросов 1С, встроенный язык 1С или вызов функций внешней системы:
- «SQL» — используется, когда нужно реализовать шаг в виде запроса на «SQL»
- «1C» — Используется, когда нужно реализовать шаг в виде запроса на «1С». При этом запрос будет выполнен в самой «ETL». Реализовано два варианта:
- «SEL» — при выполнении сценария данные будут получены в виде табличного документа. При запуске сценария отобразится этот табличный документ.
- «EXEC» — выполненный запрос будет записан во внешний источник данных. Механизм устарел и не поддерживается.
- «Произвольный код на языке 1С» — используется, когда нужно реализовать шаг в виде кода на встроенном языке «1С».
- «Асинхронная обработка мастером» — используется, когда операция шага достаточно тяжеловесна и выполняется во внешней системе. Примерами асинхронных шагов могут служить операции «Перенос данных» и «Перенос данных в 1С».
Параметры шаблона
В таблице «Тексты запросов» добавляются строки с типами БД (Postgres, ClickHouse, MS SQL и т.д.). Затем для каждой строки в поле ниже указывается текст запроса или код скрипта. При этом даже если строки одинаковы, для каждой из них текст скрипта или запроса вводится отдельно.


При переходе к сценарию открывается форма вкладки «Основное», где указан «Тип базы данных». На вкладке «Шаги сценария» в левой части экрана представлен перечень всех доступных к использованию шаблонов шагов (если ранее при создании шаблона был задан используемый в сценарии тип БД).


Примеры шаблонов с различными видами и типами шагов можно найти в справочнике «Шаблоны сценариев»:
- Шаблон «Проверка на NULL»: Вид шага – «SQL», Тип шага – «SEL».
- Шаблон «Смена имен таблиц»: Вид шага – «SQL», Тип шага – «EXEC»
- Шаблон «Кодирование бинарного файла в BASE64»: Вид шага – «Произвольный код на языке 1С», Тип шага – «EXEC».
Шаблон запроса позволяет задавать параметры, которые затем используются в работе шага. Параметры задаются в коде запроса или скрипта. Например, так заданы параметры в шаблоне «Кодирование бинарного файла в BASE64»:


Или в шаблоне «Смена имен таблиц»:


Как видно из примеров, в коде параметр задается таким образом: {!Параметр!}. Чтобы заполнить параметры из шаблона автоматически, перейдите на вкладку «Параметры запроса» нажмите кнопку «Дозаполнить параметры».
При этом Modus ETL проанализирует код запроса / скрипта на наличие шаблона параметров и, если параметры заданы верно (согласно шаблону, указанному выше), в таблице параметров автоматически заполнятся «Имена параметров» так, как они указаны в коде запроса / скрипта.


Пример использования параметров в сценарии
Когда шаг, созданный на основе такого шаблона, добавляется в сценарий, он помечается как «Не настроен» — пока не заполнены параметры.
После заполнения параметров (через форму, которая открывается по кнопке «карандаш») шаг переходит в состояние «Настроен».


Создание шаблона шага без использования мастера
Этот способ подходит для простых шаблонов, которые не требуют сложной настройки. Достаточно заполнить реквизиты шаблона вручную.
Порядок действий:
- Создайте новый элемент справочника «Шаблоны шагов сценариев».
- Заполните:
- Наименование — название шаблона;
- Тип шага:
- EXEC.
- SEL.
- Вид шага:
- SQL.
- 1С.
- Произвольный код на 1С.
- Для видов SQL и Асинхронная обработка мастером — добавьте в таблицу «Тексты запросов» строки для нужных типов БД и укажите соответствующие запросы.
- Для видов 1С и Произвольный код на 1С — текст запроса/кода задаётся в поле «Текст запроса».
При необходимости задайте параметры , подробнее см. раздел «Параметры шаблона».
Создание шаблона шага с использованием мастера.
Рассмотрим создание шаблона шага с использованием внешнего мастера на примере шаблона «Кодирование бинарного файла в BASE64». Внешний мастер – это обработка на 1С (внутренняя, внешняя или защищенная), которая определяет основное взаимодействие с шагом сценария, при нажатии на иконку «карандаш» в сценарии открывается форма мастера.


Откройте шаблон «Кодирование бинарного файла в BASE64» и перейдите на вкладку «Настройки обработки – внешнего мастера».
1. Настройте «Вид объекта мастера настройки», который определяет, где будет находиться сам мастер:
- «Обработка конфигурации» — мастер находится внутри конфигурации, это объект типа «Обработка»;
- «Дополнительная обработка» — мастер подключен через механизм дополнительных обработок;
- «Защищенная обработка» — мастер находится в конфигурации в общих макетах и работает через систему СЛК.

2. При выборе «Обработки мастера настроек» в зависимости от «Вида объекта мастера настройки» будет определен контекст этого выбора. Выбирайте из объектов конфигурации, из справочника «Дополнительные отчеты и обработки» или из «общих макетов» в конфигурации.
При нажатии на зеленую круговую стрелочку «Обновить шаблон по обработке» все данные шаблона заполнятся по обработке мастера.
Примечание: при разработке мастера необходимо соблюдать ряд требований, а именно в обработке должен присутствовать определенный программный интерфейс и ряд процедур и функций, чтобы обработку можно было встроить в существующие механизмы ETL, и она считалась мастером.
Выполнение нового мастера. Программный интерфейс и необходимые элементы.
Существует два механизма интеграции мастера с ETL:
- старый (версия мастера < 1.5.2.3) — позволяет выполнять простые обработки, когда нужно просто сделать форму с параметрами для скрипта.
- новый (версия >= 1.5.2.3) — служит для разработки сложных мастеров с различными настройками и параметрами.
Факт того, какой механизм будет использоваться зависит от версии мастера. Если версия мастера >= 1.5.2.3, то будет использован новый механизм, если < 1.5.2.3, то – старый.
Примеры того, как организован программный интерфейс мастеров отражены в конфигурации. Ниже перечислены примеры мастеров и их версии (если версия не указана, значит она пустая, следовательно < 1.5.2.3):
- хс_БэкапТаблицыБД
- ХС_ИнтеграцияСПолиматикой
- хс_Кластеризация
- хс_КодированиеBase64
- хс_ЛинейнаяРегрессия
- хс_ПеремещениеФайловFTP
- ХС_ЭкспортДанныхИзТаблицыSQL
- 1.3.12.3 хс_ОчисткаХранилищаОтБэкапов
- 1.4.12.2 хс_НастройкаОператораUnpivot
- 1.4.9.1 хс_СозданиеТаблицыБД
- 1.5.2.3 хс_НастройкаPivot
- 1.5.2.3 хс_НастройкаUnpivot_2_0
- 1.5.2.3 хс_НастройкаВыборки_2_0_0
- 1.5.2.3 хс_НастройкаГруппировки_2_0_0
- 1.5.2.3 хс_НастройкаМаппингаПолей_2_0
- 1.5.2.3 хс_НастройкаНСИ_Дополнение
- 1.5.2.3 хс_НастройкаНСИ_Маппинг
- 1.5.2.3 хс_НастройкаНСИ_Обновление
- 1.5.2.3 хс_НастройкаОбъединения
- 1.5.2.3 хс_НастройкаОтбора
- 1.5.2.3 хс_НастройкаПриемника
- 1.5.2.3 хс_НастройкаПрямогоОбновленияТаблицы
- 1.5.2.3 хс_НастройкаСоединения
- 1.5.2.3 хс_НастройкаСозданиеВременнойТаблицы
- 1.5.2.3 хс_НастройкаСортировки
- 1.6.3.12 хс_Классификация
- 1.6.3.12 хс_Кластеризация_2_0_0
- 1.6.3.12 хс_Регрессия
- 1.6.5.4 хс_НастройкаМаппингаПолейСПредварительнымУдалением
- 1.6.5.4 хс_НастройкаОбновленияТаблицыИзИсточника
- 1.6.6.3 хс_Классификация_Обучение
- 1.6.6.3 хс_Классификация_Предсказание
- 1.6.6.3 хс_Регрессия_Обучение
- 1.6.6.3 хс_Регрессия_Предсказание
- 1.6.6.7 хс_НСИ_ЗагрузкаВПервичныйСправочник
- 1.6.8.6 хс_НастройкаОчисткаТаблицы
- 1.6.8.6 хс_НастройкаРазделениеСтроки
Старый механизм (версия мастера < 1.5.2.3)
Необходимый интерфейс модуля объекта (рассмотрим на примере обработки конфигурации «хс_КодированиеBase64»).
Пример кода:
// Возвращает имя формы мастера настроек
//
// Возвращаемое значение:
// Строка
//
Функция ИмяФормыМастераНастроек() Экспорт
Возврат "Форма";
КонецФункции
// Возвращает сведения о шаблоне сценария.
//
// Возвращаемое значение:
// Структура - Подробнее см. ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария().
//
Функция СведенияОШаблонеСценария() Экспорт
ВидШага = Перечисления.HS_ВидыШаговСценария.ПроизвольныйКод1С;
СведенияОШаблонеСценария = ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария(, ВидШага);
СведенияОШаблонеСценария.ТипШага = Перечисления.HS_ТипыШаговСценария.ОбработкаДанных;
СведенияОШаблонеСценария.ВидШага = ВидШага;
СведенияОШаблонеСценария.Наименование = "Кодирование бинарного файла в BASE64";
СведенияОШаблонеСценария.ТекстЗапроса = ЭтотОбъект.ПолучитьМакет("ШаблонСценария").ПолучитьТекст();
Возврат СведенияОШаблонеСценария;
КонецФункции
Это вариант функции для вида шага «ПроизвольныйКод1С» или «Запрос1С». Здесь мы получаем макет по имени «ШаблонСценария», затем в ядре определяется, что вид шаблона не «ЗапросSQL» и не «АсинхроннаяОбработкаМастером» и в шаблоне в ТЧ «ЗапросыСценария» добавляется одна строка с типом базы 1С. Соответственно макет запроса / скрипта должен называться «ШаблонСценария».
А вот вариант для видов шага «ЗапросSQL» или «АсинхроннаяОбработкаМастером».
Пример кода:
// Возвращает сведения о шаблоне сценария.
// Используется для установки начальных значений шаблона шагов сценария.
//
// Возвращаемое значение:
// см. ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария
//
Функция СведенияОШаблонеСценария() Экспорт
ВидШага = Перечисления.HS_ВидыШаговСценария.ЗапросSQL;
СведенияОШаблонеСценария = ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария("1.5.2.3", ВидШага);
СведенияОШаблонеСценария.ТипШага = Перечисления.HS_ТипыШаговСценария.ОбработкаДанных;
СведенияОШаблонеСценария.ВидШага = ВидШага;
СведенияОШаблонеСценария.Наименование = "Приемник";
СведенияОШаблонеСценария.ТипВизуальногоЭлемента = Перечисления.хс_ТипыВизуальныхЭлементовСценария.БезРамкиАктивный;
ИмяМакета = "ШаблонСценария";
ХС_НастройкиШаблоновОпераций.ЗаполнитьТекстыЗапросовИзМакетов(ИмяМакета, ЭтотОбъект, СведенияОШаблонеСценария);
Возврат СведенияОШаблонеСценария;
КонецФункции
Здесь мы задаем «ИмяМакета», но это начало имени. Внутри процедуры «ЗаполнитьТекстыЗапросовИзМакетов» выполняется заполнение текстов запросов в структуре «СведенияОШаблонеСценария» для каждого типа из используемых типов БД. Заполнение происходит из макетов мастера. Наименования макетов должны соответствовать определенным правилам. Должны быть добавлены макеты для каждого желаемого типа БД. Наименование должно формироваться так: «ШаблонСценария» + «СуффиксТипаБД». Пример: «ШаблонСценарияMSSQL».
Эта функция «СведенияОШаблонеСценария» используется для автоматического заполнения элемента справочника «ХС_ШаблоныШаговСценариев» при нажатии на зеленую круговую стрелку «Обновить шаблон по обработке» на вкладке «Настройки обработки – внешнего мастера».
Сообщить ядру системы какой механизм использовать (старый или новый) нужно в строке:
СведенияОШаблонеСценария = ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария(, ВидШага);
Функция «ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария», пример кода:
Функция СведенияОШаблонеСценария(Знач ВерсияКонфигурации = "", Знач ВидШага = Неопределено)
Первый параметр функции – «ВерсияКонфигурации». Если он не задан или версия мастера < 1.5.2.3, тогда применяется старый механизм, если же параметр задан и версия мастера >= 1.5.2.3, тогда – новый.
Также, если обработка внешняя или нужно заложить такое использование на будущее, тогда необходимо добавить функцию.
Пример кода:
// Информация о внешней обработке
// Используется для подключения ее в виде дополнительной обработки
//
// Возвращаемое значение:
// Структура - параметры внешнего отчета или обработки,
// подробности см. описание функции ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке()
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.7.61");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Информация = "Загрузка файлов из Битрикс";
Возврат ПараметрыРегистрации;
КонецФункции
Пример взят уже из другого мастера «Загрузка файлов из Битрикс». Это внешняя дополнительная обработка.
Также необходимо сконфигурировать форму мастера. На форму мастера из ядра приходят следующие параметры.
Пример кода:
ШаблонШагаСценария
ЗначенияПараметровШаблона
Сценарий
ШагСценария
ШагРодитель
БазаДанных
РежимМастераНастроек
Этот список задается в функции «ХС_НастройкиШаблоновОперацийКлиентСервер.ВходящиеПараметрыМастераНастройкиШаблона». Разработчик сам определяет какие параметры задать в мастере, но минимально потребуются следующие из них.
Пример кода:
ШаблонШагаСценария
ЗначенияПараметровШаблона
РежимМастераНастроек
Соответственно нужно прописать необходимые параметры на форме мастера в конфигураторе в правой части на вкладке «Параметры».

Параметр «РежимМастераНастроек» нужен, когда мастер может работать как обычная обработка, без встраивания в механизмы сценариев. Т.е. работать в двух режимах. В зависимости от этого могут быть показаны или скрыты какие-то элементы формы или организовано ветвление в коде модуля.
Далее необходимо разместить на форме 2 команды: «ЗавершитьЗаполнение» и «ОтменитьЗаполнение». Они будут отображаться на форме как «Готово» и «Отмена» соответственно.
Также необходимо добавить реквизиты формы, в которые мы поместим пришедшие параметры. Этот список определяет сам разработчик.
Пример кода:
ИменаПараметров – СписокЗначений
ШаблонШагаСценария - СправочникСсылка.ХС_ШаблоныШаговСценариев
ШагСценария - СправочникСсылка.ХС_ШагиСценария
Далее нужно добавить следующий код в модуль формы, в процедуру «ПриСозданииНаСервере».
Пример кода:
Если Параметры.РежимМастераНастроек Тогда
ИменаПеременныхШаблонаШага = Справочники.ХС_ШаблоныШаговСценариев.ИменаПеременныхШаблонаШага(Параметры.ШаблонШагаСценария);
ИменаПараметров.ЗагрузитьЗначения(ИменаПеременныхШаблонаШага);
ЗаполнитьРеквизитыЗначениями(Параметры.ЗначенияПараметровШаблона);
ШаблонШагаСценария = Параметры.ШаблонШагаСценария;
КонецЕсли;
Ветвление, пример кода:
Если Параметры.РежимМастераНастроек Тогда
Необходимо, если обработка может быть использована не только в режиме мастера, но и как обработка (вне механизма сценариев). Если обработка используется исключительно в режиме мастера, данное ветвление является избыточным — достаточно оставить только код заполнения реквизитов формы из параметров.
Примерный код процедур команд «ЗавершитьЗаполнение» и «ОтменитьЗаполнение».
Пример кода:
&НаКлиенте
Процедура ЗавершитьЗаполнение(Команда)
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ЗаполненныеПараметры = Новый Структура;
Для Каждого ЭлементСписка Из ИменаПараметров Цикл
ИмяПараметра = ЭлементСписка.Значение;
Попытка
ЗаполненныеПараметры.Вставить(ИмяПараметра, Объект[ИмяПараметра]);
Исключение
КонецПопытки;
КонецЦикла;
ЗаполненныеПараметры.Вставить("БДИдентификатор", Строка(Объект.БазаДанных.УникальныйИдентификатор()));
РезультатРаботыМастера = ХС_НастройкиШаблоновОперацийКлиентСервер.РезультатРаботыМастераНастройкиШаблона();
РезультатРаботыМастера.ШаблонШагаСценария = ШаблонШагаСценария;
РезультатРаботыМастера.ЗначенияПараметровШаблона = ЗаполненныеПараметры;
РезультатРаботыМастера.ТекстЗапроса = ТекстЗапросаИзШаблона(ШаблонШагаСценария, ЗаполненныеПараметры);
ЭтотОбъект.Закрыть(РезультатРаботыМастера);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьЗаполнение(Команда)
Закрыть(Неопределено);
КонецПроцедуры
Блок, который формирует и возвращает «РезультатРаботыМастера», является обязательным.
Далее нужно добавить в обработку макеты, где будут содержаться тексты запросов / скриптов. При этом, если вид шага шаблона – «ЗапросSQL» или «АсинхроннаяОбработкаМастером», тогда для каждого желаемого типа БД нужно указать свой макет. Наименования макетов должны формироваться так: «ШаблонСценария» + «СуффиксТипаБД». Пример: «ШаблонСценарияMSSQL». Если вид шага шаблона – «ПроизвольныйКод1С» или «Запрос1С», тогда нужно добавить макет с наименованием «ШаблонСценария». В этих макетах будет содержаться код, который будет помещен в элемент справочника «ХС_ШаблоныШаговСценариев» при заполнении из мастера.
Также, если нужно какое-то особое отображение (картинка) шага в сценарии, необходимо добавить макет «ИзображениеШаблона». Это макет двоичных данных изображения для шаблона шага сценария, он будет использован при автоматическом заполнении.
Пример текста макета шаблона сценария.
Пример кода:
ИмяТаблицы = "{!ИмяТаблицы!}";
УИД = Новый УникальныйИдентификатор("{!БДИдентификатор!}");
БазаДанных = Справочники.HS_БазыДанных.ПолучитьСсылку(УИД);
ОбработкаОбъект = Обработки.хс_БэкапТаблицыБД.Создать();
ОбработкаОбъект.ИмяТаблицы = ИмяТаблицы;
ОбработкаОбъект.БазаДанных = БазаДанных;
ОбработкаОбъект.БэкапТаблицы();
Новый механизм (версия мастера >= 1.5.2.3)
Необходимый интерфейс модуля объекта должен включать следующие процедуры:
СведенияОШаблонеСценария
ИмяФормыМастераНастроек
Инициализировать
ПолучитьРезультатРаботыМастера
Также, как и в старом варианте. Функция для видов шага «ПроизвольныйКод1С» или «Запрос1С».
Пример кода:
// Возвращает сведения о шаблоне сценария.
//
// Возвращаемое значение:
// Структура - Подробнее см. ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария().
//
Функция СведенияОШаблонеСценария() Экспорт
ВидШага = Перечисления.HS_ВидыШаговСценария.ПроизвольныйКод1С;
СведенияОШаблонеСценария = ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария(1.6.7.2, ВидШага);
СведенияОШаблонеСценария.ТипШага = Перечисления.HS_ТипыШаговСценария.ОбработкаДанных;
СведенияОШаблонеСценария.ВидШага = ВидШага;
СведенияОШаблонеСценария.Наименование = "Кодирование бинарного файла в BASE64";
СведенияОШаблонеСценария.ТекстЗапроса = ЭтотОбъект.ПолучитьМакет("ШаблонСценария").ПолучитьТекст();
Возврат СведенияОШаблонеСценария;
КонецФункции
Функция для видов шага «ЗапросSQL» или «АсинхроннаяОбработкаМастером».
Пример кода:
// Возвращает сведения о шаблоне сценария.
// Используется для установки начальных значений шаблона шагов сценария.
//
// Возвращаемое значение:
// см. ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария
//
Функция СведенияОШаблонеСценария() Экспорт
СведенияОШаблонеСценария = ХС_НастройкиШаблоновОперацийКлиентСервер.СведенияОШаблонеСценария("1.6.5.4");
СведенияОШаблонеСценария.ТипШага = Перечисления.HS_ТипыШаговСценария.ПолучениеИКонтрольДанных;
СведенияОШаблонеСценария.ВидШага = Перечисления.HS_ВидыШаговСценария.ЗапросSQL;
СведенияОШаблонеСценария.Наименование = "Маппинг 2х таблиц с предварительным удалением";
ИмяМакета = "ШаблонСценария";
ХС_НастройкиШаблоновОпераций.ЗаполнитьТекстыЗапросовИзМакетов(ИмяМакета, ЭтотОбъект, СведенияОШаблонеСценария);
Возврат СведенияОШаблонеСценария;
КонецФункции
// Возвращает имя формы мастера настроек шаблона шагов сценария.
//
// Возвращаемое значение:
// Строка
//
Функция ИмяФормыМастераНастроек() Экспорт
Возврат "МастерЗаполненияПараметров";
КонецФункции
// Инициализирует Объект начальными значениями
//
// Параметры:
// ПараметрыИнициализации - Структура - параметры для мастера:
// * КонтекстОкружения - Структура:
// * ШагРодитель - Справочники.ХС_ШагиСценария
// * ШагСценария - Справочники.ХС_ШагиСценария
// * Сценарий - Справочники.HS_Сценарии
// * БазаДанных - СправочникСсылка.HS_БазыДанных
// * РеквизитыШага - Структура - Значения заполнения реквизитов шага (расширяемый):
// * ТипШага - ПеречислениеСсылка.HS_ТипыШаговСценария
// * ТекстЗапроса - Строка
// * ШаблонШага - СправочникСсылка.ХС_ШаблоныШаговСценариев
// * КонфигурацияПортов - Структура - Описание входящих/исходящих портов:
// * Входящие - ТаблицаЗначений - Описание водящих портов:
// * Номер - Число - Номер входящего порта (-1 - зарезервирован под входящий поток управления)
// * Имя - Строка - Имя входящего порта
// * Тип - ПеречислениеСсылка.хс_ТипыПотоковСценария - Тип исходящего порта
// * ИдентификаторПотока - УникальныйИдентификатор
// * Исходящие - ТаблицаЗначений - Описание исходящих портов:
// * Номер - Число - Номер исходящего порта (1 - зарезервирован под исходящий поток управления,
// 0 - зарезервирован под текст запроса)
// * Имя - Строка - Имя исходящего порта
// * Тип - ПеречислениеСсылка.хс_ТипыПотоковСценария - Тип исходящего порта
// * ИдентификаторПотока - УникальныйИдентификатор
// * ДоступныеТипыДанныхПортов - ТаблицаЗначений - Доступные типы данных исходящих портов:
// * Номер - Число - Номер исходящего порта (0 - для всех портов)
// * ТипДанных - ПеречислениеСсылка.хс_ТипыПотоковСценария - Тип данных порта
// * СтруктураДанных - ТаблицаЗначений - Описание структуры исходящих данных:
// * НомерПорта - Число
// * ИмяПоля - Строка
// * ТипПоля - СправочникСсылка.ХС_ТипыДанных
// * КвалификаторыЧисла_Длина - Число
// * КвалификаторыЧисла_Точность - Число
// * КвалификаторыЧисла_Неотрицательное - Булево
// * КвалификаторыСтроки_Длина - Число
// * КвалификаторыСтроки_Фиксированная - Булево
// * ТипПоляХранилище - ХранилищеЗначения - ОписаниеТипов 1С
// * NotNULL - Булево
// * МодификаторыПотоков - ТаблицаЗначений - Описание вносимых в структуру потоков изменений:
// * Поток - УникальныйИдентификатор
// * Поле - Строка
// * ТипМодификатора - ПеречислениеСсылка.хс_ТипыМодификаторовПолейПотока
// * ПараметрыТипа - ХранилищеЗначения - Структура аналогична ТЧ "СтруктураДанных"
// * ПараметрыМастера - Структура - Произвольная (расширяемый)
//
Процедура Инициализировать(Знач ПараметрыИнициализации) Экспорт
Перем РазделяемоеПолеЗначение, РазделительЗначение;
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПараметрыИнициализации.РеквизитыШага);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПараметрыИнициализации.КонтекстОкружения);
ТипБД = хс_РаботаСБазамиДанныхПовтИсп.ТипБазыДанных(БазаДанных);
СхемаБД = хс_РаботаСБазамиДанныхПовтИсп.ИмяСхемы(БазаДанных);
ТипШага = Перечисления.HS_ТипыШаговСценария.ВложенныйЗапрос;
// РазделяемоеПоле
Если ПараметрыИнициализации.ПараметрыМастера.Свойство("РазделяемоеПоле", РазделяемоеПолеЗначение) Тогда
РазделяемоеПоле = РазделяемоеПолеЗначение;
КонецЕсли;
// Разделитель
Если ПараметрыИнициализации.ПараметрыМастера.Свойство("Разделитель", РазделительЗначение) Тогда
Разделитель = РазделительЗначение;
КонецЕсли;
// Входящие порты
ЗагрузитьИсточникИзСоставаПортов(ПараметрыИнициализации.КонфигурацияПортов.Входящие);
// Исходящие порты
ОписаниеИсходящегоПортаВременнаяТаблица =
хс_ПотокиДанных.ОписаниеПортаПоНомеру(2, ПараметрыИнициализации.КонфигурацияПортов.Исходящие);
ИдентификаторИсходящегоПотокаВременнаяТаблица = ОписаниеИсходящегоПортаВременнаяТаблица.ИдентификаторПотока;
Если НЕ ЗначениеЗаполнено(ИдентификаторИсходящегоПотокаВременнаяТаблица) Тогда
ИдентификаторИсходящегоПотокаВременнаяТаблица = Новый УникальныйИдентификатор();
КонецЕсли;
ОписаниеИсходящегоПортаТекстЗапроса =
хс_ПотокиДанных.ОписаниеПортаПоНомеру(3, ПараметрыИнициализации.КонфигурацияПортов.Исходящие);
ИдентификаторИсходящегоПотокаТекстЗапроса = ОписаниеИсходящегоПортаТекстЗапроса.ИдентификаторПотока;
Если НЕ ЗначениеЗаполнено(ИдентификаторИсходящегоПотокаТекстЗапроса) Тогда
ИдентификаторИсходящегоПотокаТекстЗапроса = Новый УникальныйИдентификатор();
КонецЕсли;
СоздатьИсходящийПоток();
КонецПроцедуры
Данная процедура служит для приема параметров из ядра и заполнения различных данных мастера из этих параметров. Содержимое процедуры приведено в качестве примера. Логика её реализации определяется разработчиком.
В старой версии механизма параметры передавались в форму напрямую и анализировались в процедуре модуля формы «ПриСозданииНаСервере». В новой версии в процедуру «ПриСозданииНаСервере» передается «АдресВоВременномХранилище», затем по этому адресу получаются параметры, и запускается процедура модуля объекта мастера «Инициализировать».
Пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если НЕ ЭтоАдресВременногоХранилища(Параметры.АдресВоВременномХранилище) Тогда
Возврат;
КонецЕсли;
ДанныеДляРаботыМастера = ПолучитьИзВременногоХранилища(Параметры.АдресВоВременномХранилище);
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.Инициализировать(ДанныеДляРаботыМастера);
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
Элементы.ИмяПриемника.РедактированиеТекста = ОбработкаОбъект.ПоддерживаетсяТип("Строка");
КонецПроцедуры
// Возвращает результат настроек, выполненных мастером
//
// Возвращаемое значение:
// см. ХС_НастройкиШаблоновОперацийВызовСервера.НовоеОписаниеРезультатаНастройкиШаблона
//
Функция ПолучитьРезультатРаботыМастера() Экспорт
Если ЭтотОбъект.РежимНастройки Тогда
ЭтотОбъект.ВидШага = Перечисления.HS_ВидыШаговСценария.ПроизвольныйКод1С;
ЭтотОбъект.ТипШага = Перечисления.HS_ТипыШаговСценария.ОбработкаДанных;
ЭтотОбъект.ТекстЗапроса = "//Данный шаг используется для настройки";
Иначе
ЭтотОбъект.ВидШага = Перечисления.HS_ВидыШаговСценария.ЗапросSQL;
ЭтотОбъект.ТипШага = Перечисления.HS_ТипыШаговСценария.ОбработкаДанных;
КонецЕсли;
РезультатРаботыМастера = ХС_НастройкиШаблоновОперацийВызовСервера.НовоеОписаниеРезультатаНастройкиШаблона();
РезультатРаботыМастера.ПараметрыПотоков = ПолучитьИзВременногоХранилища(ЭтотОбъект.ПараметрыПотоковВХранилище);
УстановитьРегулируемыеПараметрыПотоков(РезультатРаботыМастера.ПараметрыПотоков);
ЭтотОбъект.НаименованиеПрежнее = ЭтотОбъект.Наименование;
УстановитьДопустимыеТипыПортов();
УстановитьИсходящиеПортыИПотоки();
РезультатРаботыМастера.РеквизитыШага = Новый Структура(ИменаРеквизитовШага);
ЗаполнитьЗначенияСвойств(РезультатРаботыМастера.РеквизитыШага, ЭтотОбъект);
РезультатРаботыМастера.ПараметрыМастера = Новый Структура(ИменаПараметровМастера);
ЗаполнитьЗначенияСвойств(РезультатРаботыМастера.ПараметрыМастера, ЭтотОбъект);
РезультатРаботыМастера.КонфигурацияПортов.Входящие = ЭтотОбъект.ВходящиеПорты.Выгрузить();
РезультатРаботыМастера.КонфигурацияПортов.Исходящие = ЭтотОбъект.ИсходящиеПорты.Выгрузить();
РезультатРаботыМастера.КонфигурацияПортов.ДоступныеТипыПотоковПортов = ЭтотОбъект.ДоступныеТипыПотоковПортов.Выгрузить();
РезультатРаботыМастера.СтруктураДанных = ЭтотОбъект.СтруктураДанных.Выгрузить();
РезультатРаботыМастера.СоздаваемыеПотоки = ЭтотОбъект.СоздаваемыеПотоки.Выгрузить();
ЗаполнитьСписокКомандПользователя(РезультатРаботыМастера.КомандыПользователя);
РезультатРаботыМастера.ОбработчикиВыполнения.Очистить();
НовыйОбработчик = РезультатРаботыМастера.ОбработчикиВыполнения.Добавить();
НовыйОбработчик.ОбъектИсточникСобытия = ЭтотОбъект.ШагСценария;
НовыйОбработчик.ТипСобытия = Перечисления.хс_ТипыСобытийВыполнения.ПоОкончанииВыполнения;
НовыйОбработчик.ОбработчикСобытия = "хс_НастройкаПриемника";
Возврат РезультатРаботыМастера;
КонецФункции
Данная процедура используется в модуле формы мастера для возврата результата работы мастера в ядро. Содержимое процедуры приведено в качестве примера. Логика её реализации определяется разработчиком. Поля структуры «РезультатРаботыМастера» определены в функции «ХС_НастройкиШаблоновОперацийВызовСервера.НовоеОписаниеРезультатаНастройкиШаблона».
В старой версии механизма результат формировался в модуле формы мастера, в новой он формируется в модуле объекта и возвращается в ядро как адрес временного хранилища при выполнении команды «СохранитьЗакрыть».
Пример кода:
&НаКлиенте
Процедура СохранитьЗакрыть(Команда)
ПодтвержденоЗакрытиеФормы = Истина;
ЗафиксироватьНастройкиИЗакрыть();
КонецПроцедуры
&НаКлиенте
Процедура ЗафиксироватьНастройкиИЗакрыть()
РезультатРаботыМастера = ЗавершитьЗаполнениеНаСервере();
ЭтотОбъект.Закрыть(РезультатРаботыМастера);
КонецПроцедуры
&НаСервере
Функция ЗавершитьЗаполнениеНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
РезультатРаботыМастера = ОбработкаОбъект.ПолучитьРезультатРаботыМастера();
РезультатВоВХ = ПоместитьВоВременноеХранилище(РезультатРаботыМастера, Новый УникальныйИдентификатор);
Возврат РезультатВоВХ;
КонецФункции
Аналогично старой версии, при разработке мастера в формате внешней обработки размещается функция «СведенияОВнешнейОбработке».
Пример кода:
// Информация о внешней обработке
// Используется для подключения ее в виде дополнительной обработки
//
// Возвращаемое значение:
// Структура - параметры внешнего отчета или обработки,
// подробности см. описание функции ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке()
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.7.61");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Информация = "Загрузка файлов из Битрикс";
Возврат ПараметрыРегистрации;
КонецФункции
Также необходимо сконфигурировать форму мастера. На форму мастера из ядра приходят следующие параметры.
Пример кода:
АдресВоВременномХранилище
Нужно прописать этот параметр на форме мастера в конфигураторе в правой части на вкладке «Параметры».

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