При работе с инструментом «Конвертация данных 2.1» (КД 2.1) программисты часто сталкиваются с задачей, когда необходимо выгрузить не все объекты определенного типа, а только конкретный перечень, подготовленный пользователем или отобранный по сложной логике. В стандартном интерфейсе настройки параметров КД выбор типа данных ограничен базовыми типами, и такие структуры, как СписокЗначений или ТаблицаЗначений, в выпадающем списке отсутствуют. Однако архитектура конверсии позволяет реализовать такую выгрузку несколькими эффективными способами.
В этой статье мы подробно разберем, как передать список объектов для выгрузки, как настроить правила выгрузки данных (ПВД) и какие нюансы работы в разных режимах клиента 1С стоит учитывать.
Прежде чем приступать к написанию программного кода, проверим возможности типового функционала. Самый простой способ дать пользователю возможность выбрать список контрагентов (или других объектов) — это использование стандартного построителя отчетов, встроенного в обработку УниверсальныйОбменДаннымиXML.
Проанализируем шаги, которые необходимо выполнить в конфигурации «Конвертация данных»:
Теперь в самой обработке выгрузки на вкладке «Отборы» мы увидим наш объект. Выберем поле «Ссылка», установим вид сравнения «В списке» и подберем нужных контрагентов. Этот метод идеально подходит, если отбор производится вручную бухгалтером непосредственно перед запуском обмена.
Важное замечание: если вы работаете в Тонком клиенте, стандартная обработка может скрывать часть интерфейса отборов. Для полноценной работы с интерактивными отборами рекомендуется запускать базу в режиме Толстого клиента или использовать современные версии обработки выгрузки из состава БСП.
Если задача требует более автоматизированного подхода (например, список формируется сложным запросом во внешней обработке), мы можем управлять процессом выгрузки программно. Рассмотрим ситуацию, когда у нас есть готовый СписокЗначений и мы хотим передать его в параметры конверсии.
Хотя в интерфейсе КД 2.1 нельзя выбрать тип СписокЗначений для параметра, мы можем создать параметр с пустым типом (произвольный тип). Проанализируем пример кода, который создает объект обработки выгрузки и наполняет его параметры:
// Создаем экземпляр обработки обмена
оОбмен = Обработки.УниверсальныйОбменДаннымиXML.Создать();
// Устанавливаем режим выгрузки
оОбмен.РежимОбмена = "Выгрузка";
оОбмен.ИмяФайлаПравилОбмена = "C:\Rules\MyRules.xml";
оОбмен.ИмяФайлаОбмена = "C:\Exchange\Data.xml";
// Загружаем правила для инициализации структуры параметров
оОбмен.ЗагрузитьПравилаОбмена();
// Передаем наш список в параметры конверсии
// Параметр "СписокДляВыгрузки" должен быть создан в правилах КД (без указания типа)
оОбмен.Параметры.Вставить("СписокДляВыгрузки", МойПодготовленныйСписокКонтрагентов);
// Запускаем выгрузку
оОбмен.ВыполнитьВыгрузку();
При таком подходе в самих правилах (в КД) в обработчиках ПВД или ПКО мы сможем обращаться к этому списку через глобальную переменную Параметры.СписокДляВыгрузки.
Когда нам нужно полностью контролировать процесс выборки, мы используем режим «Произвольный алгоритм» в ПВД. Это дает максимальную гибкость. Разберем алгоритм действий:
1. В правилах выгрузки данных (ПВД) для конкретного объекта установим способ выборки «Произвольный алгоритм».
2. В обработчике «Перед обработкой» напишем код, который будет использовать переданный нами параметр. Если параметр содержит список ссылок, мы просто переберем их и вызовем принудительную выгрузку каждого объекта.
Пример кода в обработчике ПВД «Перед обработкой»:
// Проверяем, передан ли список в параметры
Если Параметры.Свойство("СписокДляВыгрузки") И ТипЗнч(Параметры.СписокДляВыгрузки) = Тип("СписокЗначений") Тогда
Для Каждого ЭлементСписка Из Параметры.СписокДляВыгрузки Цикл
// Выгружаем объект по конкретному правилу конверсии объектов (ПКО)
// Объектом может быть ссылка на контрагента
ВыгрузитьПоПравилу(ЭлементСписка.Значение, , , , "Контрагенты");
КонецЦикла;
КонецЕсли;
// Устанавливаем Отказ, чтобы стандартная выборка (которой нет) не запускалась
Отказ = Истина;
В данном случае функция ВыгрузитьПоПравилу является ключевой. Она позволяет игнорировать стандартные механизмы выборки и выгружать только то, что необходимо нам «здесь и сейчас».
Важно помнить, что при использовании COM-соединения или обмена через файлы, сложные типы данных (такие как ТаблицаЗначений) могут вести себя нестабильно при передаче в параметры «напрямую». Выясним причины и рассмотрим обходной путь.
Если вы сталкиваетесь с тем, что параметр «теряется» или очищается при загрузке правил, попробуйте воспользоваться сериализацией. Вы можете преобразовать список в строку и передать её как обычный текст:
// Преобразование списка в строку (в вашей обработке)
ЗначениеПараметра = ЗначениеВстрокуВнутр(МойСписок);
оОбмен.Параметры.Вставить("СписокСтрокой", ЗначениеПараметра);
Затем в правилах конверсии в обработчике «Перед выгрузкой данных» (глобальный обработчик) выполните обратное преобразование:
// Восстановление списка из строки в правилах КД
Если Параметры.Свойство("СписокСтрокой") Тогда
Параметры.Вставить("СписокОбъектов", ЗначениеИзСтрокиВнутр(Параметры.СписокСтрокой));
КонецЕсли;
Резюмируем: для реализации выгрузки по списку в КД 2.1 наиболее правильным путем является либо использование стандартных отборов (в режиме Толстого клиента), либо программная установка параметров через внешнюю обработку с использованием метода ВыгрузитьПоПравилу. Это позволяет сохранить прозрачность правил и обеспечить пользователю удобный интерфейс подбора данных.