Реквизит «Родитель» в иерархических справочниках 1С: от конфигуратора до запросов и кода
Содержание
Родитель в 1С — это стандартный реквизит иерархического справочника, который хранит ссылку на вышестоящую папку или элемент того же справочника. Через него строится дерево: у каждого элемента есть ровно один родитель, а у элементов верхнего уровня родитель пустой. В неиерархическом справочнике реквизита Родитель нет вообще — он появляется, только когда у справочника включена иерархия.
Это понятие встречается везде, где данные сгруппированы: номенклатура разложена по папкам, статьи затрат — по разделам, подразделения вложены в подразделения. Ниже — как устроена иерархия в конфигураторе, чем родитель отличается от владельца, как он работает в языке запросов и в системе компоновки данных и как читать и менять его из встроенного языка.
Что хранит реквизит и чем родитель отличается от владельца
Родитель — это ссылка на тот же самый справочник. Его тип всегда СправочникСсылка.ИмяЭтогоЖеСправочника. Если у номенклатуры родитель — папка «Канцтовары», то в поле Родитель лежит ссылка на эту папку из справочника «Номенклатура».
Главная путаница у новичков — родитель и владелец. Это разные механизмы:
- 📁 Родитель — вложенность внутри одного справочника. Папка внутри папки, элемент внутри папки.
- 🔗 Владелец — подчинение одного справочника другому. Например, «Контактные лица» подчинены «Контрагентам»: владелец контактного лица — контрагент.
Один справочник может быть одновременно иерархическим и подчинённым — тогда у него есть и Родитель, и Владелец, и это независимые реквизиты.
Пустой родитель означает, что элемент лежит в корне, на верхнем уровне. Проверяют это методом Пустая():
Если ЭлементСсылка.Родитель.Пустая() Тогда
// элемент лежит в корне справочника
КонецЕсли;
Для иерархии из групп и элементов добавляется ещё один стандартный реквизит — ЭтоГруппа. Он равен Истина у папок и Ложь у обычных элементов.
Иерархия справочника: группы, элементы и уровни вложенности
Иерархия позволяет сворачивать длинные списки в дерево и делать отборы по целым веткам. Бывает двух видов, и от выбора зависит, что вообще можно положить в родителя.
| Вид иерархии | Кто может быть родителем | Реквизит ЭтоГруппа | Пример |
|---|---|---|---|
| Иерархия групп и элементов | только группа (папка) | есть | Номенклатура, Контрагенты |
| Иерархия элементов | любой элемент | нет | План счетов, Подразделения |
В первом варианте элемент (товар) нельзя сделать родителем другого элемента — родителем служит только папка. Во втором папок нет совсем: любой элемент может иметь подчинённые. Классический пример иерархии элементов — счета и субсчета: счёт 01 является родителем для 01.01 и 01.09.
Глубину дерева можно ограничить. В свойствах справочника есть флажок «Ограничение количества уровней иерархии» и поле с числом уровней. Если ограничение снято, вложенность не лимитируется. Ограничивают её редко — обычно когда структура данных заведомо плоская и глубокое дерево только мешает.
Родитель хранится как обычное поле в таблице справочника, поэтому само дерево места почти не занимает. Отбор В ИЕРАРХИИ платформа выполняет эффективно и на глубокой вложенности — он не разворачивается в перебор уровней вручную. Так что бояться многоуровневой структуры из соображений скорости не нужно: на удобство навигации она влияет куда сильнее, чем на производительность запросов. Главное — не путать иерархию с подчинением и заранее выбрать подходящий вид.
Как включить иерархию и вид иерархии в конфигураторе
Иерархия — свойство справочника, которое задаётся один раз на этапе конфигурирования. Чтобы её включить:
- Открыть конфигуратор
, найти справочник в дереве метаданных:
Справочники → ИмяСправочника. - Открыть палитру свойств, поставить флажок «Иерархический».
- В свойстве «Вид иерархии» выбрать «Иерархия групп и элементов» или «Иерархия элементов».
- При необходимости включить «Ограничение количества уровней иерархии» и указать число уровней.
- Обновить конфигурацию
базы данных (
F7), чтобы изменения применились к данным.
Переключение вида иерархии на заполненной базе — не косметическая правка. Если перейти с «групп и элементов» на «иерархию элементов», существующие группы придётся преобразовывать, а структура данных может поехать. На рабочей базе такие изменения делают через копию и с резервной копией.
Отдельно про наследование. Распространённое заблуждение — что потомки «наследуют» значения реквизитов родителя автоматически. Платформа так не делает: если у папки заполнить какой-то реквизит, он НЕ скопируется в элементы внутри неё сам собой. Протянуть значения от родителя к потомкам можно только своей логикой — при записи, через обработку заполнения или групповую обработку.
ЭтоГруппа.Родитель у такого справочника не будет.Как перенести элемент в другую группу в 1С:Предприятии
Пользователю менять родителя через код не нужно — это делается в режиме «1С:Предприятие» прямо из формы списка. Есть два способа.
- Перетаскиванием. Откройте список (например,
Справочники → Номенклатура), включите показ дерева групп. Схватите элемент мышью и перетащите на нужную папку в дереве слева — родитель сменится. - Командой перемещения. Выделите один или несколько элементов (с
Ctrl/Shift), в командной панели списка найдите команду перемещения в группу (часто она спрятана под кнопкой «Еще»), выберите папку-получатель и подтвердите.
При переносе группы вместе с ней переезжает всё её содержимое — вложенные папки и элементы сохраняют свою структуру, меняется только их общий корень. Отдельно перемещать каждый вложенный элемент не нужно.
Если у элемента, который вы двигаете, заполнены реквизиты, они останутся прежними — платформа меняет только родителя. Напомню: подстройки под новую папку автоматически не произойдёт.
Родитель в языке запросов: отбор по ветке через В ИЕРАРХИИ
В запросах родитель участвует двумя разными способами, и их легко перепутать.
Прямое сравнение с реквизитом Родитель возвращает только непосредственных потомков — один уровень вложенности:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Папка
Если же нужны все элементы ветки на любую глубину — вложенные папки и их содержимое — применяют оператор В ИЕРАРХИИ:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Родитель КАК Папка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Папка)
Главная ошибка при отборах — написать Родитель = &Папка, когда нужна вся ветка. Такой запрос вернёт только товары, лежащие прямо в папке, и потеряет всё, что спрятано во вложенных подпапках. Для «всего, что внутри этого раздела» всегда В ИЕРАРХИИ.
Оператор В ИЕРАРХИИ работает и со списком значений, и с пустым параметром. Если передать в &Папка пустую ссылку, под условие попадёт весь справочник целиком — это удобно, чтобы одним запросом покрыть и выбор ветки, и выбор всего.
Часто из выборки нужно исключить сами папки и оставить только конечные элементы. Для иерархии групп и элементов это делает признак ЭтоГруппа:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Папка)
И НЕ Номенклатура.ЭтоГруппа
Если результат нужно вывести деревом с папками впереди их содержимого, добавляют упорядочивание ПО … ИЕРАРХИИ. Это специальный режим сортировки, который раскладывает строки в порядке обхода дерева, а не по алфавиту. Для плоского списка он не нужен.
Родитель в отчётах и системе компоновки данных
В отчётах на СКД иерархия справочника управляет тем, как сворачиваются строки. У каждой группировки есть тип:
- Элементы — плоский список, без вложенности.
- Иерархия — строки собираются в дерево по родителям, с промежуточными итогами по папкам.
- Только иерархия — выводятся лишь уровни группировки (папки), без конечных элементов.
Благодаря этому один и тот же отчёт по номенклатуре можно показать либо сплошным списком, либо деревом с итогами по разделам — переключается это настройкой группировки, данные не меняются.
В отборах отчётов родитель участвует через виды сравнения. Кроме привычного «Равно» доступны «В группе» и «В группе из списка» — это тот же смысл, что и В ИЕРАРХИИ в запросе: отобрать не одну папку, а всю ветку под ней. Выбираете нужный вид сравнения в строке отбора и указываете папку-ограничитель.
Если строите отчёт запросом вручную, помните: чтобы СКД могла построить иерархию, в наборе данных должно присутствовать поле Родитель — именно по нему компоновщик связывает строки в дерево.
Как получить и изменить родителя программно
Из встроенного языка родитель читается как обычный реквизит ссылки:
Родитель = ЭлементСсылка.Родитель;
Чтобы переместить элемент в другую папку, получают объект, меняют реквизит и записывают:
Объект = ЭлементСсылка.ПолучитьОбъект();
Объект.Родитель = НоваяПапка;
Объект.Записать();
Новую группу сразу создают в нужном родителе:
НоваяПапка = Справочники.Номенклатура.СоздатьГруппу();
НоваяПапка.Наименование = "Канцтовары";
НоваяПапка.Родитель = РодительскаяПапка;
НоваяПапка.Записать();
Частая задача — подняться от элемента до самого верхнего узла, перебрав всех предков. Поднимаемся по цепочке Родитель, пока он не окажется пустым:
Текущий = ЭлементСсылка.Родитель;
Пока НЕ Текущий.Пустая() Цикл
Сообщить(Текущий.Наименование);
Текущий = Текущий.Родитель;
КонецЦикла;
Цикл гарантированно завершится: у элемента корневого уровня родитель пуст, а назначить элемент родителем самого себя или своего потомка платформа не даёт. Если же нужен список всех элементов ветки (а не только предков), это быстрее и правильнее делать запросом с В ИЕРАРХИИ, а не перебором в цикле.
На том же принципе собирают «полный путь» элемента — строку вида Канцтовары / Бумага / Бумага А4. Предков складывают в обратном порядке: сначала ближайший родитель, потом его родитель и так до корня, а затем переворачивают цепочку.
Путь = ЭлементСсылка.Наименование;
Текущий = ЭлементСсылка.Родитель;
Пока НЕ Текущий.Пустая() Цикл
Путь = Текущий.Наименование + " / " + Путь;
Текущий = Текущий.Родитель;
КонецЦикла;
// Путь = "Канцтовары / Бумага / Бумага А4"
Такой путь удобно показывать в печатных формах и отчётах, где по одному наименованию непонятно, из какой ветки элемент.
При иерархии групп и элементов родителем можно назначить только группу. Попытка записать в Родитель ссылку на обычный элемент приведёт к ошибке записи.
Типичные ошибки при работе с иерархией
- ❌ Отбор
Родитель = &ПапкавместоВ ИЕРАРХИИ. Самая частая. Теряются все вложенные подпапки, отчёт недосчитывает строки. - ❌ Элемент в родителе при иерархии групп и элементов. Родителем может быть только группа — иначе ошибка записи.
- ❌ Циклическая ссылка. Назначить элемент предком самому себе нельзя; платформа отклонит запись с сообщением о недопустимом родителе.
- ❌ Превышение лимита уровней. Если включено ограничение количества уровней, вложить глубже не получится — запись не пройдёт.
- ❌ Обращение к
.Родительу неиерархического справочника. Реквизита просто нет, запрос или код упадут с ошибкой «поле не найдено». - ❌ Путаница родителя и владельца. Если ищете, «кому подчинён» элемент другого справочника, это владелец, а не родитель.
Частые вопросы
Чем родитель отличается от владельца справочника?
Можно ли сделать родителем элемент, а не группу?
Как в запросе выбрать всё содержимое папки вместе с вложенными?
В ИЕРАРХИИ(&Папка). Сравнение Родитель = &Папка вернёт только прямых потомков одного уровня и пропустит вложенные подпапки.Наследуются ли реквизиты от родителя к потомкам автоматически?
Почему у справочника нет реквизита «Родитель»?
Родитель и признак ЭтоГруппа появляются только после установки флажка «Иерархический» в конфигураторе и обновления конфигурации базы данных.