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

Справочники и Данные · 10 мин

Где в иерархии 1С находится элемент: как найти и проверить

Как в 1С определить, где в иерархии находится элемент справочника: режимы просмотра, поиск родителя, запросы В ИЕРАРХИИ, типичные ошибки и проверка результата.

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

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

Ниже разобраны оба сценария: работа в пользовательском режиме (переключение вида списка, поиск группы элемента) и программная проверка принадлежности к иерархии через запросы и методы платформы. Отдельно рассмотрены типичные ошибки, из-за которых элемент «теряется» или отбор по иерархии возвращает не те данные.

Как устроена иерархия в справочниках 1С

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

Ключевое поле — «Родитель» (в запросах — Родитель). У элементов верхнего уровня родитель пустой. Цепочка родителей от элемента до корня и есть его путь в иерархии. Глубина вложенности платформой не ограничена жёстко, но на практике деревья глубже 5–7 уровней неудобны в работе.

Важно понимать, что группа в иерархии «групп и элементов» — это тоже запись справочника со своим кодом и наименованием, но с признаком ЭтоГруппа = Истина. В отборах и запросах группы часто нужно исключать или, наоборот, отбирать отдельно.

Как увидеть, где элемент находится в иерархии, в пользовательском режиме

Самая частая причина «потери» элемента — список открыт в режиме «Списком», когда дерево групп не отображается, и элементы показаны плоским перечнем. В этом режиме не видно, в какой папке лежит каждая позиция.

Как найти место элемента в дереве
  1. 1
    Откройте список справочника, например «Номенклатура».
  2. 2
    В меню «Ещё» (или кнопкой на панели) выберите режим просмотра «Деревом» или «Иерархический список».
  3. 3
    Найдите элемент через поиск (Ctrl+F) — список покажет его с учётом текущего режима.
  4. 4
    Если дерево не раскрылось до элемента, откройте карточку элемента и посмотрите поле «Группа» (или «Родитель», «Входит в группу»).
  5. 5
    Перейдите по ссылке из поля группы — откроется карточка родительской группы, где виден её собственный родитель.

Режимы просмотра списка

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

Если элемент найден через поиск в плоском списке и нужно понять его ветку, быстрее всего открыть карточку: поле группы показывает непосредственного родителя. Чтобы увидеть весь путь, последовательно открывайте родителей либо переключите список в иерархический режим и повторите поиск.

Как программно проверить, где элемент в иерархии

Для отборов в отчётах, динамических списках и проверок в коде платформа предоставляет два основных инструмента: оператор запроса В ИЕРАРХИИ и метод ПринадлежитЭлементу(). Оба учитывают всю цепочку вложенности, а не только непосредственного родителя.

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

Оператор В ИЕРАРХИИ(&Группа) возвращает истину, если элемент находится в указанной группе или в любой из её подгрупп на любой глубине. Если параметр — сам элемент (в иерархии элементов), условие сработает и для него самого, и для его потомков.

Метод ПринадлежитЭлементу(Родитель) применяется к объекту или ссылке справочника и возвращает булево. Он удобен для одиночной проверки в коде, но в цикле по большому списку работает медленнее запроса, потому что обращается к базе на каждый вызов. Для массовых проверок всегда предпочтителен запрос.

Как получить полный путь элемента в дереве

Иногда нужно не просто проверить вхождение, а получить всю цепочку родителей — например, для вывода строки вида «Каталог / Инструмент / Крепёж». Прямого агрегатного оператора для этого в языке запросов нет, поэтому применяют два подхода.

Первый — итоги по иерархии: конструкция ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ или обход результата запроса с ОбходРезультатаЗапроса.ПоГруппировкамСИерархией. Второй — последовательный подъём по родителям в цикле: берём Родитель элемента, затем родителя родителя и так далее, пока родитель не станет пустым. Такой цикл безопасно ограничивать счётчиком (например, 20 итераций), чтобы при порче данных не получить бесконечный цикл.

Если путь в иерархии нужен часто — например, для печатных форм или выгрузки каталога — имеет смысл хранить его в дополнительном реквизите и обновлять при записи элемента. Это снимает необходимость каждый раз подниматься по цепочке родителей и ускоряет отчёты.
ПЗ
Практическое замечание

Отбор по иерархии в отчётах и динамических списках

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

В динамических списках аналогичная логика реализуется через отбор по полю «Ссылка» с видом сравнения «В иерархии». При установке отбора программно убедитесь, что используется именно ВидСравненияКомпоновкиДанных.ВИерархии, а не Равно.

Способы проверки принадлежности ветке

В ИЕРАРХИИ в запросе

Подходит для массовых отборов и отчётов; быстро работает на больших объёмах. Ограничение: требует написания запроса.

ПринадлежитЭлементу()

Удобен для одиночной проверки в коде. Ограничение: медленно в циклах по многим элементам.

Отбор «В группе» в СКД

Подходит пользователю без программирования. Ограничение: легко ошибиться с видом сравнения и получить отбор только по прямому родителю.

Типичные ошибки при работе с иерархией

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

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

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

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

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

Отбор по группе в отчёте
Норма

В отчёт попали элементы самой группы и всех её подгрупп

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

Видны только элементы верхнего уровня группы — выбран вид сравнения «Равно»

Запрос с В ИЕРАРХИИ
Норма

Количество строк совпадает с ручным подсчётом по дереву

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

Строк больше из-за групп — не добавлено условие НЕ ЭтоГруппа

Место элемента в дереве
Норма

В режиме «Иерархический список» элемент виден в ожидаемой ветке

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

Элемент на верхнем уровне — поле «Родитель» не заполнено

Цепочка родителей
Норма

Подъём по родителям завершается пустым значением за разумное число шагов

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

Цикл не завершается — данные повреждены, родитель образует петлю

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

Итог

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

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

Частые вопросы

Элемент есть в базе, но не виден в списке. Что проверить?

Снимите все отборы в списке, переключите режим просмотра в «Списком» и повторите поиск. Также проверьте, не установлена ли пометка удаления у элемента и не действуют ли ограничения доступа на уровне записей (RLS), скрывающие часть данных.

Чем «В ИЕРАРХИИ» отличается от «Родитель = &Группа»?

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

Как исключить группы из результата запроса?

Добавьте в условие ГДЕ строку «И НЕ Номенклатура.ЭтоГруппа». Поле «ЭтоГруппа» есть у справочников с иерархией групп и элементов и принимает значение Истина у папок.

Можно ли изменить вид иерархии у существующего справочника?

Технически — в конфигураторе через свойства справочника, но это рискованная операция: данные групп и ссылки в других объектах могут стать некорректными. Выполняйте только с резервной копией и проверкой всех связанных отчётов и обменов.

Почему отчёт по группе показывает меньше позиций, чем видно в справочнике?

Чаще всего в отборе выбран вид сравнения «Равно» вместо «В группе»/«В иерархии», поэтому учитываются только элементы первого уровня. Откройте настройки отбора отчёта и смените вид сравнения для поля группы.

Как быстро найти все элементы без родителя (на верхнем уровне)?

В запросе используйте условие «Родитель = ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)». В пользовательском режиме такие элементы видны в корне дерева при просмотре «Деревом» без выбранной группы.