СКД в 1С

Иерархия в СКД 1С: как задать свою связь элемента и родителя

Коротко

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

Стандартная и собственная иерархия СКД

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

Не путайте дерево с набором вложенных группировок «Регион → Склад»: фиксированное число уровней измерений не задаёт произвольную связь элемент–родитель. Здесь рассматривается обход детальных узлов сверху вниз; группировка с поиском предков имеет другое направление связи.

Подготовить данные: ключи, родители и корень

КодРодительНазвание
AПустая строкаКорень
BAДочерний
CBВнук

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

Сирота с неизвестным родителем не достижима от выбранного корня. До формирования проверяйте циклы, ссылки на самого себя и неоднозначные ключи. Не рассчитывайте на автоматически выбранный платформой корень или гарантированное исправление циклов.

Набор данных: выбирать детей текущих родителей

ВЫБРАТЬ
    Узлы.Код,
    Узлы.Родитель,
    Узлы.Название
ИЗ
    (ВЫБРАТЬ "A" КАК Код, "" КАК Родитель, "Корень" КАК Название
     ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "B", "A", "Дочерний"
     ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "C", "B", "Внук") КАК Узлы
ГДЕ Узлы.Родитель В (&Родители)

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

Самосвязь и НачальноеВыражение

// В Схеме уже есть набор с именем Узлы и параметром Родители.
Связь = Схема.СвязиНаборовДанных.Добавить();
Связь.НаборДанныхИсточник = "Узлы";
Связь.НаборДанныхПриемник = "Узлы";
Связь.ВыражениеИсточник = "Код";
Связь.ВыражениеПриемник = "Родитель";
Связь.Параметр = "Родители";
Связь.РазрешенСписокПараметров = Истина;
// Строка выражения, результат которого — пустая строка.
Связь.НачальноеВыражение = """""";
СвязьНаборовДанныхСхемыКомпоновкиДанных
ВыражениеИсточникКлюч узла, от которого идём к детям
ВыражениеПриемникПоле родителя дочернего узла
НачальноеВыражениеСтрока выражения начального значения источника
→ Связь набора с самим собой

Шесть кавычек в BSL задают строку из двух кавычек: это выражение пустой строки на языке СКД. Условие Родитель = "" вернуло бы булево значение, что не соответствует нашему строковому ключу.

Настройки вывода и проверка последовательности

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

На 8.3.27.1989 для приведённого набора и самосвязи получена последовательность A — Корень, B — Дочерний, C — Внук. Текстовая выгрузка проверяет порядок и состав, но не доказывает оформление отступов в вашем макете.

В ИИ Консоли отчётов 1С можно попросить собрать .erf с нужной самосвязью и проверить корневые и дочерние записи. Приложите небольшой пример ожидаемого дерева.

Поиск предков, фильтры и путь через слэш

Для получения предков иерархической группировки направление другое: родитель текущей записи связывается с ключом найденного предка. Пример руководства §10.9.1 не следует механически смешивать с обходом потомков §10.9.2.

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

Строка вида «Корень / Дочерний / Внук» — отдельное представление пути. Она не появляется автоматически от включения иерархии: путь нужно подготовить по цепочке родителей, определить обработку сирот и ограничить циклы.

Источник: руководство разработчика 8.3.27, глава 10, §10.9.1–10.9.4; справка «СвязьНаборовДанныхСхемыКомпоновкиДанных.НачальноеВыражение». Обычные группировки разобраны в отдельной статье.

Частые ошибки

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

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

Что хранится в НачальномВыражении?

Выражение, результат которого используется как начальное значение источника связи. Это не общий фильтр корневых строк.

Почему узел с неизвестным родителем не появился?

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

Можно ли получить путь через слэш одной настройкой иерархии?

Нет, иерархический вывод и текстовый путь — разные задачи. Представление пути нужно подготовить отдельно с контролем циклов.

Тарифы

ИИ Консоль отчётов 1С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Старт

Популярный выбор
1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Продвинутый

3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд