Как сохранить и восстановить состояние развернутости группировок в табличном документе 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

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

Метод ПоказатьУровеньГруппировокСтрок() позволяет быстро свернуть или развернуть документ до определенного уровня. Например, если мы хотим оставить видимыми только самые верхние уровни, мы используем этот метод. Однако у него есть существенный недостаток: он действует на все группировки указанного уровня одновременно. Мы не можем с его помощью развернуть одну ветку «Проекта» и оставить свернутой другую на том же уровне.

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


// Пример использования метода при выводе секции
ТабДок.НачатьГруппуСтрок(ИмяГруппировки, Истина); // Группа будет развернута
// ... Вывод строк области ...
ТабДок.ЗакончитьГруппуСтрок();

Проблема идентификации группировок

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

В качестве ключа оптимально использовать комбинацию значений самих реквизитов, по которым строится группировка. Например, если отчет строится по иерархии Проект -> Статья -> Контрагент, ключом для второго уровня будет строка вида "Проект_001_Статья_Аренда". Этот ключ будет оставаться неизменным вне зависимости от количества строк в отчете.

Для хранения этих ключей и их состояния (развернуто/свернуто) идеально подходит объект Соответствие или Структура, где ключом является наше уникальное имя, а значением — булево Истина (развернуто) или Ложь (свернуто).

Как программно определить текущее состояние группировок

Выясним причину, почему в 1С нет прямого свойства Группа.Развернута. Платформа управляет отображением через видимость строк. Когда пользователь нажимает на «минус» в табличном документе, строки, входящие в группу, просто скрываются (свойство Видимость устанавливается в Ложь).

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

  1. Проходим циклом по строкам сформированного табличного документа.
  2. Ищем строки-заголовки группировок. Обычно их можно идентифицировать по параметрам расшифровки или специфическому тексту в ячейках.
  3. Для найденной группы проверяем видимость следующей за ней строки. Если ТабДок.Область(НомерСтроки + 1, , НомерСтроки + 1).Видимость равна Ложь, значит, группа свернута.
  4. Записываем пару "КлючГруппировки - Состояние" в коллекцию.

Реализация сохранения в Хранилище настроек

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

Посмотрим на пример кода для сохранения настроек:


Процедура СохранитьСостояниеГруппировок(НастройкиГруппировок)
    КлючОбъекта = "Отчет_ДвижениеДенежныхСредств/СостояниеГруппировок";
    Пользователь = ИмяПользователя();
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, "НастройкаРазвернутости", НастройкиГруппировок, , Пользователь);
КонецПроцедуры

Восстановление состояния при формировании отчета

Теперь рассмотрим подробнее процесс вывода данных. При формировании отчета (в цикле обхода выборки из результата запроса) мы должны проверять наличие ключа в нашем сохраненном соответствии.


// Перед началом формирования получаем настройки
НастройкиГруппировок = ХранилищеОбщихНастроек.Загрузить("Отчет_ДвижениеДенежныхСредств/СостояниеГруппировок", "НастройкаРазвернутости");

// В цикле вывода
Для Каждого СтрокаПроект Из РезультатЗапроса Цикл
    
    ТекущийКлюч = СтрокаПроект.Проект.УникальныйИдентификатор();
    
    // Определяем, должна ли группа быть открыта
    ОткрытаЛиГруппа = Истина; // По умолчанию развернуто
    Если НастройкиГруппировок <> Неопределено И НастройкиГруппировок.Свойство(ТекущийКлюч) Тогда
        ОткрытаЛиГруппа = НастройкиГруппировок[ТекущийКлюч];
    КонецЕсли;
    
    ТабДок.НачатьГруппуСтрок(ТекущийКлюч, ОткрытаЛиГруппа);
    
    // ... Вывод детальных записей или вложенных групп ...
    
    ТабДок.ЗакончитьГруппуСтрок();
    
КонецЦикла;

Альтернативный метод: Прямое управление видимостью

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

Однако стоит помнить: ручное скрытие строк через свойство Видимость иногда конфликтует со стандартными кнопками группировок (+/-). Если вы скрыли строку программно, но не через механизм группировки, «плюсик» может не появиться или работать некорректно. Поэтому использование НачатьГруппуСтрок при генерации является наиболее стабильным и рекомендуемым способом.

Важные нюансы и ограничения

При реализации этого механизма следует учитывать несколько моментов:

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

← На главную