К статье
Практический материал

Разработка и Конфигурация · 10 мин

Дерево в 1С: что это такое и как с ним работать

Что такое дерево в 1С: иерархические справочники и дерево значений. Виды иерархии, настройка, типичные ошибки и примеры кода для пользователей и разработчиков.

Термин «дерево в 1С» встречается в двух разных контекстах, и их часто путают. Для пользователя дерево — это иерархический список в справочнике: папки и группы, внутри которых лежат элементы, например группы номенклатуры или подразделения. Для разработчика дерево — это объект встроенного языка «ДеревоЗначений», который хранит многоуровневые данные в памяти и выводится на форму как раскрывающийся список со строками и подстроками.

Общий признак обоих понятий — иерархия «родитель-потомок». Каждый элемент дерева имеет родителя (кроме корневого уровня) и может иметь произвольное число дочерних строк. Глубина вложенности не ограничена жёстко, но на практике больше 5–7 уровней делает структуру неудобной и для пользователей, и для обработки в коде.

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

Что такое дерево в 1С простыми словами

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

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

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

Иерархические справочники: дерево для пользователя

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

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

Виды иерархии в справочниках

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

Сравнение видов иерархии

Иерархия групп и элементов

Подходит для номенклатуры, товаров, статей. Группа — только папка, её нельзя выбрать в документе. Чёткое разделение структуры и данных.

Иерархия элементов

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

Как включить и настроить иерархию в справочнике

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

Важное ограничение: изменение вида иерархии на уже заполненном справочнике может привести к проблемам с данными. Перед изменением структуры рабочей базы сделайте резервную копию и проверьте результат на копии. Также учтите, что иерархия влияет на запросы: отбор по группе «с учётом иерархии» выполняется через оператор В ИЕРАРХИИ и работает медленнее на больших справочниках.

Дерево значений: объект для разработчика

ДеревоЗначений — программный объект, который создаётся в коде и живёт в памяти. Типовой сценарий: запросом получаем данные с итогами по иерархии, выгружаем результат в дерево методом Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) и выводим в реквизит формы типа «ДеревоЗначений».

Структура дерева задаётся колонками. Прежде чем добавлять строки, нужно описать колонки: Дерево.Колонки.Добавить("Наименование"). Дочерние строки добавляются через свойство Строки родительской строки: НоваяСтрока.Строки.Добавить(). Обход всех уровней выполняется рекурсивно или через НайтиСтроки с параметром «включая подчинённые».

bsl
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Номенклатура");
Дерево.Колонки.Добавить("Количество");
СтрокаГруппы = Дерево.Строки.Добавить();
СтрокаГруппы.Номенклатура = "Электроника";
СтрокаТовара = СтрокаГруппы.Строки.Добавить();
СтрокаТовара.Номенклатура = "Ноутбук";
СтрокаТовара.Количество = 5;

Чтобы дерево отобразилось на управляемой форме, добавьте реквизит формы типа «ДеревоЗначений», перетащите его в элементы формы и заполните программно в обработчике ПриСозданииНаСервере. Прямое присваивание между серверными вызовами требует аккуратности: дерево хранится в данных формы, и тип колонок должен совпадать с объявленным в реквизите.

Таблица значений или дерево: что выбрать

Таблица значений — плоская структура: строки и колонки без вложенности. Дерево значений — та же таблица, но каждая строка содержит собственную коллекцию подстрок. Если данные имеют один уровень (список документов, перечень товаров), достаточно таблицы значений — она проще в обработке и быстрее сортируется.

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

КритерийТаблица значенийДерево значений
СтруктураПлоский список строкСтроки с вложенными строками
Типичный источникЗапрос без итоговЗапрос с итогами по группировкам
ОтображениеТаблица на формеРаскрывающийся список с уровнями
Когда использоватьОдноуровневые данныеМногоуровневая вложенность

Типичные ошибки при работе с деревом

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

На стороне разработчика типичны три ошибки: попытка добавить строки до описания колонок, выгрузка запроса в дерево без указания обхода по группировкам (получается плоская структура) и зацикливание при рекурсивном обходе, если в данных появилась циклическая ссылка — элемент ссылается сам на себя как на родителя. От зацикливания защищайтесь проверкой родителя или ограничением глубины рекурсии.

Типичные ошибки
01
Добавление строк до описания колонок — платформа выдаст ошибку о несуществующей колонке.
02
Запрос выгружен без ПоГруппировкамСИерархией — вместо дерева получается плоская таблица.
03
Циклическая ссылка в родителе элемента — рекурсивный обход зависает или падает по переполнению стека.
04
Удаление группы без проверки вложенных элементов — структура справочника разрушается.

Как проверить результат

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

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

Контрольные точки

Как проверить результат

Структура дерева в отладчике
Норма

У родительских строк есть вложенные строки, колонки заполнены

Тревожный признак

Все строки на одном уровне или колонки пустые

Отображение на форме
Норма

Ветви раскрываются, данные видны на всех уровнях

Тревожный признак

Форма показывает только первый уровень или пустой список

Иерархия справочника
Норма

Поиск находит элемент, группы раскрываются без ошибок

Тревожный признак

Элемент не находится или группа не раскрывается

Итог

Что важно запомнить

Дерево в 1С — это иерархия «родитель-потомок»: для пользователя — папки в справочниках, для разработчика — объект ДеревоЗначений. Вид иерархии выбирается при настройке справочника, программное дерево строится из запроса с итогами. Любые изменения структуры в рабочей базе делайте после резервного копирования.

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

Чем дерево отличается от подчинённого справочника?

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

Почему в справочнике не видно дерева групп?

Либо справочник не иерархический по настройкам конфигурации, либо выбран режим просмотра «Список». Переключите режим через «Ещё» — «Режим просмотра» — «Дерево». Если пункта нет, иерархия в конфигурации отключена.

Можно ли перенести элемент из одной группы в другую?

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

Как в запросе выбрать элементы вместе со всеми подгруппами?

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

Есть ли ограничение на глубину дерева значений?

Жёсткого ограничения платформа не накладывает, но глубокая вложенность замедляет отображение и усложняет обход в коде. Практический ориентир — до 5–7 уровней; при большей глубине стоит пересмотреть структуру данных.

Что делать, если при обходе дерева код зависает?

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