Как передать произвольную строку или данные из базы-источника в базу-приемник в 1С:Конвертация данных 2?

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

При настройке правил обмена в конфигурации «1С:Конвертация данных 2.1» (КД 2) разработчики часто сталкиваются с задачей, когда в базе-приемнике требуется заполнить реквизит, которого вообще нет в базе-источнике, либо его заполнение требует сложной логики сопоставления. Классический пример: в источнике есть только строковое поле комментария (например, содержащее код бюджетной классификации или произвольный текст «Васька дурак»), а в приемнике этот текст должен превратиться в полноценную ссылку на элемент справочника (например, Контрагенты или ВидыНалоговИПлатежейВБюджет).

В этой статье мы подробно разберем, как правильно передавать произвольную текстовую информацию из источника в приемник, почему стандартные переменные вроде ИсходящиеДанные не попадают в файл XML, и рассмотрим продвинутые сценарии работы с параметрами объектов в КД 2.

Разбор классической ошибки: почему ИсходящиеДанные и ВходящиеДанные не выгружаются в файл?

Начинающие специалисты по интеграции часто пытаются решить задачу «в лоб». В обработчике «Перед выгрузкой» Правила конвертации объекта (ПКО) или свойства (ПКС) они пишут следующий код:


ИсходящиеДанные = Новый Структура; 
ИсходящиеДанные.Вставить("КодБК", "АХАХАХАХА");

Однако при анализе сформированного XML-файла обмена оказывается, что строка «АХАХАХАХА» там полностью отсутствует. Проанализируем ситуацию и выясним причину такого поведения платформы.

Дело в том, что переменные ИсходящиеДанные и ВходящиеДанные в КД 2 спроектированы исключительно как внутренний транспорт в оперативной памяти выгружающего приложения. Они живут только на стороне источника в процессе работы обработки выгрузки и служат для обмена контекстом между обработчиками. Схема их движения строго регламентирована:

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

В сам XML-файл обмена эти структуры не записываются. База-приемник при чтении файла ничего о них не знает. Для того чтобы физически передать данные через файл, нужен принципиально другой механизм — параметры объектов.

Правильное решение: передача произвольных данных через параметры ПКС

Для того чтобы передать строку из источника и прочитать ее при загрузке в приемнике, мы должны использовать специальную опцию в ПКС. Разберем этот процесс по шагам:

  1. Откроем наше ПКО (например, ПКО документа или справочника) в «Конвертации данных».
  2. Перейдем на вкладку «Правила конвертации свойств» (ПКС) и добавим новую строку.
  3. В колонках «Источник» и «Приемник» ничего не выбираем (оставляем их пустыми).
  4. В поле «Имя параметра» пишем понятное имя (например, КодБК).
  5. Важный момент: устанавливаем флаг «Передавать данные в параметр». Это сигнализирует системе, что значение нужно записать в специальный XML-тег внутри выгружаемого объекта.
  6. В обработчике «Перед выгрузкой» этого ПКС пишем код, определяющий передаваемое значение:
    
    Значение = "АХАХАХАХА"; // Здесь может быть обращение к реквизитам источника, например: Источник.Комментарий
    

При выгрузке КД 2 сгенерирует в XML-файле узел следующего вида:

<ЗначениеПараметра Имя="КодБК" Тип="Строка">АХАХАХАХА</ЗначениеПараметра>

Этот параметр будет успешно доставлен в базу-приемник вместе с объектом.

Как прочитать переданный параметр на стороне базы-приемника?

Теперь посмотрим, как использовать переданное значение при загрузке. При чтении файла загрузчик считывает параметры и помещает их в специальную структуру — соответствие ПараметрыОбъекта.

Обратите внимание: обращаться к параметрам следует в обработчиках загрузки ПКО, оптимально — в обработчике «После загрузки». В обработчиках «Перед записью» или «При записи» самого объекта конфигурации эта структура уже будет недоступна, так как управление передается платформенным механизмам записи 1С. Для быстрого ориентирования в доступных переменных обработчиков подойдёт доработанная конфигурация КД 2 с контекстными подсказками.

Рассмотрим пример кода в обработчике «После загрузки» ПКО:


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

Этот код гарантирует, что если параметр был успешно передан, система найдет соответствующий элемент в базе-приемнике и подставит его в создаваемый объект. Для реализации сопоставления по нестандартным полям можно использовать пример настройки поиска объектов по дополнительным реквизитам в КД 2.1.

Альтернативный вариант: декларативный поиск через ПКО

Хотя ручной поиск в обработчике «После загрузки» решает задачу, КД 2 предоставляет более красивый декларативный способ сопоставления объектов по строковому представлению. Мы можем создать отдельное ПКО, которое будет принимать строку на входе и автоматически искать объект в приемнике.

Рассмотрим по шагам реализацию этого подхода:

  1. Создадим ПКО для справочника ВидыНалоговИПлатежейВБюджет (источник оставляем пустым). Назовем его, например, ВидыНалогов_ПоСтроке.
  2. В ПКС этого ПКО добавим реквизит поиска КодБК, установим для него флаг «Поиск». В обработчике «Перед выгрузкой» для этого ПКС напишем: Значение = Источник; // Источником здесь будет выступать переданная строка
  3. В ПКО нашего основного документа для ПКС Налог укажем созданное нами ПКО ВидыНалогов_ПоСтроке в качестве правила конвертации.
  4. В обработчике «Перед выгрузкой» ПКС Налог документа напишем код передачи строки:
    
    Значение = Источник.Комментарий; // Передаем строковое значение комментария в ПКО поиска
    

