Как программно выгрузить один элемент справочника по правилам КД 2?

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

При интеграции систем на базе 1С:Предприятие (например, при переносе данных из УТ 10.3 в УТ 11) часто возникает задача: выгрузить не весь массив справочника, а строго один конкретный объект по нажатию кнопки прямо из его формы. При этом логика трансформации данных уже описана в правилах конвертации (КД 2.0 / 2.1).

Попытка просто вручную открывать типовую обработку УниверсальныйОбменДаннымиXML или постоянно перезаписывать файл правил является неудобной и нетехнологичной. Разберем основные архитектурные и программные способы реализации точечной выгрузки одного объекта.

Способ 1. Использование механизма планов обмена

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

Разберем по шагам, как это работает:

  1. В конфигурации-источнике создаем отдельный узел в существующем плане обмена или заводим служебный узел.
  2. По нажатию кнопки в форме справочника регистрируем изменение только для текущего элемента с помощью метода ОбменДанными.ЗарегистрироватьИзменения().
  3. Выгрузка выполняется регламентным заданием в фоновом режиме либо программно вызывается типовая процедура выгрузки для этого узла.
  4. После завершения сеанса обмена регистрация автоматически снимается, а объект сразу попадает в базу-приемник.

Посмотрим на пример кода регистрации элемента на служебном узле:


УзелОбмена = ПланыОбмена.ОбменУправлениеТорговлей103УправлениеТорговлей11.НайтиПоКоду("ТОЧЕЧНЫЙ");
Если ЗначениеЗаполнено(УзелОбмена) Тогда
    ОбменДанными.ЗарегистрироватьИзменения(УзелОбмена, Ссылка);
    Сообщить("Элемент успешно зарегистрирован к выгрузке.");
КонецЕсли;

Способ 2. Программная настройка обработки УниверсальныйОбменДаннымиXML

Если требуется получить именно отдельный файл выгрузки на диске по кнопке, можно программно инициализировать обработку УниверсальныйОбменДаннымиXML, применить правила и наложить точечный отбор через ПостроительОтчета.

Разберем по шагам данный алгоритм:

  1. Создаем объект обработки и указываем путь к файлу правил или загружаем их из общего макета.
  2. Вызываем метод ЗагрузитьПравилаОбмена().
  3. Обходим дерево ТаблицаПравилВыгрузки и отключаем все правила, установив Включить = 0.
  4. Находим строку нужного правила выгрузки данных (ПВД) и активируем ее (Включить = 1).
  5. Настраиваем отбор построителя отчета по конкретной ссылке текущего элемента.
  6. Устанавливаем флаг ИспользоватьОтбор = Истина в строке ПВД, задаем путь к файлу выгрузки и вызываем метод ВыполнитьВыгрузку().

Посмотрим на пример программной реализации:


ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\ExchangeRules.xml";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();

// Отключаем все правила выгрузки
Для Каждого СтрокаПВД Из ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки Цикл
    СтрокаПВД.Включить = 0;
КонецЦикла;

// Ищем правило для нужного справочника
СтрокаНоменклатура = ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки.Найти("Номенклатура", "Имя");
Если СтрокаНоменклатура <> Неопределено Тогда
    СтрокаНоменклатура.Включить = 1;
    
    // Формируем отбор через ПостроительОтчета
    Построитель = Новый ПостроительОтчета;
    Построитель.Текст = "ВЫБРАТЬ _.* ИЗ Справочник.Номенклатура КАК _ {ГДЕ _.Ссылка.* КАК ПолеОтбора}";
    
    Отбор = Построитель.Отбор.Добавить("ПолеОтбора");
    Отбор.ВидСравнения = ВидСравнения.Равно;
    Отбор.Значение = Ссылка;
    Отбор.Использование = Истина;
    
    СтрокаНоменклатура.НастройкиПостроителя = Построитель.ПолучитьНастройки();
    СтрокаНоменклатура.ИспользоватьОтбор = Истина;
КонецЕсли;

ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\ExportObject.xml";
ОбработкаОбмена.ВыполнитьВыгрузку();

Способ 3. Выгрузка через произвольный алгоритм в ПВД

Рассмотрим альтернативный способ, когда есть возможность отредактировать сами правила обмена в конфигурации «Конвертация данных 2.1». Этот метод позволяет избежать динамического конструирования построителя отчета в коде формы.

Разберем процесс настройки:

  1. В правилах конвертации для нужного ПВД переключаем способ выборки данных на «Произвольный алгоритм».
  2. В обработчик ПВД добавляем обращение к передаваемому параметру и вызов встроенной функции конвертации ВыгрузитьПоПравилу().
  3. При программном вызове обработки передаем ссылку на объект через коллекцию Параметры.

Код в обработчике ПВД в правилах обмена:


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

Код кнопки в форме объекта в базе УТ 10.3:


ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\ExchangeRules.xml";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();

// Передаем ссылку в параметры правил
ОбработкаОбмена.Параметры.Вставить("ВыгружаемыйОбъект", ЭтотОбъект.Ссылка);

ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\ExportObject.xml";
ОбработкаОбмена.ВыполнитьВыгрузку();

Важные нюансы: контроль связанных данных и оптимизация

Проанализируем частые проблемы, возникающие при точечной выгрузке объектов по правилам КД 2:

  1. Каскадная выгрузка ссылок. По умолчанию механизмы КД 2 выгружают не только целевой элемент, но и все объекты, на которые он ссылается (значения реквизитов, единицы измерения, ставки НДС, контрагентов, договоры). Если выгружать всё подряд, единичный экспорт может превратиться в перенос половины базы. Чтобы этого не происходило, в правилах конвертации объектов (ПКО) или свойств (ПКС) необходимо устанавливать флаг «Не выгружать объекты свойств источника по ссылкам» или использовать режим «Только получать узел ссылки».
  2. Скорость работы. Чтение файла правил обмена из внешней папки и его разбор (парсинг XML) при каждом нажатии кнопки создают ощутимую задержку для пользователя. Для ускорения процесса рекомендуется хранить текст правил во внутреннем макете конфигурации или кэшировать прочитанные правила в модуле.
  3. Прямая интеграция без промежуточных файлов. Если цель состоит в моментальной доставке объекта в базу УТ 11, вместо формирования XML на диске практичнее использовать HTTP-сервис на стороне УТ 11, передавая сериализованные данные запросом напрямую через объект HTTPСоединение, либо воспользоваться подключением через COMConnector.
← На главную