Как сгруппировать параметры оборудования по иерархии для вывода в макет в 1С

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

При разработке карточек оборудования и сложных технических объектов часто возникает задача вывести структурированные характеристики в поле HTML-документа или табличный макет. Например, требуется разделить общие параметры по логическим блокам: характеристики процессора, параметры оперативной памяти, накопители и сетевые интерфейсы. В процессе реализации разработчики нередко сталкиваются с критическими ошибками платформы при настройке иерархии справочников, а также с задвоением или некорректным обходом записей в запросе. Разберем по шагам, как исправить системные сбои в метаданных, грамотно составить запрос с иерархическими итогами и вывести сгруппированные данные.

Причины критических ошибок при переключении иерархии справочника

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

  1. Неснятый флаг ограничения уровней: если в конфигураторе отключить свойство Иерархический справочник, но при этом ранее стояла галочка Ограничивать количество уровней, в метаданных может сохраниться некорректная конфигурационная связка. Для исправления ситуации включим свойство иерархии обратно, снимем галочку ограничения уровней и только после этого снова отключим иерархию (если она не требуется).
  2. Нарушение логической целостности таблиц: если в базе уже присутствуют элементы с заполненным системным реквизитом Родитель, смена признака иерархичности требует обязательной реструктуризации таблиц. В файловых базах перед подобными манипуляциями обязательно сделаем резервную копию каталога информационной базы.
  3. Кэш конфигурации: некорректно кэшированное описание метаданных в пользовательском сеансе также приводит к сбоям. В таком случае помогает очистка временных файлов и повторное добавление информационной базы в список запуска.
  4. Тестирование и исправление: для устранения скрытых несоответствий запустим режим Тестирование и исправление в конфигураторе с выбранными пунктами «Проверка логической целостности» и «Реструктуризация таблиц информационной базы».

Построение запроса с выборкой итогов по иерархии

Рассмотрим типовую схему хранения: параметры хранятся в периодическом регистре сведений ПараметрыОборудования, где измерением выступает ПараметрыОборудования (ссылка на иерархический справочник или план видов характеристик), а ресурсом — ЗначениеПараметров.

Чтобы сгруппировать данные по группам справочника параметров, используем предложение ИТОГИ ПО ... ИЕРАРХИЯ. Обратим внимание: чтобы запрос не дублировал записи и корректно фильтровал данные по конкретному оборудованию, передадим ссылку на оборудование в параметры виртуальной таблицы СрезПоследних.

Посмотрим на пример правильного формирования запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПараметрыОборудованияСрезПоследних.ПараметрыОборудования КАК Параметр,
    |	ПараметрыОборудованияСрезПоследних.ЗначениеПараметров КАК Значение
    |ИЗ
    |	РегистрСведений.ПараметрыОборудования.СрезПоследних(, Оборудование = &ТекОборудование) КАК ПараметрыОборудованияСрезПоследних
    |ИТОГИ ПО
    |	Параметр ИЕРАРХИЯ";

Запрос.УстановитьПараметр("ТекОборудование", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();

Обработка иерархических данных для формирования 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. Выгрузка в дерево значений:

Для более удобной работы со сложной структурой выгрузим результат в коллекцию ДеревоЗначений с помощью специального типа обхода:


ДеревоПараметров = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Для Каждого СтрокаГруппы Из ДеревоПараметров.Строки Цикл
    // Обрабатываем наименование группы характеристик
    НазваниеГруппы = СтрокаГруппы.Параметр;
    
    Для Каждого СтрокаЭлемента Из СтрокаГруппы.Строки Цикл
        // Обрабатываем конкретные значения параметров внутри группы
        ИмяПараметра = СтрокаЭлемента.Параметр;
        ЗначениеПараметра = СтрокаЭлемента.Значение;
    КонецЦикла;
КонецЦикла;

Рекомендации по архитектуре хранения параметров

Выясним, какие архитектурные решения позволяют избежать проблем с иерархией при масштабировании конфигурации:

  1. Использование Плана видов характеристик (ПВХ): для хранения сложных наборов параметров стандартным механизмом 1С является объект ПланВидовХарактеристик. Он штатно поддерживает иерархию групп и элементов и избавляет от необходимости усложнять структуру справочников.
  2. Группировка через отдельный реквизит-категорию: если иерархический справочник параметров нежелателен, добавим в него реквизит КатегорияПараметра (ссылка на простой справочник или перечисление). В этом случае в запросе группировка выполняется простым предложением ИТОГИ ПО КатегорияПараметра, что исключает сбои механизма иерархии метаданных.
← На главную