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

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

Как в 1С программно свернуть группу

Как программно свернуть группу в 1С: методы Свернуть, развернуть до уровня, работа с деревом значений и динамическим списком. Примеры кода и типичные ошибки.

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

Чаще всего речь идёт о табличном поле, связанном с деревом значений: у элемента формы есть методы Свернуть() и Развернуть(), которые принимают строку дерева. Для отчётов на СКД сворачивание группировок управляется через настройки компоновки — свойство «Состояние» группировки или представление элемента настройки. Для навигационных групп формы (панелей страниц, групп-страниц) применяется свойство видимости или текущая страница.

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

Определяем, что именно нужно свернуть

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

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

Маршрут решения

Как выбрать действие

На форме есть дерево значений (иерархия со стрелками сворачивания)Используйте Элементы.ИмяТаблицы.Свернуть(Строка) для каждой строки
Нужно свернуть группировку в отчёте СКДМеняйте свойство Состояние группировки в настройках компоновщика
Нужно свернуть визуальную группу элементов формыУправляйте свойством Видимость или используйте группу с поведением Свертываемая и свойством Скрыта
Группа в иерархическом динамическом спискеПрограммного сворачивания нет — только отбор по родителю или режим отображения списка

Сворачивание строки дерева значений

Базовый сценарий: на управляемой форме есть реквизит типа «ДеревоЗначений» и таблица формы, отображающая его. Метод Свернуть() вызывается у элемента формы (таблицы), а не у данных — это частая точка путаницы. Параметром передаётся строка дерева, полученная методом НайтиПоИдентификатору() по идентификатору строки.

&НаКлиенте

Процедура СвернутьГруппу(Команда)

ИдентификаторСтроки = Элементы.ДеревоДанных.ТекущаяСтрока;

Если ИдентификаторСтроки = Неопределено Тогда

Возврат;

КонецЕсли;

СтрокаДерева = ДеревоДанных.НайтиПоИдентификатору(ИдентификаторСтроки);

Элементы.ДеревоДанных.Свернуть(СтрокаДерева);

КонецПроцедуры

Обратите внимание: ТекущаяСтрока у таблицы формы дерева возвращает не саму строку данных, а её идентификатор (число). Преобразование в строку дерева через НайтиПоИдентификатору() обязательно — иначе метод свернёт не то или выдаст ошибку.

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

Свернуть все группы дерева разом

Метода «свернуть всё» у таблицы формы нет. Стандартный приём — цикл по строкам верхнего уровня с вызовом Свернуть() для каждой. Сворачивать достаточно только строки первого уровня: подчинённые уровни скроются автоматически вместе с родителем.

&НаКлиенте

Процедура СвернутьВсе(Команда)

СтрокиВерхнегоУровня = ДеревоДанных.ПолучитьЭлементы();

Для Каждого Строка Из СтрокиВерхнегоУровня Цикл

Элементы.ДеревоДанных.Свернуть(Строка);

КонецЦикла;

КонецПроцедуры

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

Сворачивание группировок в отчёте на СКД

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

Типовой подход: получить настройки из Отчет.КомпоновщикНастроек.Настройки, обойти коллекцию Структура, найти нужную группировку по имени или полю и установить свойство представления группировки. После изменения настроек отчёт нужно пересформировать — состояние применяется при выводе результата.

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

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

Сворачиваемые группы элементов формы

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

&НаКлиенте

Процедура ПереключитьГруппу(Команда)

Элементы.ГруппаДополнительно.Скрыта = Не Элементы.ГруппаДополнительно.Скрыта;

КонецПроцедуры

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

Сравнение вариантов

Скрыта = Истина

Сворачивает группу, заголовок с кнопкой остаётся. Требует поведение группы «Свертываемая»

Видимость = Ложь

Группа исчезает полностью, пользователь не может развернуть её сам

ТекущаяСтраница для страниц

Для групп-страниц «сворачивание» не работает — переключайте активную страницу

Иерархические динамические списки и их ограничения

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

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

Проверка результата и типичные ошибки

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

Частые ошибки: вызов метода у данных вместо элемента формы (ДеревоДанных.Свернуть() — такого метода нет, метод есть у Элементы.ДеревоДанных); передача идентификатора вместо строки дерева; попытка свернуть строку до того, как дерево выведено на форму (например, в ПриСозданииНаСервере — визуальные операции там недоступны, используйте ПриОткрытии на клиенте); сворачивание в цикле по подчинённым строкам, что избыточно — достаточно верхнего уровня.

Типичные ошибки
01
Вызов Свернуть() у реквизита дерева вместо элемента формы — метод не найден, ошибка выполнения
02
Передача ТекущаяСтрока напрямую в Свернуть() без НайтиПоИдентификатору — сворачивается не та строка или возникает ошибка
03
Сворачивание в серверной процедуре ПриСозданииНаСервере — визуальное состояние там недоступно, переносите в клиентское ПриОткрытии
04
Цикл по всем уровням дерева со Свернуть() — лишняя работа, подчинённые скрываются вместе с родителем
Контрольные точки

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

Внешний вид узла дерева
Норма

Родительская строка видна, подчинённые скрыты, значок «развернуть»

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

Строка исчезла полностью или подчинённые остались видимыми

Место вызова кода
Норма

Клиентская процедура (ПриОткрытии, команда формы)

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

Серверная процедура без контекста — ошибка метода

Состояние группировки СКД после пересоздания отчёта
Норма

Отчёт формируется свёрнутым до нужного уровня

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

Настройки сбрасываются — проверьте пользовательские настройки отчёта

FAQ: частые вопросы о сворачивании групп в 1С

Можно ли свернуть дерево сразу при открытии формы?

Да. В клиентском обработчике ПриОткрытии пройдите циклом по строкам верхнего уровня и вызовите Элементы.Дерево.Свернуть(Строка) для каждой. В ПриСозданииНаСервере это сделать нельзя — визуальное состояние таблицы формы там недоступно.

Почему метод Свернуть() выдаёт ошибку «Метод объекта не обнаружен»?

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

Как узнать, свёрнута строка дерева или развёрнута?

Штатного свойства «Свёрнута» у строки дерева нет. Если логика зависит от состояния, храните признак самостоятельно — например, в соответствии по идентификаторам строк, обновляя его при каждом вызове Свернуть/Развернуть из вашего кода.

Можно ли свернуть группу в динамическом списке справочника?

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

Как сделать, чтобы отчёт СКД всегда открывался со свёрнутыми группировками?

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

Итог

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

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