Разработка и Конфигурация · 10 мин
Как свернуть строки дерева значений в 1С
Как программно свернуть строки дерева значений в 1С: СвернутьСтроку, коллекции строк, работа с деревом на форме и в отчётах СКД. Примеры кода и типичные ошибки.
Дерево значений в 1С — иерархическая структура данных, которая часто выводится на форму или используется для группировки информации в отчётах. Когда уровней вложенности много, пользователю нужно сворачивать и разворачивать ветки, чтобы не теряться в данных. Задача свернуть строки дерева решается несколькими способами: программно из кода, настройками формы и средствами системы компоновки данных.
Выбор способа зависит от того, где находится дерево: в реквизите формы, в табличном поле управляемой формы, в обычной форме или в отчёте СКД. У каждого варианта свои механизмы, и метод, который работает в одном контексте, в другом может отсутствовать или вести себя иначе.
Важно различать два действия: свернуть отображение дерева на форме (визуально) и изменить саму структуру данных. Чаще всего требуется первое — свернуть ветки в интерфейсе, не трогая содержимое дерева значений.
Что такое сворачивание дерева и где оно применяется
Сворачивание — это скрытие дочерних строк ветки с сохранением самой родительской строки на экране. Пользователь видит только верхние уровни иерархии, а детали открывает по мере необходимости. Это стандартное поведение древовидных списков в любых конфигурациях 1С.
Типовые сценарии, где требуется программно свернуть строки: вывод иерархии номенклатуры по группам, структура подразделений, план счетов с субсчетами, дерево задач или этапов проекта. Если веток много, открывать дерево целиком неудобно — форма открывается с «простынёй» строк, и пользователю приходится сворачивать вручную.
Отдельный случай — отчёты на СКД, где группировки выводятся иерархически. Там сворачивание регулируется не методами дерева значений, а настройками отчёта и действиями пользователя в режиме просмотра результата.
Сворачивание дерева на управляемой форме
В управляемой форме дерево значений обычно хранится в реквизите формы типа «ДеревоЗначений», а отображается элементом формы «Таблица» с видом «Дерево». Для управления отображением используется объект Элементы.ИмяДерева и его методы Свернуть() и Развернуть(), которым передаётся идентификатор строки.
Идентификатор строки — это значение метода ПолучитьИдентификатор() у строки дерева. Чтобы свернуть всё дерево, нужно пройти по строкам верхнего уровня и свернуть каждую из них:
&НаКлиенте
Процедура СвернутьВсеСтроки(Команда)
ЭлементыДерева = Дерево.ПолучитьЭлементы();
Для Каждого СтрокаДерева Из ЭлементыДерева Цикл
Элементы.Дерево.Свернуть(СтрокаДерева.ПолучитьИдентификатор());
КонецЦикла;
КонецПроцедуры
Обратите внимание: сворачивать достаточно строки верхнего уровня — их подчинённые скроются автоматически. Перебирать всю иерархию рекурсивно не нужно, это лишняя работа.
Для Каждого СтрокаДерева Из Дерево.ПолучитьЭлементы() Цикл
Элементы.Дерево.Свернуть(СтрокаДерева.ПолучитьИдентификатор());
КонецЦикла;Начальное состояние дерева при открытии формы
Если дерево должно открываться свёрнутым, не обязательно вызывать сворачивание после заполнения. У элемента формы «Дерево» есть свойство НачальноеОтображениеДерева с вариантами: «Раскрывать все уровни», «Раскрывать верхний уровень», «Не раскрывать». Его можно установить в конфигураторе в палитре свойств элемента формы.
Установка «Не раскрывать» — самый простой способ получить свёрнутое дерево без единой строки кода. Однако свойство действует при первом отображении данных; если дерево перезаполняется динамически, поведение зависит от того, как обновляются данные, и иногда требуется программное сворачивание.
Сворачивание после программного заполнения
Когда дерево заполняется кодом в обработчике ПриСозданииНаСервере или по команде, методы Свернуть() доступны только на клиенте. Поэтому сворачивание выносят в клиентскую процедуру и вызывают после обновления данных, например в ПриОткрытии или после вызова серверной процедуры заполнения.
- 1Заполните дерево значений на сервере в ПриСозданииНаСервере или по команде
- 2В клиентской процедуре получите коллекцию строк: Дерево.ПолучитьЭлементы()
- 3Пройдите циклом по строкам верхнего уровня и вызовите Элементы.Дерево.Свернуть() с идентификатором каждой строки
- 4Проверьте результат: на форме должны отображаться только строки верхнего уровня со значками раскрытия
Сворачивание в обычных формах
В обычных формах (толстый клиент, режим обычного приложения) дерево значений связывается с элементом управления «ТабличноеПоле». У табличного поля есть методы Свернуть() и Развернуть(), которые принимают саму строку дерева, а не идентификатор.
Для Каждого СтрокаДерева Из Дерево.Строки Цикл
ЭлементыФормы.Дерево.Свернуть(СтрокаДерева);
КонецЦикла;
Ключевое отличие от управляемых форм: здесь передаётся объект строки дерева напрямую, а коллекция строк верхнего уровня доступна через свойство Строки, а не через ПолучитьЭлементы(). Путаница между этими двумя API — частая причина ошибок при переносе кода между обычными и управляемыми формами.
Сворачивание группировок в отчётах СКД
В отчётах на системе компоновки данных дерево строк формируется группировками, и сворачиванием управляет пользователь через меню «Ещё — Уровни группировок» в режиме просмотра результата. Там можно выбрать, до какого уровня разворачивать иерархию.
Программно начальное состояние можно задать через пользовательские настройки отчёта, если конфигурация предоставляет такую возможность, либо сохранить нужный вариант настройки как стандартный. Универсального метода «свернуть строки» у табличного документа-результата нет — группировки СКД и дерево значений на форме работают по-разному.
Сравнение вариантов
Подходит для статичного дерева на управляемой форме; не требует кода, но не срабатывает при некоторых сценариях динамического обновления
Универсальный программный способ для управляемых и обычных форм; требует клиентского вызова и корректных идентификаторов строк
Применяется только к отчётам на СКД; управляется пользователем или настройками отчёта, а не деревом значений
Типичные ошибки и ограничения
Самая частая ошибка — попытка вызвать Свернуть() в серверной процедуре. Элементы формы и их методы отображения доступны только на клиенте, поэтому серверный контекст приведёт к ошибке вызова. Заполняйте данные на сервере, а сворачивайте на клиенте.
Вторая ошибка — передача в метод Свернуть() строки дерева вместо её идентификатора на управляемой форме. Метод ожидает число-идентификатор, полученный через ПолучитьИдентификатор(). Передача объекта строки вызовет ошибку или ничего не сделает.
Третья проблема — сворачивание до завершения заполнения дерева. Если вызвать сворачивание до того, как данные попали в реквизит формы, методам просто нечего сворачивать. Убедитесь, что сворачивание выполняется после обновления отображения.
Как проверить результат
Видны только строки верхнего уровня, рядом есть значки раскрытия
Дерево развёрнуто полностью или ветки раскрываются частично
Подчинённые строки появляются, данные корректны
Ветка пустая или строки дублируются — проблема в заполнении, а не в сворачивании
После обновления данных дерево снова свёрнуто
После обновления дерево разворачивается — сворачивание не вызывается после заполнения
Проверка результата и отладка
После внедрения сворачивания проверьте три сценария: первое открытие формы, повторное заполнение дерева по команде и ручное раскрытие веток. Во всех случаях данные должны оставаться целыми — сворачивание влияет только на отображение, и потеря строк говорит об ошибке в заполнении дерева, а не в сворачивании.
Для отладки полезно временно вывести количество строк верхнего уровня через Сообщить() или в заголовок формы. Если коллекция пуста в момент сворачивания, проблема в порядке вызовов: данные ещё не заполнены.
Что важно запомнить
Сворачивание дерева — это управление отображением на клиенте: метод Свернуть() с идентификатором строки на управляемой форме или со строкой в обычной форме. Для начального состояния используйте свойство НачальноеОтображениеДерева, а в отчётах СКД — уровни группировок. Сворачивайте только строки верхнего уровня после заполнения данных.
Частые вопросы
Как свернуть дерево значений полностью, а не по одной ветке?
Достаточно пройти циклом по строкам верхнего уровня коллекции ПолучитьЭлементы() и вызвать Свернуть() для каждой. Все вложенные уровни скроются вместе с родительскими ветками, отдельный рекурсивный обход не нужен.
Почему метод Свернуть() не срабатывает в ПриСозданииНаСервере?
Методы отображения элементов формы доступны только в клиентском контексте. Перенесите сворачивание в клиентскую процедуру, например в ПриОткрытии, или вызовите её после серверного заполнения данных.
Можно ли свернуть дерево без кода?
Да, если дерево статично: установите у элемента формы свойство НачальноеОтображениеДерева в значение «Не раскрывать» или «Раскрывать верхний уровень». При динамическом перезаполнении может потребоваться программное сворачивание.
Чем отличается сворачивание в обычных и управляемых формах?
В обычных формах методу Свернуть() табличного поля передаётся сама строка дерева, а коллекция верхнего уровня доступна через свойство Строки. В управляемых формах передаётся идентификатор строки из ПолучитьИдентификатор(), а коллекция получается через ПолучитьЭлементы().
Как свернуть группировки в отчёте СКД?
В режиме просмотра результата откройте меню «Ещё» и выберите нужный пункт в разделе «Уровни группировок». Дерево значений здесь не используется — сворачиванием управляет механизм компоновки данных.
Почему после обновления дерева оно снова разворачивается?
Перезаполнение реквизита сбрасывает состояние отображения. Вызывайте процедуру сворачивания каждый раз после заполнения данных, а не только при открытии формы.