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