При переходе с обычных форм на управляемые многие разработчики сталкиваются с тем, что привычный интерфейс настройки выгрузки в Конвертации данных 2.1 (КД 2.1) претерпел изменения. В обычном приложении обработка УниверсальныйОбменДаннымиXML позволяла легко интерактивно выбирать объекты. В управляемом интерфейсе стандартная обработка часто ограничивает пользователя простыми отборами, и задача «выгрузить вот этот конкретный список документов» становится нетривиальной. Рассмотрим подробнее, как обойти эти ограничения, используя внутренние механизмы КД 2.1.
Разберем ситуацию: нам необходимо передать в правила обмена массив ссылок, выбранных пользователем вручную. Первая мысль, которая возникает у разработчика — создать параметр в конфигурации конвертации. Однако при попытке указать тип данных для параметра мы обнаруживаем, что КД 2.1 не позволяет выбрать тип Массив или СписокЗначений через визуальный конструктор. Доступны только примитивные типы или ссылки на объекты метаданных.
Для решения этой задачи мы проанализируем три основных подхода: использование программной инициализации параметров, применение подключаемых обработок с формами настройки и метод сериализации списка в строку.
Выясним причину, по которой визуальный конструктор нас ограничивает. На самом деле структура Параметры в КД 2.1 — это обычное соответствие (или структура), в которую мы можем программно поместить любой тип данных платформы 1С, включая ТаблицуЗначений или Массив.
Рассмотрим алгоритм реализации через обработчик «Перед выгрузкой данных» на уровне всей конвертации:
СписокДокументовДляВыгрузки и типом Строка (в качестве заглушки).
// Пример инициализации в обработчике "Перед выгрузкой данных" конвертации
Если Не Параметры.Свойство("СписокДокументов") Тогда
Параметры.Вставить("СписокДокументов", Новый Массив);
КонецЕсли;
// Здесь может быть логика заполнения массива, например, из внешней обработки
// или программный вызов диалога (если выгрузка идет в интерактивном режиме)
После того как массив создан, мы можем использовать его в Правилах выгрузки данных (ПВД). Для этого в ПВД следует выбрать способ выборки «Произвольный запрос» и прописать условие в тексте запроса:
ВЫБРАТЬ
Ссылка
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
Ссылка В (&СписокДокументов)
Посмотрим на ситуацию со стороны пользователя, которому нужно физически нажать кнопку «Подобрать» и отметить галочками документы. Для этого в КД 2.1 существует механизм «Подключаемые обработки». Это внешние обработки (файлы .epf), которые внедряются внутрь XML-файла правил.
Разберем по шагам, как это настроить:
Важный момент: в управляемом приложении выгрузка обычно происходит на сервере. Поэтому для открытия формы нам нужно вмешаться в процесс до начала самой выгрузки. Рассмотрим пример вызова метода подключаемой обработки:
// Обращение к методу подключаемой обработки
// ИмяОбработки — это имя, заданное на закладке "Подключаемые обработки"
ДопОбработки.ИмяВашейОбработки.ОткрытьФормуВыбора(Параметры);
Внутри формы обработки мы можем заполнить параметр Параметры.СписокДокументов, который затем подхватит ПВД с произвольным запросом. Однако помните, что открытие формы в серверном обработчике невозможно. Интерактивные действия должны быть вынесены в отдельный этап настройки перед запуском процесса обмена.
Если нам нужно передать список документов в условиях, когда мы не можем напрямую управлять типами данных (например, при передаче параметров между базами или через веб-сервисы), проанализируем метод сериализации.
Суть метода заключается в том, что массив ссылок превращается в длинную строку (например, через запятую или в формат JSON/XML), передается как обычный строковый параметр, а перед самой выгрузкой превращается обратно в массив.
Шаг 1. Подготовка строки на стороне отправителя:
// Преобразуем массив ссылок в строку ГУИДов
СтрокаСсылок = "";
Для Каждого СсылкаИзСписка Из ВыбранныеДокументы Цикл
СтрокаСсылок = СтрокаСсылок + Строка(СсылкаИзСписка.УникальныйИдентификатор()) + ";";
КонецЦикла;
Параметры.МойСписокДокументовСтрокой = СтрокаСсылок;
Шаг 2. Восстановление массива в ПВД (Перед выгрузкой):
// В обработчике ПВД "Перед обработкой"
МассивСсылок = Новый Массив;
ЧастиСтроки = СтрРазделить(Параметры.МойСписокДокументовСтрокой, ";", Ложь);
Для Каждого ГУИДСтрокой Из ЧастиСтроки Цикл
Если ПустаяСтрока(ГУИДСтрокой) Тогда Продолжить; КонецЕсли;
СсылкаНаДок = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИДСтрокой));
МассивСсылок.Добавить(СсылкаНаДок);
КонецЦикла;
// Устанавливаем параметр запроса
Запрос.УстановитьПараметр("СписокДокументов", МассивСсылок);
Проанализируем ситуацию, когда список документов для переноса очень велик (тысячи объектов). Передача такого объема данных через параметр В (&Массив) может привести к деградации производительности запроса в СУБД.
В этом случае эффективнее использовать Временные таблицы. Мы можем создать таблицу значений, загрузить в неё ссылки и передать эту таблицу в менеджер временных таблиц запроса внутри ПВД.
Рассмотрим пример кода в ПВД:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// Предположим, Параметры.ТЗ_Документов уже содержит колонку "Ссылка"
Запрос.Текст = "ВЫБРАТЬ Т.Ссылка ПОМЕСТИТЬ ВТ_Выборка ИЗ &ТЗ КАК Т";
Запрос.УстановитьПараметр("ТЗ", Параметры.ТЗ_Документов);
Запрос.Выполнить();
// Основной запрос ПВД
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Ссылка В (ВЫБРАТЬ Ссылка ИЗ ВТ_Выборка)";
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
При работе в режиме управляемого приложения рекомендуем придерживаться следующей стратегии:
УниверсальныйОбменДаннымиXML. Это затруднит обновление правил и поддержку обмена.Перед выгрузкой данных.Таким образом, несмотря на визуальные ограничения конструктора КД 2.1, программные интерфейсы 1С позволяют реализовать любой сценарий подбора данных, обеспечивая гибкость и удобство для конечного пользователя.