Как в Конвертации данных 2.1 настроить параметр-список для интерактивного отбора на управляемых формах?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке правил обмена в конфигурации «Конвертация данных 2.1» (КД 2.1) часто возникает задача предоставить пользователю возможность интерактивно выбрать список объектов (например, сотрудников, организаций или номенклатуры) перед началом переноса. На обычных формах для этого использовался встроенный механизм подключаемых обработок настройки параметров диалога. Однако на платформе 1С:Предприятие 8.3 с управляемыми формами разработчики сталкиваются с рядом платформенных ограничений.

Разберем природу этих ограничений и рассмотрим эффективные варианты реализации выборки данных по списку значений или таблице.

Ограничения КД 2.1 на управляемых формах

Проанализируем ключевые особенности работы обработки «Универсальный обмен данными в формате XML» на управляемом интерфейсе:

  1. Недоступность подключаемых обработок настройки параметров: Механизм внешних диалогов для параметров КД2 работает только в толстом клиенте на обычных формах. В управляемом интерфейсе форма параметров не поддерживает вызов произвольных форм настройки для типов СписокЗначений или ТаблицаЗначений.
  2. Серверное выполнение обработчиков правил: Все алгоритмы и события правил обмена (события «Перед выгрузкой данных», обработчики ПВД и ПКО) исполняются исключительно в контексте сервера. Вызвать изнутри обработчика интерактивное окно с вопросом пользователю (например, через ВвестиЗначение или ОткрытьФорму) невозможно.
  3. Ограничение редактирования сложных типов в таблице параметров: В типовой таблице настройки параметров пользователь может комфортно заполнять только простые типы (число, строка, дата, булево) и одиночные ссылки на объекты базы данных.

Для реализации фильтрации по списку значений существует несколько проверенных подходов.

Решение 1. Создание внешней обработки-обертки (рекомендуемый способ)

Наиболее удобным и гибким решением является создание собственной внешней обработки на управляемых формах. В ней пользователю предоставляется табличная часть или список с флажками для выбора нужных элементов, а сам процесс выгрузки запускается программно через объект типовой обработки обмена.

Разберем по шагам реализацию этого механизма:

  1. Создаем внешнюю управляемую обработку. На форму выводим таблицу с выбором сотрудников (например, через динамический список или табличную часть с реквизитами Пометка и Сотрудник).
  2. В обработчике команды выгрузки формируем массив или список выбранных сотрудников и передаем его в объект универсальной выгрузки.

Посмотрим на пример кода серверной процедуры выгрузки:


&НаСервере
Процедура ВыполнитьВыгрузкуНаСервере()

    // 1. Формируем массив выбранных сотрудников
    МассивВыбранных = Новый Массив;
    Для Каждого Стр Из ТаблицаСотрудников Цикл
        Если Стр.Пометка Тогда
            МассивВыбранных.Добавить(Стр.Сотрудник);
        КонецЕсли;
    КонецЦикла;

    Если МассивВыбранных.Количество() = 0 Тогда
        ВызватьИсключение "Не выбрано ни одного сотрудника для переноса!";
    КонецЕсли;

    // 2. Инициализируем обработку выгрузки данных
    ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаВыгрузки.ИмяФайлаПравилОбмена = ПутьКФайлуПравил;
    ОбработкаВыгрузки.ИмяФайлаВыгрузки = ПутьКФайлуДанных;
    ОбработкаВыгрузки.РежимОбмена = "Выгрузка";

    // 3. Загружаем правила обмена
    ОбработкаВыгрузки.ЗагрузитьПравилаОбмена();

    // 4. Передаем массив в параметры правил обмена
    ОбработкаВыгрузки.Параметры.Вставить("СписокСотрудников", МассивВыбранных);

    // 5. Запускаем выгрузку
    ОбработкаВыгрузки.ВыполнитьВыгрузку();

КонецПроцедуры

Решение 2. Использование штатного механизма отборов в ПВД

Если нет необходимости разрабатывать собственную форму, можно воспользоваться штатными возможностями обработки «Универсальный обмен данными XML» без создания дополнительных параметров в КД2.

Рассмотрим, как настроить такой отбор:

  1. В «Конвертации данных 2.1» создаем Правило выгрузки данных (ПВД) со Стандартной выборкой (не используя произвольный алгоритм).
  2. Открываем обработку «Универсальный обмен данными XML» в рабочей базе на управляемых формах и загружаем правила.
  3. На вкладке «Выгружаемые данные» находим строку нужного объекта (например, «Справочник: Сотрудники»).
  4. В правой панели отборов добавляем поле Ссылка с видом сравнения В списке.
  5. Платформа 1С предоставит стандартное диалоговое окно для подбора нужного списка сотрудников по кнопке подбора или построчного добавления.

Решение 3. Передача списка через текстовый параметр

Если требуется использовать произвольный алгоритм выборки данных и только штатную форму обработки выгрузки, список можно передать через строковый параметр.

Разберем реализацию этого варианта:

  1. В КД 2.1 создаем параметр правил с типом Строка (например, СписокТабельныхНомеров) и флагом «Устанавливать в диалоге».
  2. Пользователь вставляет в диалоге список табельных номеров или кодов сотрудников через запятую.
  3. В глобальном обработчике правил «Перед выгрузкой данных» преобразуем строку в массив и помещаем в структуру Параметры.

Посмотрим на пример обработчика «Перед выгрузкой данных»:


Если ЗначениеЗаполнено(Параметры.СписокТабельныхНомеров) Тогда
    МассивКодов = СтрРазделить(Параметры.СписокТабельныхНомеров, ",", Ложь);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Сотрудники.Ссылка КАК Сотрудник
        |ИЗ
        |   Справочник.Сотрудники КАК Сотрудники
        |ГДЕ
        |   Сотрудники.Код В (&МассивКодов)";
    Запрос.УстановитьПараметр("МассивКодов", МассивКодов);
    
    Параметры.Вставить("СписокСотрудников", Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Сотрудник"));
КонецЕсли;

Использование переданного списка в алгоритмах правил

После того как параметр СписокСотрудников передан в структуру параметров выгрузки, его можно применять в обработчиках ПВД и ПКО.

Пример использования в ПВД с произвольным алгоритмом (событие «Перед обработкой правила»):


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Сотрудники.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |   Сотрудники.Ссылка В (&СписокСотрудников)";

Запрос.УстановитьПараметр("СписокСотрудников", Параметры.СписокСотрудников);

ВыборкаДанных = Запрос.Выполнить().Выбрать();
Пока ВыборкаДанных.Следующий() Цикл
    ВыгрузитьПоПравилу(ВыборкаДанных.Ссылка, , , , "Сотрудники");
КонецЦикла;

Пример фильтрации в ПКО зависимых данных (событие «Перед выгрузкой»):


// Если параметр задан, пропускаем выгрузку данных по посторонним сотрудникам
Если Параметры.Свойство("СписокСотрудников") И ЗначениеЗаполнено(Параметры.СписокСотрудников) Тогда
    Если Параметры.СписокСотрудников.Найти(Источник.Сотрудник) = Неопределено Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Если же параметры требуется передать в базу-приемник для использования при загрузке, помните, что программно добавленные параметры не уходят в файл автоматически. Для явной отправки используется метод ПередатьОдинПараметрВПриемник("ИмяПараметра", Значение, "Тип");.

← На главную