К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как в 1С проверить, что справочник иерархический

Как в 1С проверить, что справочник иерархический: через конфигуратор, запрос и программно. Примеры кода, проверка вида иерархии, типичные ошибки и FAQ.

Иерархичность справочника влияет на то, как строятся запросы, как работают отборы по группам и как программно обходятся элементы. Если разработчик исходит из неверного предположения — например, считает плоский справочник иерархическим, — запрос с конструкцией «В ИЕРАРХИИ» вернёт не те данные или вообще ошибку. Поэтому перед написанием кода или запроса полезно точно знать, включена ли иерархия у конкретного справочника и какого она вида.

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

Что такое иерархический справочник и зачем это проверять

Иерархический справочник — это справочник, элементы которого могут быть вложены друг в друга: у каждого элемента есть родитель (поле «Родитель»), а верхний уровень имеет пустого родителя. В 1С существует два вида иерархии: «иерархия групп и элементов» (группы — это папки, элементы хранятся внутри них) и «иерархия списка» (любой элемент может быть родителем другого элемента, отдельных групп нет).

Проверка нужна в нескольких практических ситуациях. Первая — написание универсального кода, который должен работать с разными справочниками и не падать, если у справочника нет реквизита «Родитель». Вторая — построение запросов: оператор «В ИЕРАРХИИ» имеет смысл только для иерархических справочников. Третья — доработка чужой конфигурации, где структуру метаданных нужно выяснить до внесения изменений.

Проверка в конфигураторе через свойства справочника

Самый надёжный способ — посмотреть настройки объекта в конфигураторе. Откройте конфигурацию, найдите нужный справочник в дереве метаданных (ветка «Справочники»), вызовите контекстное меню и выберите «Свойства» либо откройте палитру свойств.

В палитре свойств найдите раздел, связанный с иерархией: там расположен флажок «Иерархический справочник». Если он установлен — справочник иерархический. Рядом обычно доступны связанные настройки: вид иерархии («Иерархия групп и элементов» или «Иерархия списка») и ограничение количества уровней вложенности.

Тот же флажок виден в окне редактирования объекта на закладке «Иерархия» — там же задаётся вид иерархии и максимальное число уровней. Если флажок снят, реквизит «Родитель» у элементов отсутствует, и любой код, обращающийся к родителю, вызовет ошибку.

Порядок проверки в конфигураторе
  1. 1
    Откройте конфигуратор и ветку «Справочники» в дереве конфигурации
  2. 2
    Найдите нужный справочник и откройте его свойства или окно редактирования
  3. 3
    Перейдите на закладку «Иерархия» или найдите флажок «Иерархический справочник» в палитре свойств
  4. 4
    Если флажок установлен — уточните вид иерархии: групп и элементов или списка
  5. 5
    Проверьте ограничение количества уровней, если оно задано

Программная проверка через объект метаданных

Когда проверка нужна внутри кода — например, в универсальной обработке или перед построением запроса — используется объект метаданных справочника. У него есть свойство «Иерархический», принимающее значение Истина или Ложь.

Типовой фрагмент кода выглядит так:

МетаданныеСправочника = Метаданные.Справочники.Номенклатура;

Если МетаданныеСправочника.Иерархический Тогда

Сообщить("Справочник иерархический");

Иначе

Сообщить("Справочник линейный (плоский)");

КонецЕсли;

Если имя справочника заранее неизвестно и передаётся строкой, обращайтесь через квадратные скобки: Метаданные.Справочники[ИмяСправочника]. Перед этим полезно убедиться, что справочник с таким именем существует, иначе обращение вернёт неопределённое значение и код упадёт при попытке прочитать свойство.

bsl
Мета = Метаданные.Справочники.Найти(ИмяСправочника);
Если Мета = Неопределено Тогда
    ВызватьИсключение "Справочник не найден";
КонецЕсли;
Если Мета.Иерархический Тогда
    // работаем с иерархией
КонецЕсли;

Как определить вид иерархии: группы и элементы или список

Знать только факт иерархичности часто недостаточно: от вида иерархии зависит, есть ли у справочника группы (папки) и реквизит «ЭтоГруппа». Программно вид определяется свойством «ВидИерархии» объекта метаданных.

Если МетаданныеСправочника.Иерархический Тогда

Если МетаданныеСправочника.ВидИерархии =

Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда

Сообщить("Иерархия групп и элементов: есть группы-папки");

Иначе

Сообщить("Иерархия списка: элементы вкладываются друг в друга");

КонецЕсли;

КонецЕсли;

Практическая разница существенна. При иерархии групп и элементов обращение к реквизиту «ЭтоГруппа» допустимо, а группы нельзя использовать как полноценные элементы в документах (в типовых конфигурациях на это часто стоят проверки). При иерархии списка реквизита «ЭтоГруппа» нет, и попытка обратиться к нему в запросе или коде приведёт к ошибке.

Косвенные признаки и проверка через запрос

Иногда конфигуратор недоступен — например, работа ведётся только в режиме предприятия с внешней обработкой. В этом случае ориентируйтесь на косвенные признаки: в форме списка иерархического справочника обычно присутствует дерево групп или кнопки перехода по уровням, а у элемента есть поле «Родитель» (входит в группу).

