Реквизит «Родитель» в 1С 8.3: как группы держат иерархию данных

· 9 мин

Содержание

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

Механизм общий для платформы 1С:Предприятие 8.3, поэтому работает одинаково в Бухгалтерии, ЗУП, Управлении торговлей и любой другой конфигурации. Ниже — как родителем управлять в обычном режиме, как он описан в Конфигураторе, как читается в коде и запросах и почему перенос одной группы может «перекроить» отчёт за прошлый год.

Как устроена иерархия справочника и где в ней родитель

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

Когда иерархия включена, выбирают её вид:

  • 📁 Иерархия групп и элементов. Есть два типа записей: группы (папки) и элементы. Родителем может быть только группа. Так устроены номенклатура, контрагенты, статьи затрат.
  • 🌳 Иерархия элементов. Групп нет. Родителем выступает обычный элемент, у которого есть все реквизиты. Так удобно описывать подразделения: отдел продаж подчинён коммерческой дирекции, и обе записи — полноценные подразделения.

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

Ещё два свойства в той же вкладке:

  • Ограничение количества уровней иерархии и Количество уровней — сколько этажей допустимо в дереве. Если ограничение включено, создать группу глубже не получится.
  • Размещать группы сверху — группы показываются в списке над элементами.

Родитель не путайте с владельцем. Владелец — это подчинение другому справочнику (договоры подчинены контрагенту, единицы измерения — номенклатуре). Родитель — подчинение внутри одного справочника. У записи могут быть оба реквизита одновременно.

Какой вид иерархии выбрать для нового справочника?

Работа с группами и родителем в пользовательском режиме

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

Создать группу

  1. Откройте список справочника, например Справочники → Номенклатура в Бухгалтерии 3.0.
  2. Встаньте на ту группу, внутри которой нужна новая папка, или на корень списка.
  3. Нажмите Создать группу (кнопка с изображением папки в командной панели или в меню Еще).
  4. Введите наименование и запишите.

Новая группа получит родителем ту, в которой стоял курсор. Если нужно положить её на верхний уровень — очистите поле родителя в форме группы.

Перенести элемент в другую группу

Три рабочих способа:

СпособКогда удобноНа что смотреть
Открыть карточку и выбрать другую группу в поле родителяОдин-два элементаПоле может быть скрыто в форме — тогда остальные способы
Перетащить строку мышью на нужную папку в спискеНесколько элементов в одном окнеСписок должен быть в режиме иерархии, иначе папок не видно
Команда Переместить в группу в меню ЕщеВыделено сразу много строкВыделите строки с Ctrl или Shift, затем выберите группу

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

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

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

Пометка на удаление

Пометка на удаление группы помечает и всё её содержимое. Окончательно группа удаляется обработкой удаления помеченных объектов, и только если на неё и на вложенные элементы нет ссылок в документах и других справочниках.

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

Родитель в Конфигураторе и во встроенном языке

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

Свойства, которые связаны с родителем

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

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

Чтение и смена родителя в коде

Базовые операции над объектом справочника:

// Создать группу верхнего уровня
Группа = Справочники.Номенклатура.СоздатьГруппу();
Группа.Наименование = "Лакокрасочные материалы";
Группа.Записать();

// Перенести элемент в эту группу
Объект = СсылкаНаЭлемент.ПолучитьОбъект();
Объект.Родитель = Группа.Ссылка;
Объект.Записать();

Полезные методы ссылки и объекта:

  • Уровень() — номер уровня, у верхнего 0;
  • ПолноеНаименование() — путь через «/», например «Материалы/Краски/Эмаль ПФ-115»;
  • ПолныйКод() — коды всех родителей подряд;
  • ПринадлежитЭлементу(Группа) — истина, если запись лежит внутри группы на любом уровне вложенности.

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

ГруппаКраски = Справочники.Номенклатура.НайтиПоНаименованию("Краски", Истина);
Элемент = Справочники.Номенклатура.НайтиПоНаименованию("Эмаль белая", Истина, ГруппаКраски);

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

Как родитель влияет на отчёты и аналитику

Отчёты на системе компоновки данных (СКД) умеют группировать по иерархии справочника. В настройках группировки выбирают тип:

  • Элементы — только конечные записи, без папок;
  • Иерархия — папки с итогами и элементы внутри них;
  • Только иерархия — одни папки с итогами, без элементов.

В отборе для иерархических полей есть виды сравнения В группе и В группе из списка. Отбор «Номенклатура в группе Краски» захватит все вложенные подгруппы, а не только первый уровень. Обычное «Равно» по группе вернёт пустоту, потому что в движениях документов групп нет — там только элементы.

