Справочники и Данные · 10 мин
Где в иерархии 1С находится элемент: как найти и проверить
Как в 1С определить, где в иерархии находится элемент справочника: режимы просмотра, поиск родителя, запросы В ИЕРАРХИИ, типичные ошибки и проверка результата.
Вопрос «где в иерархии» возникает в 1С в двух ситуациях. Первая — пользователь видит элемент справочника, но не понимает, в какой группе (папке) он лежит, потому что список открыт в режиме без отображения дерева. Вторая — разработчику или аналитику нужно программно определить, входит ли элемент в конкретную ветку иерархии, например для отбора в отчёте или проверки условия в коде.
Иерархические справочники — «Номенклатура», «Контрагенты» (в ряде конфигураций), «Статьи затрат», «Подразделения» — устроены как дерево: элементы объединяются в группы, группы вкладываются друг в друга. У каждого элемента есть поле «Родитель», которое и определяет его место в дереве. Понимание этого механизма позволяет быстро находить нужную ветку и строить корректные отборы.
Ниже разобраны оба сценария: работа в пользовательском режиме (переключение вида списка, поиск группы элемента) и программная проверка принадлежности к иерархии через запросы и методы платформы. Отдельно рассмотрены типичные ошибки, из-за которых элемент «теряется» или отбор по иерархии возвращает не те данные.
Как устроена иерархия в справочниках 1С
Иерархия в справочнике включается в конфигураторе свойством «Иерархический справочник» и бывает двух видов. Иерархия групп и элементов — классический вариант: есть группы (папки), которые могут содержать и элементы, и другие группы. Иерархия элементов — любой элемент может быть родителем другого элемента, отдельного типа «группа» нет.
Ключевое поле — «Родитель» (в запросах — Родитель). У элементов верхнего уровня родитель пустой. Цепочка родителей от элемента до корня и есть его путь в иерархии. Глубина вложенности платформой не ограничена жёстко, но на практике деревья глубже 5–7 уровней неудобны в работе.
Важно понимать, что группа в иерархии «групп и элементов» — это тоже запись справочника со своим кодом и наименованием, но с признаком ЭтоГруппа = Истина. В отборах и запросах группы часто нужно исключать или, наоборот, отбирать отдельно.
Как увидеть, где элемент находится в иерархии, в пользовательском режиме
Самая частая причина «потери» элемента — список открыт в режиме «Списком», когда дерево групп не отображается, и элементы показаны плоским перечнем. В этом режиме не видно, в какой папке лежит каждая позиция.
- 1Откройте список справочника, например «Номенклатура».
- 2В меню «Ещё» (или кнопкой на панели) выберите режим просмотра «Деревом» или «Иерархический список».
- 3Найдите элемент через поиск (Ctrl+F) — список покажет его с учётом текущего режима.
- 4Если дерево не раскрылось до элемента, откройте карточку элемента и посмотрите поле «Группа» (или «Родитель», «Входит в группу»).
- 5Перейдите по ссылке из поля группы — откроется карточка родительской группы, где виден её собственный родитель.
Режимы просмотра списка
В типовых конфигурациях для иерархических справочников доступны три режима: «Деревом» (слева панель групп, справа элементы выбранной группы), «Иерархический список» (единое дерево с элементами внутри групп) и «Списком» (плоский список без групп). Переключение обычно находится в меню «Ещё» → «Режим просмотра» или на командной панели формы списка.
Если элемент найден через поиск в плоском списке и нужно понять его ветку, быстрее всего открыть карточку: поле группы показывает непосредственного родителя. Чтобы увидеть весь путь, последовательно открывайте родителей либо переключите список в иерархический режим и повторите поиск.
Как программно проверить, где элемент в иерархии
Для отборов в отчётах, динамических списках и проверок в коде платформа предоставляет два основных инструмента: оператор запроса В ИЕРАРХИИ и метод ПринадлежитЭлементу(). Оба учитывают всю цепочку вложенности, а не только непосредственного родителя.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
| И НЕ Номенклатура.ЭтоГруппа";
Запрос.УстановитьПараметр("Группа", ГруппаОтбора);
Результат = Запрос.Выполнить().Выгрузить();Оператор В ИЕРАРХИИ(&Группа) возвращает истину, если элемент находится в указанной группе или в любой из её подгрупп на любой глубине. Если параметр — сам элемент (в иерархии элементов), условие сработает и для него самого, и для его потомков.
Метод ПринадлежитЭлементу(Родитель) применяется к объекту или ссылке справочника и возвращает булево. Он удобен для одиночной проверки в коде, но в цикле по большому списку работает медленнее запроса, потому что обращается к базе на каждый вызов. Для массовых проверок всегда предпочтителен запрос.
Как получить полный путь элемента в дереве
Иногда нужно не просто проверить вхождение, а получить всю цепочку родителей — например, для вывода строки вида «Каталог / Инструмент / Крепёж». Прямого агрегатного оператора для этого в языке запросов нет, поэтому применяют два подхода.
Первый — итоги по иерархии: конструкция ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ или обход результата запроса с ОбходРезультатаЗапроса.ПоГруппировкамСИерархией. Второй — последовательный подъём по родителям в цикле: берём Родитель элемента, затем родителя родителя и так далее, пока родитель не станет пустым. Такой цикл безопасно ограничивать счётчиком (например, 20 итераций), чтобы при порче данных не получить бесконечный цикл.
Если путь в иерархии нужен часто — например, для печатных форм или выгрузки каталога — имеет смысл хранить его в дополнительном реквизите и обновлять при записи элемента. Это снимает необходимость каждый раз подниматься по цепочке родителей и ускоряет отчёты.
Отбор по иерархии в отчётах и динамических списках
В отчётах на СКД отбор по группе настраивается через сравнение «В группе» (или «В иерархии») в параметрах отбора. Пользователь выбирает группу, и в отчёт попадают все элементы этой ветки. Если в списке видов сравнения выбрано просто «Равно», отберутся только элементы, у которых родитель — ровно эта группа, без вложенных подгрупп: это частая причина «неполного» отчёта.
В динамических списках аналогичная логика реализуется через отбор по полю «Ссылка» с видом сравнения «В иерархии». При установке отбора программно убедитесь, что используется именно ВидСравненияКомпоновкиДанных.ВИерархии, а не Равно.
Способы проверки принадлежности ветке
Подходит для массовых отборов и отчётов; быстро работает на больших объёмах. Ограничение: требует написания запроса.
Удобен для одиночной проверки в коде. Ограничение: медленно в циклах по многим элементам.
Подходит пользователю без программирования. Ограничение: легко ошибиться с видом сравнения и получить отбор только по прямому родителю.
Типичные ошибки при работе с иерархией
Отдельная проблема — дубли элементов в разных ветках иерархии. Пользователь не находит позицию в привычной группе и создаёт новую в другой ветке. Перед созданием нового элемента выполняйте поиск по всему справочнику в режиме «Списком» без отборов.
Как проверить результат
Как проверить результат
В отчёт попали элементы самой группы и всех её подгрупп
Видны только элементы верхнего уровня группы — выбран вид сравнения «Равно»
Количество строк совпадает с ручным подсчётом по дереву
Строк больше из-за групп — не добавлено условие НЕ ЭтоГруппа
В режиме «Иерархический список» элемент виден в ожидаемой ветке
Элемент на верхнем уровне — поле «Родитель» не заполнено
Подъём по родителям завершается пустым значением за разумное число шагов
Цикл не завершается — данные повреждены, родитель образует петлю
После настройки отбора или запроса сверьте результат с ручным просмотром дерева: выберите одну тестовую группу, посчитайте элементы в ней и во вложенных группах визуально и сравните с количеством строк в выборке. Расхождение почти всегда означает неверный вид сравнения или отсутствие фильтра по ЭтоГруппа.
Что важно запомнить
Место элемента в иерархии задаёт поле «Родитель». В интерфейсе ищите его через режим «Деревом» или карточку элемента, программно — через В ИЕРАРХИИ и ПринадлежитЭлементу(). Главные ошибки — отбор по прямому родителю вместо всей ветки и попадание групп в выборку.
Частые вопросы
Элемент есть в базе, но не виден в списке. Что проверить?
Снимите все отборы в списке, переключите режим просмотра в «Списком» и повторите поиск. Также проверьте, не установлена ли пометка удаления у элемента и не действуют ли ограничения доступа на уровне записей (RLS), скрывающие часть данных.
Чем «В ИЕРАРХИИ» отличается от «Родитель = &Группа»?
Условие по родителю отбирает только элементы, лежащие непосредственно в указанной группе. «В ИЕРАРХИИ» дополнительно включает элементы всех вложенных подгрупп на любой глубине, что обычно и требуется в отчётах.
Как исключить группы из результата запроса?
Добавьте в условие ГДЕ строку «И НЕ Номенклатура.ЭтоГруппа». Поле «ЭтоГруппа» есть у справочников с иерархией групп и элементов и принимает значение Истина у папок.
Можно ли изменить вид иерархии у существующего справочника?
Технически — в конфигураторе через свойства справочника, но это рискованная операция: данные групп и ссылки в других объектах могут стать некорректными. Выполняйте только с резервной копией и проверкой всех связанных отчётов и обменов.
Почему отчёт по группе показывает меньше позиций, чем видно в справочнике?
Чаще всего в отборе выбран вид сравнения «Равно» вместо «В группе»/«В иерархии», поэтому учитываются только элементы первого уровня. Откройте настройки отбора отчёта и смените вид сравнения для поля группы.
Как быстро найти все элементы без родителя (на верхнем уровне)?
В запросе используйте условие «Родитель = ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)». В пользовательском режиме такие элементы видны в корне дерева при просмотре «Деревом» без выбранной группы.