Как перенести полную иерархию элементов при обмене между 1С:ERP и 1С:Документооборот?

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

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

Анализ структуры данных и причины «обрыва» иерархии

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

В случае с «Объектами строительства», ситуация осложняется тем, что признак ЭтоГруппа отсутствует. Весь справочник состоит из элементов. Нам нужно реализовать логику, при которой система будет понимать: если у элемента есть подчиненные — это должна быть «Папка проекта», если это конечный узел — это должен быть «Проект».

Решение 1. Настройка рекурсивного вызова ПКО для родителей

Рассмотрим самый надежный способ — настройку ПКО таким образом, чтобы оно вызывало само себя для каждого уровня иерархии. Для этого нам потребуется создать два основных правила:

  1. ПКО_ОбъектыСтроительства_В_Проекты — для конечных элементов.
  2. ПКО_ОбъектыСтроительства_В_Папки — для всех родительских узлов.

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

Решение 2. Использование программного обработчика «Перед выгрузкой»

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

Посмотрим на пример кода, который поможет «протащить» иерархию:


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

// Убедимся, что объект не просто передает ссылку, а выгружается целиком
ВыгружатьОбъект = Истина;

В данном коде функция ВыгрузитьПоПравилу инициирует процесс выгрузки родительского объекта еще до того, как текущий объект будет записан в файл обмена. Это гарантирует, что при загрузке в базу-приемник (Документооборот) родитель уже будет существовать, и связь не потеряется.

Решение 3. Сопоставление иерархии элементов и папок в Документообороте

Важно помнить, что в 1С:Документооборот 2.1 связь проекта с его папкой часто осуществляется не через стандартный реквизит Родитель, а через специализированный реквизит, например, ПроектнаяГруппа. Рассмотрим настройку ПКС для такого случая:

  1. В ПКО для справочника Проекты создаем ПКС, где Источник — Родитель (из ERP), а Приемник — ПроектнаяГруппа или Папка (в ДО).
  2. В этом ПКС обязательно указываем правило конвертации, которое переносит объекты в справочник Папки проектов.
  3. Устанавливаем флаг «Поиск», чтобы система могла сопоставить существующие папки по наименованию или уникальному идентификатору.

Проанализируем ситуацию с поиском. Если мы переносим иерархию, крайне важно в полях поиска для папок указывать не только Наименование, но и Родитель. Это предотвратит «схлопывание» структуры, когда папки с одинаковыми именами, но в разных ветках, объединяются в одну.

Решение 4. Обработка признака «ЭтоГруппа» в иерархии элементов

Выясним причину, по которой стандартные механизмы могут давать сбой. Если справочник в ERP имеет вид «Иерархия элементов», то системное поле ЭтоГруппа всегда будет иметь значение Ложь. Чтобы КД 2.1 корректно обрабатывала такие объекты, воспользуемся следующим алгоритмом:

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    ОбъектыСтроительства.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.ОбъектыСтроительства КАК ОбъектыСтроительства
    |ГДЕ
    |    ОбъектыСтроительства.Родитель = &ТекущийОбъект";

Запрос.УстановитьПараметр("ТекущийОбъект", Источник);
РезультатЗапроса = Запрос.Выполнить();

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

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

Важные рекомендации по настройке ПКС

При работе с иерархией в КД 2.1 следует обратить внимание на следующие параметры в ПКС для родителя:

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

← На главную