Как сделать справочник иерархическим в 1С 8.3

· 10 мин

Содержание

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

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

Чем «иерархия групп» отличается от «иерархии элементов»

Платформа поддерживает ровно два варианта вложенности, и это первое, что нужно решить до создания справочника.

🔹 Иерархия групп и элементов. Появляется отдельная сущность — группа (папка). Группа не хранит рабочих данных, она только объединяет элементы. У каждой строки есть признак ЭтоГруппа: у папки он Истина, у обычного элемента — Ложь. Классический пример — справочник Номенклатура: папки «Материалы», «Товары», «Услуги», а внутри — сами позиции.

🔹 Иерархия элементов. Отдельных папок нет. Родителем элемента может быть другой такой же элемент. Признака ЭтоГруппа в этом виде не существует. Так устроен справочник Подразделения: отдел входит в департамент, департамент — в дирекцию, и каждый уровень сам по себе полноценный элемент с реквизитами.

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

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

Как включить иерархию в Конфигураторе

Порядок действий в дереве метаданных:

  1. Откройте Конфигуратор, в дереве конфигурации разверните ветку Справочники и дважды щёлкните по нужному справочнику.
  2. На закладке Основные установите флажок Иерархический справочник.
  3. В появившемся поле Вид иерархии выберите Иерархия групп и элементов или Иерархия элементов.
  4. При необходимости включите Размещать группы сверху — тогда в списках папки всегда показываются над элементами одного уровня.
  5. Закройте окно свойств и обновите конфигурацию базы данных (F7 или Конфигурация → Обновить конфигурацию базы данных).
Проверка настроек перед обновлением базы
Выполнено: 0 / 5

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

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

Выбор вида иерархии и ограничение числа уровней

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

Чтобы задать потолок, на закладке Данные (в некоторых редакциях платформы — Основные) найдите свойство Ограничение количества уровней иерархии. Установите флажок и укажите число в поле Количество уровней иерархии.

  • Значение 1 фактически отключает вложенность групп — остаётся один уровень папок.
  • Значение 2–3 — комфортный диапазон для большинства справочников: структура обозрима, элементы быстро находятся.
  • Чем больше уровней, тем тяжелее запросы с отбором «по всей ветке» (о производительности — ниже).

Если в базе уже есть данные с вложенностью глубже заданного ограничения, при обновлении платформа сообщит об ошибке реструктуризации. Сначала «поднимите» лишние уровни в режиме 1С:Предприятие, потом уменьшайте лимит.

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

Работа с группами и элементами в режиме 1С:Предприятие

Когда иерархия включена, список справочника пользователь видит как дерево. Основные операции:

  • Создать группу — отдельная команда в списке (кнопка с изображением папки или Ещё → Создать группу, горячая клавиша Ctrl+F9). Открывается форма группы — обычно упрощённая, только наименование и родитель.
  • Создать элемент — обычная команда создания (Insert или кнопка Создать). Новый элемент попадает в ту группу, которая выделена в дереве.
  • Переместить в группу — выделите элементы и выполните Ещё → Переместить в группу (либо Ctrl+Shift+M), затем укажите папку-приёмник. Можно перетащить мышью.
  • Показать в виде списка / дерева — переключатель отображения: иногда удобнее видеть плоский список без папок, например при поиске.

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

Ещё пара приёмов, которые упрощают жизнь пользователю:

  • Отбор списка по группе. В настройках динамического списка (Ещё → Настроить список → Отбор) можно задать условие по полю Родитель. Тогда форма будет показывать только содержимое конкретной ветки.
  • Иерархический просмотр при включённом отборе. Если на список наложен отбор по реквизиту, дерево может «схлопнуться» в плоский вид. Это нормально: платформа не рисует папки, которые после фильтра стали пустыми.
  • Поиск по наименованию ищет по всему справочнику независимо от текущей группы, поэтому «потерянный» глубоко вложенный элемент проще найти строкой поиска, чем кликами по дереву.
Какой вид иерархии выбрать для нового справочника?

Производительность и технические ограничения

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

Что стоит учитывать:

  • Отбор В ИЕРАРХИИ (выбрать элемент и всё, что под ним) платформа разворачивает рекурсивно. На глубоких ветках с десятками тысяч элементов такой запрос заметно тяжелее простого равенства.
  • Группа участвует в тех же индексах, что и элементы. Если по справочнику часто строятся отчёты с группировкой, избыточно глубокая структура замедляет их.
  • У справочника с иерархией групп нельзя сослаться на группу там, где по типу ожидается элемент, и наоборот платформа не всегда это контролирует — ошибочная ссылка на папку вместо товара всплывает уже в проводках.

Для больших справочников (номенклатура на десятки тысяч позиций) держите 2–3 уровня групп и выносите детальную классификацию в отдельные реквизиты или дополнительные сведения. Отбор по реквизиту работает быстрее, чем обход глубокого дерева.

