Как реализовать обмен данными один ко многим в 1С:Конвертация данных

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

При проектировании интеграций между различными конфигурациями 1С мы часто сталкиваемся с ситуацией, когда архитектура данных в базах-участниках обмена существенно различается. Одной из самых сложных задач является реализация обмена по принципу «один ко многим». Рассмотрим классический сценарий: в базе-источнике (например, самописной конфигурации) разработчик объединил функционал нескольких документов в один, разместив данные в разных табличных частях. В базе-приемнике (например, типовой ERP или УТ) для этих целей предусмотрено несколько самостоятельных документов.

Проанализируем ситуацию: стандартные механизмы 1С:Конвертация данных (как версии 2.1, так и 3.0) по умолчанию ориентированы на синхронизацию объектов «один к одному». Основная трудность здесь заключается не столько в переносе полей, сколько в идентификации. Нам необходимо понять, как заставить механизмы БСП (Библиотеки стандартных подсистем) корректно сопоставлять один объект источника с несколькими объектами приемника и не «перетирать» связи в регистре сведений Соответствия объектов информационных баз.

Подход в Конвертации данных 2.1 (Классический метод)

В КД 2.1 решение задачи «один ко многим» строится на использовании событийных обработчиков в правилах выгрузки данных (ПВД) и правилах конвертации объектов (ПКО). Разберем по шагам, как это реализовать.

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


// Пример в ПВД
Для Каждого СтрокаТЧ Из Объект.ТабличнаяЧасть1 Цикл
    // Формируем структуру данных для первого типа документа-приемника
    ПараметрыВыгрузки = Новый Структура;
    ПараметрыВыгрузки.Вставить("Дата", Объект.Дата);
    ПараметрыВыгрузки.Вставить("Организация", Объект.Организация);
    ПараметрыВыгрузки.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
    
    // Вызываем выгрузку по конкретному ПКО
    ВыгрузитьПоПравилу(Объект, , ПараметрыВыгрузки, , "ДокументПриемник_Тип1");
КонецЦикла;

Для Каждого СтрокаТЧ Из Объект.ТабличнаяЧасть2 Цикл
    // Аналогично для второго типа документа
    ВыгрузитьПоПравилу(Объект, , , , "ДокументПриемник_Тип2");
КонецЦикла;

Важный нюанс идентификации: Если мы просто вызовем ВыгрузитьПоПравилу несколько раз для одного и того же объекта-источника, приемник может запутаться, так как УИД (уникальный идентификатор) источника будет везде одинаковым. Чтобы избежать этого, рассмотрим способы разделения поиска:

  1. Поиск по полям (Номер + Дата): В ПКО для документов-приемников добавим суффиксы к номеру. Например, для первого типа документа номер будет «001», для второго — «001-А». Это позволит системе поиска в приемнике найти разные объекты.
  2. Генерация синтетического УИД: В обработчике ПередВыгрузкой ПКО можно программно изменить идентификатор, передаваемый в файл обмена, на основе GUID источника и префикса, специфичного для конкретной части данных.

Подход в Конвертации данных 3.0 (Enterprise Data)

В КД3 ситуация сложнее, так как обмен идет через формат Enterprise Data (XDTO), и механизм БСП жестко завязан на регистр Публичные идентификаторы объектов. Выясним, как обойти ограничение «одна ссылка — один идентификатор».

Разберем процесс работы менеджера обмена. Когда мы выгружаем объект, система вызывает метод ВыгрузитьОбъект. Чтобы реализовать «один ко многим», нам нужно переопределить логику в модуле менеджера обмена (обычно это делается в обработчике ПриОтправкеДанных).

Использование синтетических идентификаторов (GUID): Каждому целевому объекту в приемнике нужен свой уникальный ключ в формате XML. Мы можем генерировать его программно. Посмотрим на логику:

  1. Для каждой смысловой части исходного документа создаем отдельный XDTO-объект.
  2. В качестве идентификатора (GUID) для этого объекта используем результат функции, которая берет GUID исходного документа и добавляет к нему хэш от имени табличной части или типа документа.

Проанализируем пример формирования синтетического GUID:


// Пример логики формирования ключа
ИдентификаторИсточника = Строка(Объект.Ссылка.УникальныйИдентификатор());
КлючСвязи = "Часть_1_"; // Префикс для первой части
НовыйGUID = ПолучитьGUIDИзСтроки(КлючСвязи + ИдентификаторИсточника);

Такой подход гарантирует, что механизм БСП в базе-приемнике создаст N записей в регистре сведений, сопоставляя один объект источника (через разные строковые идентификаторы в XML) с разными ссылками в приемнике.

Работа с регистром «Соответствия объектов информационных баз»

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

Как направить БСП в нужное русло:

Чтобы успешно реализовать схему «один ко многим», необходимо обеспечить уникальность Идентификатора объекта обмена (входящего GUID из XML). Поскольку в регистре БСП идентификатор из другой базы является частью уникального ключа (измерения), система позволит хранить несколько записей для одной локальной ссылки источника, если у них будут разные внешние GUID.

Альтернативный вариант: Использование промежуточного объекта

Рассмотрим еще один надежный способ, который часто применяется в сложных проектах. Если логика расщепления данных слишком громоздкая для написания в правилах обмена, можно использовать «Технический документ».

  1. В базе-приемнике создается документ, структура которого полностью идентична документу-источнику (один к одному).
  2. Обмен настраивается типовым образом, без сложных алгоритмов.
  3. В базе-приемнике создается подписка на событие ПриЗаписи для этого технического документа.
  4. Внутри обработчика подписки пишется код, который на основании данных «техдока» создает или обновляет N реальных документов системы (ERP/УТ).

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

Подведем итог: реализация обмена «один ко многим» требует отхода от автоматической генерации правил. Основной секрет успеха кроется в управлении уникальностью идентификаторов. Используйте синтетические GUID или модифицированные ключевые поля поиска, чтобы механизмы БСП могли однозначно идентифицировать каждую часть «разваленного» документа.

← На главную