При работе с внешними API, особенно использующими стандарты типа FHIR или сложные иерархические каталоги, разработчики часто сталкиваются с проблемой «навигации». JSON по своей природе — это линейная структура данных или дерево, но когда внутри него появляются перекрестные ссылки (например, reference на uuid другого блока), стандартного метода ПрочитатьJSON становится недостаточно для обеспечения быстрого отклика интерфейса.
Многие пытаются загрузить весь JSON в ДеревоЗначений и искать данные перебором. Это приводит к плохой производительности и сложности кода. Навигация — это интерактивный процесс. Когда пользователь выбирает элемент в иерархическом меню, программа должна мгновенно находить связанные данные в другом месте этого же JSON-файла.
Вместо того чтобы постоянно «бегать» по дереву, давайте создадим поисковый индекс в оперативной памяти. Лучшим инструментом для этого является Соответствие. Ключом в нем будет выступать уникальный идентификатор (UUID или fullUrl), а значением — Структура или ФиксированнаяСтруктура с данными ресурса.
Рассмотрим пример формирования такого индекса при чтении JSON:
ИндексРесурсов = Новый Соответствие;
// Предположим, что данные получены через ЧтениеJSON
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
Для Каждого Элемент Из ДанныеJSON.entry Цикл
// Сохраняем доступ к объекту по его уникальному ключу
ИндексРесурсов.Вставить(Элемент.fullUrl, Элемент.resource);
КонецЦикла;
Теперь, имея ИндексРесурсов, вы можете получить любой элемент за константное время, просто обратившись к нему через ИндексРесурсов[СсылкаUUID], не перебирая всё дерево вручную.
Важнейший принцип архитектуры в данном случае — это разделение слоев. Не пытайтесь хранить «всё в одном». Мы разделим задачу на три составляющие:
ДеревоЗначений на форме, которое содержит только иерархию (Заголовки и ссылки). Это «Оглавление».Соответствие, которое мы создали на первом шаге. Это «База данных» вашей обработки в оперативной памяти.Когда пользователь кликает на строку в ДеревеЗначений (например, «02. Карандаши»), срабатывает событие ПриАктивизацииСтроки. В этот момент мы должны выполнить поиск:
Разберем логику обработки события:
// В обработчике события формы
Процедура ДеревоНавигацииПриАктивизацииСтроки(Элемент)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда Возврат; КонецЕсли;
// Получаем UUID из ссылки
ВыбранныйUUID = ТекущаяСтрока.reference;
// Мгновенный поиск в индексе
ДанныеОбъекта = ИндексРесурсов.Получить(ВыбранныйUUID);
Если ДанныеОбъекта <> Неопределено Тогда
// Заполняем область отображения реквизитами из ДанныеОбъекта
ЗаполнитьОбластьПросмотра(ДанныеОбъекта);
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает высокую скорость работы приложения. Пользователь видит дерево как понятное меню, а при клике на любой узел получает данные мгновенно, так как Соответствие в 1С — это высокопроизводительная структура данных. Это также позволяет легко добавлять функционал «истории переходов», просто сохраняя посещенные UUID в массив-стек, что даст пользователю возможность перемещаться «назад» в интерфейсе, как в веб-браузере.
Используя этот метод, вы избавляетесь от необходимости рекурсивного поиска по иерархии и делаете интерфейс профессиональным и отзывчивым, независимо от объема и вложенности исходного JSON-файла.