Программно можно выполнить пробный запрос к полю «Родитель» через попытку/исключение: если справочник не иерархический, запрос «ВЫБРАТЬ Родитель ИЗ Справочник.Имя» вызовет исключение, которое можно перехватить и интерпретировать как признак линейного справочника. Это рабочий, но менее чистый способ по сравнению с чтением метаданных — используйте его только когда объект метаданных недоступен.

Способы проверки

Палитра свойств в конфигураторе

Подходит для разового анализа и доработки конфигурации. Требует доступа к конфигуратору и прав на просмотр конфигурации.

Свойство метаданных «Иерархический»

Правильный способ для кода и универсальных обработок. Работает в режиме предприятия, не зависит от данных.

Пробный запрос к полю «Родитель»

Запасной вариант через Попытка/Исключение. Медленнее и менее читаемо; оправдан, только если чтение метаданных невозможно.

Типичные ошибки и ограничения

Типичные ошибки
01
Обращение к реквизиту «Родитель» линейного справочника — запрос или код падает с ошибкой поля не найдено; сначала проверяйте свойство «Иерархический»
02
Использование «ЭтоГруппа» при иерархии списка — этого реквизита нет, проверяйте ВидИерархии перед обращением
03
Предположение, что «В ИЕРАРХИИ» работает с любым справочником — оператор осмыслен только для иерархических
04
Путаница между иерархичностью справочника и подчинённостью: подчинённый справочник имеет владельца, а не родителя — это разные механизмы

Отдельная частая ошибка — путать иерархию с подчинённостью. Подчинённый справочник связан с владельцем через реквизит «Владелец» (например, договоры контрагента), но при этом может быть линейным. Иерархия — это вложенность элементов друг в друга через «Родителя». Оба свойства независимы: справочник может быть и подчинённым, и иерархическим одновременно.

Ещё одно ограничение: изменение свойства «Иерархический» в существующей конфигурации — это изменение структуры базы данных. При обновлении конфигурации потребуется реструктуризация, а на больших таблицах она может занять заметное время. Выполняйте такую операцию только на копии базы и с резервной копией.

Как убедиться, что проверка дала правильный результат

После определения иерархичности полезно сверить вывод с фактическим поведением данных. Откройте список справочника в режиме предприятия: если видны группы-папки или древовидное представление — это подтверждает иерархичность. Если список плоский и поле «Родитель» в карточке элемента отсутствует — справочник линейный.

Для программной проверки убедитесь, что код выполняется на той же конфигурации, о которой вы рассуждаете: в распределённых базах и при обменах версии конфигураций могут различаться. Быстрый контроль — вывести в журнал регистрации или сообщение значения обоих свойств: «Иерархический» и «ВидИерархии».

Контрольные точки

Как проверить результат

Свойство «Иерархический» в метаданных
Норма

Возвращает Истина или Ложь без ошибок

Тревожный признак

Обращение падает — имя справочника указано неверно

Форма списка в режиме предприятия
Норма

Дерево групп или поле «Родитель» соответствуют выводу кода

Тревожный признак

Форма не совпадает с выводом — проверьте, на той ли базе выполняется код

Запрос с оператором «В ИЕРАРХИИ»
Норма

Выполняется и возвращает вложенные элементы

Тревожный признак

Ошибка построения запроса — справочник линейный или поле указано неверно

Часто задаваемые вопросы

Можно ли сделать линейный справочник иерархическим без потери данных?

Да, установка флажка «Иерархический справочник» добавляет реквизит «Родитель», существующие элементы при этом сохраняются и получают пустого родителя. Но операция требует реструктуризации базы, поэтому выполняйте её на копии и проверьте все запросы и код, которые работают с этим справочником.

Чем отличается иерархия групп и элементов от иерархии списка?

При иерархии групп и элементов есть отдельный тип объектов — группы (папки), у элемента доступен реквизит «ЭтоГруппа». При иерархии списка групп нет: любой элемент может быть родителем другого, и реквизит «ЭтоГруппа» отсутствует.

Как проверить иерархичность, если нет доступа к конфигуратору?

Используйте код в режиме предприятия: Метаданные.Справочники[Имя].Иерархический. Альтернатива — посмотреть форму списка: наличие дерева групп или поля «Родитель» у элемента указывает на иерархичность.

Почему запрос с «В ИЕРАРХИИ» выдаёт ошибку?

Чаще всего потому, что справочник линейный и поле «Родитель» у него отсутствует. Проверьте свойство «Иерархический» в метаданных. Также убедитесь, что параметр оператора — ссылка на элемент именно этого справочника.

Иерархический и подчинённый справочник — это одно и то же?

Нет. Иерархия — вложенность элементов через реквизит «Родитель». Подчинённость — связь с владельцем через реквизит «Владелец» (например, единицы измерения номенклатуры). Свойства независимы и могут сочетаться в любом сочетании.

Итог

Что важно запомнить

Иерархичность справочника проверяется флажком «Иерархический справочник» в конфигураторе или свойством метаданных «Иерархический» в коде. Вид иерархии (групп и элементов или списка) определяет наличие реквизита «ЭтоГруппа». Перед обращением к «Родителю», «ЭтоГруппа» и оператору «В ИЕРАРХИИ» всегда проверяйте эти свойства — это защищает код от ошибок на линейных справочниках.