Таким образом, КД 2 выполнит всю работу по поиску и сопоставлению автоматически, без написания громоздких ручных запросов при загрузке. Это делает архитектуру правил обмена чистой и легко поддерживаемой.

Продвинутый сценарий: передача параметров для строк табличных частей

Иногда возникает необходимость передать специфический строковый параметр не для всего документа целиком, а для каждой строки его табличной части индивидуально. КД 2 поддерживает и эту возможность.

Для реализации этого сценария выполним следующие действия:

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

На стороне приемника при чтении XML-файла КД 2 сформирует в структуре ПараметрыОбъекта массив соответствий для строк табличной части. Имя этого массива формируется автоматически по шаблону: [ИмяТабличнойЧасти] + "ТабличнаяЧасть" (в нашем примере — ТоварыТабличнаяЧасть).

Посмотрим, как прочитать эти строковые параметры строк в обработчике ПКО «После загрузки»:


ПараметрыТЧ = ПараметрыОбъекта.Получить("ТоварыТабличнаяЧасть");
Если ПараметрыТЧ <> Неопределено Тогда
    Для Индекс = 0 По Объект.Товары.Количество() - 1 Цикл
        СтрокаПараметров = ПараметрыТЧ[Индекс];
        Если СтрокаПараметров <> Неопределено Тогда
            ЗначениеПараметраСтроки = СтрокаПараметров.Получить("КомментарийСтроки");
            Если ЗначениеЗаполнено(ЗначениеПараметраСтроки) Тогда
                // Заполняем реквизит текущей строки табличной части в приемнике
                ТекущаяСтрока = Объект.Товары[Индекс];
                ТекущаяСтрока.ДополнительныеСведения = ЗначениеПараметраСтроки;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Передача сложных структур данных через сериализацию в строку

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

Проанализируем пример использования сериализации. На стороне источника в обработчике «Перед выгрузкой» ПКС-параметра пишем:


ДанныеДляПередачи = Новый Структура;
ДанныеДляПередачи.Вставить("СтавкаНДС", 20);
ДанныеДляПередачи.Вставить("КодФилиала", "012");
ДанныеДляПередачи.Вставить("ТипОперации", "Импорт");

// Упаковываем структуру в системную строку 1С
Значение = ЗначениеВСтрокуВнутр(ДанныеДляПередачи);

При загрузке в обработчике ПКО «После загрузки» мы можем легко восстановить исходный объект 1С и прочитать его свойства:


СериализованныеДанные = ПараметрыОбъекта.Получить("СложныеДанные");
Если ЗначениеЗаполнено(СериализованныеДанные) Тогда
    Попытка
        // Восстанавливаем структуру из строки
        ПолученныеДанные = ЗначениеИзСтрокиВнутр(СериализованныеДанные);
        
        // Заполняем реквизиты объекта приемника
        Объект.СтавкаНДС = ПолученныеДанные.СтавкаНДС;
        Объект.Комментарий = "Загружено по филиалу: " + ПолученныеДанные.КодФилиала;
    Исключение
        ЗаписьЖурналаРегистрации("Конвертация", УровеньЖурналаРегистрации.Предупреждение,,, "Не удалось распаковать параметры объекта.");
    КонецПопытки;
КонецЕсли;

Передача параметров в транзакцию записи объекта (использование ДополнительныеСвойства)

Иногда переданные параметры требуются не в момент обработки загрузки КД, а непосредственно при записи или проведении объекта в базе-приемнике (например, в модуле объекта в процедурах ПередЗаписью(), ПриЗаписи() или в подписках на события платформы).

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

Для этого в обработчике ПКО «После загрузки» перенесем данные из параметров КД в свойства объекта:


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

Теперь в конфигурации-приемнике, непосредственно в модуле самого объекта (например, документа), мы можем перехватить это значение в процедуре записи:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ДополнительныеСвойства.Свойство("ЗагруженныйКодБК") Тогда
        ЗначениеКода = ДополнительныеСвойства.ЗагруженныйКодБК;
        // Наша бизнес-логика в конфигурации-приемнике
        ЭтотОбъект.Комментарий = "Код БК при загрузке: " + ЗначениеКода;
    КонецЕсли;
КонецПроцедуры

Использование этого приема позволяет связать гибкость настройки правил «1С:Конвертация данных» с внутренней бизнес-логикой и механизмами проведения принимающей конфигурации. Если созданные правила планируется использовать для регулярной синхронизации, для автоматизации этого процесса по расписанию можно настроить регулярный обмен данными между базами 1С.

Мы подробно изучили различные способы передачи произвольных строковых данных между базами. Понимание разницы между внутренними структурами оперативной памяти (ИсходящиеДанные) и физической передачей через файлы параметров позволяет создавать производительные, масштабируемые и отказоустойчивые правила интеграции в среде 1С.

← На главную