Иерархия в СКД 1С: как задать свою связь элемента и родителя
Различайте иерархическую группировку и иерархические детальные записи. Для обхода детальных записей сверху вниз используется самосвязь набора: источник — ключ текущего узла, приёмник — ключ его родителя. НачальноеВыражение задаёт начальное значение ключа, а не логическое условие вида «Родитель равен…».
Стандартная и собственная иерархия СКД
У справочника иерархическая связь уже описана метаданными. Режимы группировки «Иерархия» и «Только иерархия» относятся к использованию такой структуры при выводе групповых записей. Если источник — таблица с собственными кодами узлов, отношения нужно описать отдельно.
Не путайте дерево с набором вложенных группировок «Регион → Склад»: фиксированное число уровней измерений не задаёт произвольную связь элемент–родитель. Здесь рассматривается обход детальных узлов сверху вниз; группировка с поиском предков имеет другое направление связи.
Подготовить данные: ключи, родители и корень
| Код | Родитель | Название |
|---|---|---|
| A | Пустая строка | Корень |
| B | A | Дочерний |
| C | B | Внук |
Ключ должен однозначно определять узел. У корня заранее выберите значение родителя одного типа с ключами: здесь это пустая строка, а не NULL. В прикладной базе это может быть пустая ссылка или отдельное значение параметра.
Сирота с неизвестным родителем не достижима от выбранного корня. До формирования проверяйте циклы, ссылки на самого себя и неоднозначные ключи. Не рассчитывайте на автоматически выбранный платформой корень или гарантированное исправление циклов.
Набор данных: выбирать детей текущих родителей
ВЫБРАТЬ
Узлы.Код,
Узлы.Родитель,
Узлы.Название
ИЗ
(ВЫБРАТЬ "A" КАК Код, "" КАК Родитель, "Корень" КАК Название
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "B", "A", "Дочерний"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "C", "B", "Внук") КАК Узлы
ГДЕ Узлы.Родитель В (&Родители)Самодостаточный набор из трёх строк позволяет проверить структуру без изменения справочников. В реальном отчёте замените внутреннюю таблицу запросом своего источника, сохранив смысл и типы полей. Параметр Родители используется механизмом связи, а не заполняется одним постоянным списком на все уровни.
Самосвязь и НачальноеВыражение
// В Схеме уже есть набор с именем Узлы и параметром Родители.
Связь = Схема.СвязиНаборовДанных.Добавить();
Связь.НаборДанныхИсточник = "Узлы";
Связь.НаборДанныхПриемник = "Узлы";
Связь.ВыражениеИсточник = "Код";
Связь.ВыражениеПриемник = "Родитель";
Связь.Параметр = "Родители";
Связь.РазрешенСписокПараметров = Истина;
// Строка выражения, результат которого — пустая строка.
Связь.НачальноеВыражение = """""";Шесть кавычек в BSL задают строку из двух кавычек: это выражение пустой строки на языке СКД. Условие Родитель = "" вернуло бы булево значение, что не соответствует нашему строковому ключу.
Настройки вывода и проверка последовательности
Для иерархических детальных записей добавьте в структуру группировку без полей группировки, а в выбранные поля — Код и Название. При программной подготовке включите использование элементов и автовыбор полей группировки. Не заменяйте этот сценарий иерархической группировкой по строковому коду без описания источника иерархии.
На 8.3.27.1989 для приведённого набора и самосвязи получена последовательность A — Корень, B — Дочерний, C — Внук. Текстовая выгрузка проверяет порядок и состав, но не доказывает оформление отступов в вашем макете.
.erf с нужной самосвязью и проверить корневые и дочерние записи. Приложите небольшой пример ожидаемого дерева.Поиск предков, фильтры и путь через слэш
Для получения предков иерархической группировки направление другое: родитель текущей записи связывается с ключом найденного предка. Пример руководства §10.9.1 не следует механически смешивать с обходом потомков §10.9.2.
Отбор «В иерархии» также зависит от контекста: глобальный отбор может попасть в запрос, а для другого уровня процессору требуется источник проверки иерархии. Сначала проверьте, должны ли оставаться родители при исключении части детей.
Строка вида «Корень / Дочерний / Внук» — отдельное представление пути. Она не появляется автоматически от включения иерархии: путь нужно подготовить по цепочке родителей, определить обработку сирот и ограничить циклы.
Источник: руководство разработчика 8.3.27, глава 10, §10.9.1–10.9.4; справка «СвязьНаборовДанныхСхемыКомпоновкиДанных.НачальноеВыражение». Обычные группировки разобраны в отдельной статье.
Частые ошибки
- Передать в НачальноеВыражение булевый фильтр вместо значения ключа.
- Перевернуть направление самосвязи: поиск предков и обход потомков — разные задачи.
- Считать строковое представление пути готовой иерархией либо игнорировать циклы исходных данных.
Частые вопросы
Что хранится в НачальномВыражении?
Выражение, результат которого используется как начальное значение источника связи. Это не общий фильтр корневых строк.
Почему узел с неизвестным родителем не появился?
При обходе от выбранного корня такой узел недостижим. Проверьте исходные ключи и политику обработки сирот.
Можно ли получить путь через слэш одной настройкой иерархии?
Нет, иерархический вывод и текстовый путь — разные задачи. Представление пути нужно подготовить отдельно с контролем циклов.
ИИ Консоль отчётов 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Популярный выборДля индивидуального использования
- Сборка и проверка отчётов СКД (.erf)
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Для интенсивного использования или команд
- Сборка и проверка отчётов СКД (.erf)
-
≈ 300 задач Подробнее про лимиты
- Техническая поддержка