Главная ловушка: иерархия не хранит историю

Родитель — обычный реквизит, не периодический. Отчёт всегда раскладывает данные по текущей структуре дерева. Перенесли «Эмаль белая» из группы «Краски» в «Эмали» в октябре — и оборотка за январь тоже покажет её в «Эмалях».

Если управленческой отчётности нужна раскладка «как было на дату», дерево для этого не годится. Варианты:

  • 📌 хранить группу аналитики в периодическом регистре сведений и строить отчёт по нему;
  • 📌 перед реорганизацией сохранять старые итоги отчётов в файл;
  • 📌 менять структуру на стыке периодов, а не в середине квартала.

Поиск элементов по родителю и скорость запросов

В запросах родитель используется двумя способами, и разница между ними принципиальная.

// Только прямые потомки группы — один уровень
ВЫБРАТЬ Ссылка, Наименование
ИЗ Справочник.Номенклатура
ГДЕ Родитель = &Группа

// Группа и всё, что лежит внутри неё на любой глубине
ВЫБРАТЬ Ссылка, Наименование
ИЗ Справочник.Номенклатура
ГДЕ Ссылка В ИЕРАРХИИ (&Группа)

Элементы верхнего уровня выбирают условием Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка).

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

Что ускоряет работу с иерархией

  1. Не обходите дерево рекурсией с запросом в цикле. На справочнике в 50 000 позиций и пяти уровнях это тысячи обращений к базе. Одного запроса с В ИЕРАРХИИ достаточно.
  2. Для вывода всего дерева используйте Справочники.Номенклатура.ВыбратьИерархически() или запрос с ИТОГИ ПО Ссылка ИЕРАРХИЯ и обходом результата ОбходРезультатаЗапроса.ПоГруппировкамСИерархией.
  3. Для одного уровня хватает Справочники.Номенклатура.Выбрать(Группа) — первый параметр метода и есть родитель.
  4. Не делайте дерево глубже, чем нужно. Пять уровней читать и пользователям, и запросам заметно проще, чем двенадцать.
  5. Не заменяйте иерархией отбор по признаку. Если элемент логически входит в две категории сразу, папки этого не выразят — нужен отдельный реквизит или регистр.

Отбор по родителю в форме списка

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

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

Ошибки при управлении иерархией

Ошибки, которые встречаются в рабочих базах чаще всего:

  • ❌ Элемент «исчез» из списка. Обычно его перенесли в другую группу. Переключите режим просмотра на «Список» и найдите по наименованию, затем посмотрите поле группы в карточке.
  • ❌ Группа попала в документ. Реквизиту документа разрешили выбор групп. Проверьте свойство Выбор групп и элементов у реквизита или у поля формы и оставьте только элементы.
  • ❌ Загрузка из Excel создала дубли. Обработка искала элемент по наименованию без родителя и не нашла его в нужной папке. Ищите с параметром родителя или по коду, артикулу.
  • ❌ Не создаётся вложенная группа. В справочнике включено ограничение уровней, и лимит достигнут. Решение — пересмотреть структуру или изменить ограничение в Конфигураторе.
  • ❌ Код повторяется в разных папках. Серии кодов настроены «В пределах подчинения». Это не сбой, а настройка: для поиска используйте полный код.
  • ❌ Массовый перенос сломал отчёты. Структуру поменяли в середине периода. Смотрите раздел про историю выше: прошлые отчёты пересчитаются по новому дереву.

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

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

Можно ли превратить группу в элемент?
Нет. Признак группы задаётся при создании записи и не меняется. Создайте новый элемент, перенесите в него данные и замените ссылки старой группы.
Почему у справочника нет поля «Родитель»?
Справочник не иерархический. Иерархию включает разработчик в Конфигураторе, в типовой конфигурации это изменение лучше делать через расширение или согласовывать с поддержкой.
Есть ли родитель у плана счетов?
Да. Субсчёт в плане счетов подчинён счёту именно через реквизит Родитель: у 60.01 родитель — счёт 60.
Чем «В группе» в отборе отличается от «Равно»?
«В группе» берёт все вложенные элементы на любой глубине. «Равно» сравнивает со ссылкой на саму группу и в движениях документов ничего не найдёт.
Влияет ли родитель на права доступа?
Сам по себе нет. Но ограничения доступа на уровне записей можно построить по иерархии, если это заложено в конфигурации.