При разработке карточек оборудования и сложных технических объектов часто возникает задача вывести структурированные характеристики в поле HTML-документа или табличный макет. Например, требуется разделить общие параметры по логическим блокам: характеристики процессора, параметры оперативной памяти, накопители и сетевые интерфейсы. В процессе реализации разработчики нередко сталкиваются с критическими ошибками платформы при настройке иерархии справочников, а также с задвоением или некорректным обходом записей в запросе. Разберем по шагам, как исправить системные сбои в метаданных, грамотно составить запрос с иерархическими итогами и вывести сгруппированные данные.
Одной из распространенных проблем при изменении структуры метаданных является появление критических ошибок при создании элементов или открытии форм справочника. Проанализируем, почему это происходит:
Иерархический справочник, но при этом ранее стояла галочка Ограничивать количество уровней, в метаданных может сохраниться некорректная конфигурационная связка. Для исправления ситуации включим свойство иерархии обратно, снимем галочку ограничения уровней и только после этого снова отключим иерархию (если она не требуется).Родитель, смена признака иерархичности требует обязательной реструктуризации таблиц. В файловых базах перед подобными манипуляциями обязательно сделаем резервную копию каталога информационной базы.Тестирование и исправление в конфигураторе с выбранными пунктами «Проверка логической целостности» и «Реструктуризация таблиц информационной базы».Рассмотрим типовую схему хранения: параметры хранятся в периодическом регистре сведений ПараметрыОборудования, где измерением выступает ПараметрыОборудования (ссылка на иерархический справочник или план видов характеристик), а ресурсом — ЗначениеПараметров.
Чтобы сгруппировать данные по группам справочника параметров, используем предложение ИТОГИ ПО ... ИЕРАРХИЯ. Обратим внимание: чтобы запрос не дублировал записи и корректно фильтровал данные по конкретному оборудованию, передадим ссылку на оборудование в параметры виртуальной таблицы СрезПоследних.
Посмотрим на пример правильного формирования запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПараметрыОборудованияСрезПоследних.ПараметрыОборудования КАК Параметр,
| ПараметрыОборудованияСрезПоследних.ЗначениеПараметров КАК Значение
|ИЗ
| РегистрСведений.ПараметрыОборудования.СрезПоследних(, Оборудование = &ТекОборудование) КАК ПараметрыОборудованияСрезПоследних
|ИТОГИ ПО
| Параметр ИЕРАРХИЯ";
Запрос.УстановитьПараметр("ТекОборудование", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
После выполнения запроса данные необходимо правильно обойти. При линейном обходе выборки с иерархическими итогами можно получить дублирование строк верхнего уровня. Разберем два надежных способа обработки результата.
Способ 1. Двухуровневый обход выборки с указанием типа группировки:
ВыборкаГрупп = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ТекстHTML = "<html><body>";
Пока ВыборкаГрупп.Следующий() Цикл
// Выводим заголовок группы параметров (например, "Процессор")
Если ВыборкаГрупп.Параметр.ЭтоГруппа Тогда
ТекстHTML = ТекстHTML + "<h3>" + ВыборкаГрупп.Параметр.Наименование + "</h3><ul>";
ВыборкаДетали = ВыборкаГрупп.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
Если Не ВыборкаДетали.Параметр.ЭтоГруппа Тогда
ТекстHTML = ТекстHTML + "<li><b>" + Строка(ВыборкаДетали.Параметр) + ":</b> " + Строка(ВыборкаДетали.Значение) + "</li>";
КонецЕсли;
КонецЦикла;
ТекстHTML = ТекстHTML + "</ul>";
КонецЕсли;
КонецЦикла;
ТекстHTML = ТекстHTML + "</body></html>";
ЭтаФорма.ПолеHTML = ТекстHTML;
Способ 2. Выгрузка в дерево значений:
Для более удобной работы со сложной структурой выгрузим результат в коллекцию ДеревоЗначений с помощью специального типа обхода:
ДеревоПараметров = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Для Каждого СтрокаГруппы Из ДеревоПараметров.Строки Цикл
// Обрабатываем наименование группы характеристик
НазваниеГруппы = СтрокаГруппы.Параметр;
Для Каждого СтрокаЭлемента Из СтрокаГруппы.Строки Цикл
// Обрабатываем конкретные значения параметров внутри группы
ИмяПараметра = СтрокаЭлемента.Параметр;
ЗначениеПараметра = СтрокаЭлемента.Значение;
КонецЦикла;
КонецЦикла;
Выясним, какие архитектурные решения позволяют избежать проблем с иерархией при масштабировании конфигурации:
ПланВидовХарактеристик. Он штатно поддерживает иерархию групп и элементов и избавляет от необходимости усложнять структуру справочников.КатегорияПараметра (ссылка на простой справочник или перечисление). В этом случае в запросе группировка выполняется простым предложением ИТОГИ ПО КатегорияПараметра, что исключает сбои механизма иерархии метаданных.