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