Как организовать удобную навигацию по сложным вложенным JSON-структурам в 1С?

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

При работе с внешними API, особенно использующими стандарты типа FHIR или сложные иерархические каталоги, разработчики часто сталкиваются с проблемой «навигации». JSON по своей природе — это линейная структура данных или дерево, но когда внутри него появляются перекрестные ссылки (например, reference на uuid другого блока), стандартного метода ПрочитатьJSON становится недостаточно для обеспечения быстрого отклика интерфейса.

Понимание проблемы: почему обычное дерево не подходит?

Многие пытаются загрузить весь JSON в ДеревоЗначений и искать данные перебором. Это приводит к плохой производительности и сложности кода. Навигация — это интерактивный процесс. Когда пользователь выбирает элемент в иерархическом меню, программа должна мгновенно находить связанные данные в другом месте этого же JSON-файла.

Шаг 1: Создание «плоского» индекса данных

Вместо того чтобы постоянно «бегать» по дереву, давайте создадим поисковый индекс в оперативной памяти. Лучшим инструментом для этого является Соответствие. Ключом в нем будет выступать уникальный идентификатор (UUID или fullUrl), а значением — Структура или ФиксированнаяСтруктура с данными ресурса.

Рассмотрим пример формирования такого индекса при чтении JSON:


ИндексРесурсов = Новый Соответствие;
// Предположим, что данные получены через ЧтениеJSON
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);

Для Каждого Элемент Из ДанныеJSON.entry Цикл
    // Сохраняем доступ к объекту по его уникальному ключу
    ИндексРесурсов.Вставить(Элемент.fullUrl, Элемент.resource);
КонецЦикла;

Теперь, имея ИндексРесурсов, вы можете получить любой элемент за константное время, просто обратившись к нему через ИндексРесурсов[СсылкаUUID], не перебирая всё дерево вручную.

Шаг 2: Разделение логики: навигация vs представление

Важнейший принцип архитектуры в данном случае — это разделение слоев. Не пытайтесь хранить «всё в одном». Мы разделим задачу на три составляющие:

  1. Дерево навигации: Специализированное ДеревоЗначений на форме, которое содержит только иерархию (Заголовки и ссылки). Это «Оглавление».
  2. Объектный кэш: То самое Соответствие, которое мы создали на первом шаге. Это «База данных» вашей обработки в оперативной памяти.
  3. Область просмотра: Отдельный элемент на форме (или вторая таблица), куда выводятся данные из кэша при клике на элемент дерева.

Шаг 3: Реализация интерактивного перехода

Когда пользователь кликает на строку в ДеревеЗначений (например, «02. Карандаши»), срабатывает событие ПриАктивизацииСтроки. В этот момент мы должны выполнить поиск:

Разберем логику обработки события:


// В обработчике события формы
Процедура ДеревоНавигацииПриАктивизацииСтроки(Элемент)
    ТекущаяСтрока = Элемент.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда Возврат; КонецЕсли;
    
    // Получаем UUID из ссылки
    ВыбранныйUUID = ТекущаяСтрока.reference;
    
    // Мгновенный поиск в индексе
    ДанныеОбъекта = ИндексРесурсов.Получить(ВыбранныйUUID);
    
    Если ДанныеОбъекта <> Неопределено Тогда
        // Заполняем область отображения реквизитами из ДанныеОбъекта
        ЗаполнитьОбластьПросмотра(ДанныеОбъекта);
    КонецЕсли;
КонецПроцедуры

Почему это удобно?

Такой подход обеспечивает высокую скорость работы приложения. Пользователь видит дерево как понятное меню, а при клике на любой узел получает данные мгновенно, так как Соответствие в 1С — это высокопроизводительная структура данных. Это также позволяет легко добавлять функционал «истории переходов», просто сохраняя посещенные UUID в массив-стек, что даст пользователю возможность перемещаться «назад» в интерфейсе, как в веб-браузере.

Используя этот метод, вы избавляетесь от необходимости рекурсивного поиска по иерархии и делаете интерфейс профессиональным и отзывчивым, независимо от объема и вложенности исходного JSON-файла.

← На главную