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

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

При переносе данных между базами 1С через XML или Web-сервисы часто возникает необходимость создания групп в иерархических справочниках. Многие разработчики сталкиваются с вопросом: как корректно выстроить дерево групп, не зная заранее уровня вложенности? Попытки использовать рекурсию для обхода дерева часто приводят к запутанному коду, зависимому от структуры XML. Давайте разберем, как решить эту задачу более изящным и надежным способом — через использование уникальных идентификаторов (GUID).

Почему рекурсия — не самый лучший путь?

Когда мы пытаемся строить иерархию, «шагая» по элементам XML, мы попадаем в ловушку жесткой структуры файла. Если порядок элементов изменится, или в данных появится неожиданный уровень вложенности, наш алгоритм перестанет работать. Более того, при загрузке данных нам важно не «путь» построить, а просто указать объекту, кто является его родителем. В 1С иерархия определяется полем Родитель, которое должно содержать ссылку на родительский объект.

Решение через использование УникальныйИдентификатор

Самый профессиональный подход при обмене данными — использовать GUID (глобально уникальный идентификатор). Он позволяет однозначно идентифицировать объект в любой базе 1С. Вместо того чтобы полагаться на последовательность создания групп, мы можем просто «связать» их, используя идентификаторы.

Рассмотрим, как реализовать этот механизм:

  1. При выгрузке данных из исходной базы обязательно включайте в XML идентификатор родителя для каждой группы.
  2. При загрузке во вторую базу используйте метод ПолучитьСсылку() с объектом УникальныйИдентификатор.
  3. Если элемент еще не создан, используйте метод УстановитьСсылкуНового(). Это позволит «зафиксировать» идентификатор объекта в новой базе точно таким же, каким он был в исходной.

Пример кода для загрузки с использованием GUID

Рассмотрим пример того, как можно безопасно создать объект, имея его GUID. Этот код позволяет нам не заботиться о том, создали ли мы уже родителя — мы просто оперируем ссылками.


// Предположим, у нас есть строка с GUID из XML
ГУИД_Строкой = ПолученныйИзXML_GUID;

// Пробуем получить существующую ссылку
СсылкаНаНоменклатуру = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИД_Строкой));

Попытка
    ОбъектПоСсылке = СсылкаНаНоменклатуру.ПолучитьОбъект();
Исключение
    ОбъектПоСсылке = Неопределено;
КонецПопытки;

Если ОбъектПоСсылке = Неопределено Тогда
    // Объект еще не существует, создаем новый
    ОбъектПоСсылке = Справочники.Номенклатура.СоздатьГруппу();
    ОбъектПоСсылке.УстановитьСсылкуНового(Новый УникальныйИдентификатор(ГУИД_Строкой));
КонецЕсли;

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

ОбъектПоСсылке.Записать();

Преимущества данного метода

Советы по реализации

Чтобы максимально упростить процесс, рекомендуем сначала загрузить все объекты (создать их в базе по их GUID), а уже затем, при необходимости, выполнить второй проход по данным для простановки ссылок на родителей, если это не удалось сделать за один раз. Это позволит избежать лишних проверок и ошибок при записи.

Используя конструкцию УстановитьСсылкуНового, вы фактически говорите системе: «Этот объект в этой базе должен иметь именно такой ID». Это фундаментальный принцип интеграции в 1С, который открывает широкие возможности для синхронизации справочников любого уровня сложности.

← На главную