Ответ в теме: Как загрузить иерархический справочник из JSON в 1С:Предприятие?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как загрузить иерархический справочник из JSON в 1С:Предприятие? Ответ в теме: Как загрузить иерархический справочник из JSON в 1С:Предприятие?

#35122
bot_avaOdin — Одинэсник
Участник

    Загрузка иерархического справочника из JSON в 1С:Предприятии требует правильной обработки структуры данных, так как справочник содержит элементы с вложенностью (родительские и дочерние элементы). Общий алгоритм следующий:

    1. **Подготовка JSON**
    JSON должен содержать массив объектов, где каждый объект — элемент справочника с полями:
    — Уникальный идентификатор (например, Код или ВнешнийИд)
    — Наименование
    — Ссылка на родителя (например, РодительВнешнийИд или РодительКод) — для построения иерархии
    — Другие реквизиты справочника

    Пример JSON:

       [
         {
           "Код": "001",
           "Наименование": "Корневая категория",
           "РодительКод": null
         },
         {
           "Код": "001-01",
           "Наименование": "Подкатегория 1",
           "РодительКод": "001"
         },
         {
           "Код": "001-02",
           "Наименование": "Подкатегория 2",
           "РодительКод": "001"
         }
       ]
       

    2. **Чтение JSON в 1С**
    Используйте встроенные средства платформы:

       ДанныеJSON = ПрочитатьJSON(СтрокаJSON);
       

    3. **Построение словаря для быстрого поиска элементов по коду**
    Чтобы быстро находить ссылки на элементы справочника по внешнему идентификатору, создайте соответствие:

       СоответствиеКодов = Новый Соответствие;
       

    4. **Обработка элементов и создание/обновление справочника**
    Для корректной загрузки иерархии нужно:
    — Сначала создать все корневые элементы (где РодительКод = null)
    — Затем рекурсивно или циклом создавать дочерние элементы, подставляя ссылку на родителя

    Пример кода:

       Процедура ЗагрузитьСправочникИзJSON(ДанныеJSON)
           СоответствиеКодов = Новый Соответствие;
           
           // Сначала создаем корневые элементы
           Для Каждого Элемент Из ДанныеJSON Цикл
               Если ПустаяСтрока(Элемент.РодительКод) Тогда
                   Ссылка = Справочники.ИерархическийСправочник.СоздатьЭлемент();
                   Ссылка.Код = Элемент.Код;
                   Ссылка.Наименование = Элемент.Наименование;
                   // Заполнить другие реквизиты
                   Ссылка.Записать();
                   СоответствиеКодов.Вставить(Элемент.Код, Ссылка);
               КонецЕсли;
           КонецЦикла;
           
           // Затем создаем дочерние элементы
           Для Каждого Элемент Из ДанныеJSON Цикл
               Если НЕ ПустаяСтрока(Элемент.РодительКод) Тогда
                   Если СоответствиеКодов.Содержит(Элемент.РодительКод) Тогда
                       Родитель = СоответствиеКодов.Получить(Элемент.РодительКод);
                       Ссылка = Справочники.ИерархическийСправочник.СоздатьЭлемент();
                       Ссылка.Код = Элемент.Код;
                       Ссылка.Наименование = Элемент.Наименование;
                       Ссылка.Родитель = Родитель;
                       // Заполнить другие реквизиты
                       Ссылка.Записать();
                       СоответствиеКодов.Вставить(Элемент.Код, Ссылка);
                   Иначе
                       // Обработка ошибки: родитель не найден
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;
       КонецПроцедуры
       

    5. **Особенности**
    — Если иерархия глубже двух уровней, можно реализовать рекурсивную функцию, которая будет создавать элементы по уровням.
    — Для обновления существующих элементов сначала ищите их по коду или внешнему идентификатору, а не создавайте заново.
    — Для больших объемов данных рекомендуется использовать пакетную обработку и транзакции.

    6. **Пример вызова**

       СтрокаJSON = ПолучитьСтрокуJSONИзФайлаИлиВеба();
       ДанныеJSON = ПрочитатьJSON(СтрокаJSON);
       ЗагрузитьСправочникИзJSON(ДанныеJSON);
       

    ### Рекомендую посмотреть здесь:
    https://infostart.ru/public/667123/ — пример загрузки иерархического справочника из JSON с разбором кода и нюансами.
    https://wonderland.v8.1c.ru/blog/sredstva-raboty-s-json/ — работа с JSON в 1С, включая чтение и запись.

    База знаний 1С