Загрузка иерархических данных — одна из классических задач при обмене данными между информационными системами. Часто разработчики сталкиваются с ошибками при попытке последовательной записи элементов из JSON, так как «родитель» может оказаться в файле позже, чем «дочерний» элемент. Рассмотрим, как построить надежный алгоритм для решения этой задачи.
Распространенным подходом является поиск родителя методом НайтиПоНаименованию(). Это ненадежно по двум причинам: во-первых, наименования в справочниках могут дублироваться, а во-вторых, они часто меняются пользователями. В профессиональной разработке 1С для идентификации объектов всегда необходимо использовать Уникальный идентификатор (UUID/GUID). Если источник данных (например, 1С:Документооборот) может предоставить UUID элемента и его родителя, используйте их — это самый быстрый и стабильный способ связи.
Для эффективной обработки данных рекомендуем преобразовать СтруктураJSON в ТаблицаЗначений. Это позволит манипулировать данными в памяти, что значительно быстрее, чем множественное обращение к базе данных в цикле.
Рассмотрим пошаговую логику обработки:
ТаблицаЗначений.УникальныйИдентификатор.Для получения ссылки на объект по его строковому UUID в 1С используется конструктор Новый УникальныйИдентификатор(СтрокаUUID). После этого вы можете получить ссылку с помощью метода Справочники.ИмяСправочника.ПолучитьСсылку(Идентификатор).
Для контроля корректности данных применяйте следующую конструкцию:
// Пример получения объекта по UUID
Попытка
Идентификатор = Новый УникальныйИдентификатор(СтрокаГУИД);
СсылкаНаОбъект = Справочники.Арт_НоменклатурныеГруппы.ПолучитьСсылку(Идентификатор);
Объект = СсылкаНаОбъект.ПолучитьОбъект();
Исключение
// Если объект не найден, обрабатываем ситуацию как создание нового
Объект = Справочники.Арт_НоменклатурныеГруппы.СоздатьЭлемент();
Объект.УстановитьСсылкуНового(СсылкаНаОбъект);
КонецПопытки;
Если в данных JSON поле «Родитель» пустое, это сигнализирует системе, что элемент является корневым. В 1С корневой уровень определяется через Справочники.ИмяСправочника.ПустаяСсылка(). При создании иерархии учитывайте следующее:
СоздатьЭлемент().ЭтоГруппа определяет, является ли элемент «папкой». Если иерархия строится на подчинении элементов друг другу, убедитесь, что свойство ЭтоГруппа установлено верно в соответствии с данными источника.Родитель ссылку на уже созданный объект-родитель.Чтобы избежать медленной записи данных, выполняйте все операции внутри транзакции. Использование методов НачатьТранзакцию() и ЗафиксироватьТранзакцию() сокращает время записи в десятки раз. Кроме того, перед началом цикла загрузки рекомендуется один раз получить все существующие элементы справочника в таблицу, чтобы исключить лишние обращения к базе данных при поиске связей.
Если вы планируете регулярный обмен данными, старайтесь избегать написания ручных парсеров JSON, если это возможно. В корпоративной среде лучше использовать механизмы Плана обмена или Конвертации данных. Однако, если ручная загрузка необходима, используйте предложенный алгоритм: загрузка -> сопоставление по UUID -> запись в транзакции. Это обеспечит надежность и чистоту ваших справочников в 1С.