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