Жёсткого «максимума уровней», прошитого в платформе, в практических задачах вы не достигнете — ограничение задаёте вы сами свойством Количество уровней иерархии. Проблема возникает не из-за лимита платформы, а из-за скорости запросов и удобства пользователя.

Отдельно про индексы. Платформа автоматически поддерживает индекс по полю Родитель, поэтому выборка «прямые потомки одной группы» (Родитель = &Группа) работает быстро. А вот отбор В ИЕРАРХИИ требует обхода всей ветки — его по возможности ограничивают конкретной группой, а не корнем справочника, и не вызывают в цикле для каждой строки. Если один и тот же иерархический отбор нужен многократно, результат лучше один раз собрать во временную таблицу запроса и дальше соединяться уже с ней.

Обращение к иерархии в запросах и встроенном языке

Во встроенном языке у ссылки на элемент справочника есть стандартные поля:

  • Родитель — ссылка на вышестоящую группу или элемент. У корневого элемента это пустая ссылка.
  • ЭтоГруппа — булево, доступно только при иерархии групп и элементов.

Пример проверки в коде:

Если Элемент.ЭтоГруппа Тогда
    Сообщить("Это папка, в неё нельзя записывать движения");
Иначе
    // обычная обработка элемента
КонецЕсли;

В запросах для отбора по всей ветке применяется оператор В ИЕРАРХИИ:

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

Здесь в параметр &ГруппаТовары передаётся ссылка на группу, а условие НЕ ЭтоГруппа отсекает сами папки из результата.

Для иерархических итогов в отчётах используется конструкция группировки по иерархии:

ИТОГИ
    СУММА(Сумма)
ПО
    Номенклатура ТОЛЬКО ИЕРАРХИЯ

Слово ИЕРАРХИЯ в секции ИТОГИ даёт свёртку сумм по каждому уровню дерева. ТОЛЬКО ИЕРАРХИЯ оставляет в результате только итоги по группам, без строк-элементов — удобно для сводных отчётов.

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

Типичные ошибки при настройке иерархии

Разберём то, что ломается чаще всего — именно эти случаи редко очевидны из пошаговой инструкции.

Диагностика: выберите симптом

Ещё одна неочевидная вещь — ссылочная целостность при удалении групп. Если пометить папку на удаление, платформа при контроле ссылок не даст её удалить, пока в ней остаются элементы. Сначала переместите или удалите содержимое, затем — саму группу.

Если нужна структура, которую штатная иерархия не даёт

Иногда задача выходит за рамки одного дерева: нужна множественная классификация (товар одновременно в «Акции» и в «Новинки»), или структура, зависящая от подразделения. Встроенной иерархии для этого мало — она строго одна на справочник.

Рабочие альтернативы:

  • Дополнительные реквизиты и сведения (механизм свойств) — позволяют вешать на элемент несколько независимых классификаторов без изменения дерева.
  • Отдельный справочник-классификатор со связью «многие ко многим» через регистр сведений — если нужна полноценная параллельная группировка.
  • Отбор по реквизиту в динамическом списке — когда «псевдогруппировка» нужна только в интерфейсе, а менять структуру данных нежелательно.

Эти подходы работают быстрее глубокого дерева и не упираются в правило «один родитель у элемента».

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

Можно ли включить иерархию без Конфигуратора, из режима 1С:Предприятие?
Нет. Признак иерархичности и её вид — это свойство метаданных. Менять их можно только в Конфигураторе (или в расширении конфигурации) с последующим обновлением базы. В пользовательском режиме доступно лишь наполнение структуры — создание групп и перемещение элементов.
Чем группа отличается от элемента, если у обоих есть наименование и код?
Группа — это контейнер: по ней не ведут движений, в документы её, как правило, не подставляют, а признак ЭтоГруппа у неё равен Истина. Элемент — рабочая единица учёта. В «иерархии элементов» этого разделения нет вовсе, там любой элемент может быть родителем.
Сколько уровней вложенности выдержит справочник?
Практического потолка со стороны платформы вы не достигнете — глубину вы задаёте сами свойством Количество уровней иерархии. Ограничивает не платформа, а скорость запросов В ИЕРАРХИИ и удобство навигации. Для крупных справочников разумно держать 2–3 уровня.
Как запретить выбор групп в поле документа?
У реквизита формы или у поля ввода установите свойство ВыборГрупп в значение Ложь. Тогда при подборе пользователь сможет выбрать только конечный элемент, а папки останутся только для навигации по дереву.
Что произойдёт с данными, если сменить вид иерархии в готовой базе?
Платформа выполнит реструктуризацию и попытается сопоставить старую структуру с новой. Часть связей «родитель — потомок» может не перенестись корректно, особенно при переходе «группы → элементы». Делайте это только на копии базы, с архивом, и проверяйте результат до ввода в эксплуатацию.