Как интерактивно передать параметры в УниверсальныйОбменДаннымиXML в приёмнике?

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

При работе с механизмом Конвертации данных 2.1 часто возникает ситуация, когда в процессе загрузки данных в базу-приёмник необходимо учитывать дополнительные условия, заданные пользователем интерактивно. Например, нужно указать конкретную номенклатурную группу для всех новых объектов или определить, требуется ли автоматическое проведение документов сразу после загрузки. Стандартная обработка УниверсальныйОбменДаннымиXML отлично справляется с выгрузкой параметров из источника, но передача параметров "на лету" непосредственно в приёмнике (особенно в базовых версиях конфигураций) вызывает сложности.

Основная проблема заключается в том, что при вызове стандартного метода ВыполнитьЗагрузку() происходит внутренняя инициализация (очистка) параметров, из-за чего любые данные, вставленные в коллекцию Параметры программно перед вызовом метода, бесследно исчезают. Разберем несколько эффективных способов решения этой задачи.

Метод 1: Декомпозиция процесса загрузки (Разделение этапов)

Проанализируем работу стандартного метода ВыполнитьЗагрузку(). Внутри него последовательно вызываются функции инициализации, чтения данных и завершения. Чтобы наши параметры не стерлись, мы можем отказаться от использования "монолитного" метода и вызвать его составляющие по отдельности, внедрив свои данные в нужный момент. Это самый "чистый" программный способ, не требующий изменения кода типовой обработки.

Рассмотрим по шагам, как это реализовать в вашей обработке-обёртке:

  1. Создаем экземпляр обработки загрузки.
  2. Вызываем метод подготовки (инициализации).
  3. Вставляем свои параметры в структуру.
  4. Запускаем непосредственное чтение данных.
  5. Выполняем финальные действия (закрытие файлов, очистка стека).

Пример кода реализации этого алгоритма:


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

// Шаг 1: Подготовка к чтению. Именно здесь происходит инициализация внутренних структур.
Загрузка.ВыполнитьДействияПередЧтениемДанных();

// Шаг 2: Теперь, когда инициализация прошла, вставляем наши параметры.
// Они не будут стерты, так как инициализатор уже отработал.
Загрузка.Параметры.Вставить("НоменклатурнаяГруппа", Объект.НоменклатурнаяГруппа);
Загрузка.Параметры.Вставить("ПроводитьДокументы",   Объект.ПроводитьДокументы);

// Шаг 3: Запускаем чтение данных. Обработка будет видеть наши параметры в событиях КД.
Загрузка.ПроизвестиЧтениеДанных();

// Шаг 4: Завершаем работу загрузчика.
Загрузка.ВыполнитьДействияПослеЗавершенияЧтенияДанных();

Важное замечание: При таком подходе в методе ВыполнитьДействияПослеЗавершенияЧтенияДанных() может не сработать автоматическое проведение объектов, если оно завязано на внутренний стек. В этом случае в правилах обмена (в обработчике "После загрузки данных") рекомендуется добавить явный вызов метода ПровестиЗаписьНеЗаписанныхОбъектов().

Метод 2: Программная модификация XML-файла (Инъекция параметров)

Если вы работаете в базовой версии 1С, где любые изменения конфигурации запрещены, а программный доступ к методам обработки может быть ограничен контекстом, можно применить "хитрый" способ. Мы можем программно отредактировать файл обмена перед тем, как отдать его на съедение обработке УниверсальныйОбменДаннымиXML.

Суть заключается в том, что параметры загрузки в XML-файле хранятся в специальной секции. Мы можем прочитать начало файла и вставить туда узел <Параметры>. Тогда стандартная обработка воспримет их как данные, пришедшие из источника.

Выясним, как должна выглядеть структура такой вставки:


// Фрагмент XML, который мы хотим внедрить
// <Параметры>
//     <Параметр Имя="НоменклатурнаяГруппа" Тип="СправочникСсылка.НоменклатурныеГруппы">
//         <Значение>...УИД ссылки...</Значение>
//     </Параметр>
// </Параметры>

Этот способ сложнее в реализации, так как требует работы с ЧтениеXML и ЗаписьXML, но он является самым надежным, так как параметры становятся частью самого потока данных и гарантированно не будут очищены при инициализации обработки.

Метод 3: Использование временного хранилища с фиксированным адресом

Рассмотрим ситуацию, когда мы не хотим возиться с разбором XML. В 1С есть механизм временного хранилища. Несмотря на то, что обработка загрузки работает в своем контексте, мы можем передать данные через Глобальный уникальный идентификатор (GUID).

В обработке-обёртке перед вызовом загрузки мы помещаем структуру параметров в хранилище с фиксированным ключом:


КлючПараметров = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); // Используйте свой фиксированный GUID
ПараметрыДляПередачи = Новый Структура;
ПараметрыДляПередачи.Вставить("НГ", Объект.НоменклатурнаяГруппа);
ПоместитьВоВременноеХранилище(ПараметрыДляПередачи, КлючПараметров);

Затем в самих Правилах обмена (в конфигураторе "Конвертация данных") в обработчике Перед загрузкой данных мы пишем код для извлечения этих данных:


КлючПараметров = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
ДанныеИзОбертки = ПолучитьИзВременногоХранилища(КлючПараметров);
Если ТипЗнч(ДанныеИзОбертки) = Тип("Структура") Тогда
    Параметры.Вставить("НоменклатурнаяГруппа", ДанныеИзОбертки.НГ);
КонецЕсли;

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

Резюме и рекомендации

Мы проанализировали три различных подхода к интерактивной передаче параметров в приёмнике. Выбор конкретного решения зависит от ваших условий:

Помните, что при передаче ссылочных типов (например, СправочникСсылка.НоменклатурныеГруппы) через параметры, необходимо убедиться, что эти типы существуют в обеих базах или корректно обрабатываются в правилах конвертации объектов (ПКО).

← На главную