При разработке отчетов без использования Системы Компоновки Данных (СКД) программисты часто сталкиваются с ситуацией, когда метод ПоказатьУровеньГруппировокСтрок() не отрабатывает. Вроде бы дерево группировок сформировано верно, количество уровней определяется корректно, но табличный документ упорно выводится полностью развернутым. Проанализируем причины этой проблемы и разберем работающие способы программного управления сворачиванием строк.
Самая распространенная ошибка, которую совершают даже опытные разработчики — попытка управлять визуальным состоянием табличного документа на сервере. Рассмотрим, как это происходит. В серверной процедуре мы формируем отчет, заполняем реквизит формы типа ТабличныйДокумент, вызываем метод ПоказатьУровеньГруппировокСтрок(1) и завершаем процедуру. В этот момент происходит передача данных с сервера на клиент.
Проблема заключается в том, что состояние «развернутости» или «свернутости» группировок часто не сериализуется и не передается вместе с данными объекта при возврате управления на клиентскую сторону. Платформа перерисовывает документ в его стандартном состоянии. Выясним правило: программное управление уровнями отображения должно происходить на клиенте, сразу после того, как серверная функция вернула заполненный табличный документ.
В управляемых формах 1С существует разделение между данными (объект ТабличныйДокумент) и элементом управления на форме (поле табличного документа). Рассмотрим ситуацию, когда мы пытаемся вызвать метод напрямую у реквизита. Хотя метод формально принадлежит объекту табличного документа, в контексте интерфейса надежнее обращаться к элементу формы.
Если ваш табличный документ является реквизитом формы с именем Результат, то на форме он представлен элементом. Проанализируем пример кода на клиенте:
&НаКлиенте
Процедура СформироватьОтчет(Команда)
// Вызываем серверный метод для заполнения ТабДока
СформироватьНаСервере();
// Теперь управляем группировками на клиенте
УровеньДляПоказа = 1;
Попытка
ЭтаФорма.Элементы.Результат.ПоказатьУровеньГруппировокСтрок(УровеньДляПоказа);
Исключение
// На случай, если группировок в документе нет
КонецПопытки;
КонецПроцедуры
Иногда однократный вызов метода ПоказатьУровеньГруппировокСтрок() может не сработать, если структура документа сложная или уровни вложенности создавались непоследовательно. В таких случаях мы рекомендуем использовать алгоритм «сверху вниз» (от максимального уровня к минимальному). Это гарантирует, что платформа корректно обработает все вложенные ветки.
Посмотрим на пример универсальной процедуры:
&НаКлиенте
Процедура УстановитьУровеньГруппировки(ТабДок, НужныйУровень)
// Определяем, сколько всего уровней в документе
ВсегоУровней = ТабДок.КоличествоУровнейГруппировокСтрок();
// Если уровней меньше, чем мы хотим показать, ничего не делаем
Если ВсегоУровней <= 1 Тогда
Возврат;
КонецЕсли;
// Сворачиваем уровни последовательно от большего к меньшему
ТекущийУровень = ВсегоУровней - 1;
Пока ТекущийУровень > НужныйУровень Цикл
ТабДок.ПоказатьУровеньГруппировокСтрок(ТекущийУровень);
ТекущийУровень = ТекущийУровень - 1;
КонецЦикла;
// Устанавливаем финальный целевой уровень
ТабДок.ПоказатьУровеньГруппировокСтрок(НужныйУровень);
КонецПроцедуры
Если код выполняется на клиенте, но группировки все равно не сворачиваются, проанализируем настройки самого объекта ТабличныйДокумент. Существует ряд свойств, которые могут блокировать работу группировок:
Ложь, программное управление уровнями может не иметь визуального эффекта. Проверьте, чтобы в коде или в свойствах реквизита стояло значение Истина.НачатьГруппировкуСтрок() и ЗакончитьГруппировкуСтрок(), убедитесь, что вы не вызываете метод Вывести() с параметром уровня, который конфликтует с вашей ручной иерархией.ФиксацияСверху, и группировки попадают в область фиксации, визуальное сворачивание может вести себя непредсказуемо. Попробуйте сначала управлять уровнями, а затем устанавливать фиксацию.При формировании документа мы часто используем метод Вывести(Область, Уровень, ИмяГруппы, Открыта). Обратим внимание на четвертый параметр Открыта. Если при выводе каждой строки вы передаете там значение Истина, а потом пытаетесь одной командой свернуть весь документ, может возникнуть визуальный конфликт в кэше формы.
Рекомендация: при массовом выводе строк лучше передавать в параметр Открыта значение Ложь, если вы планируете показывать отчет в свернутом виде. Это значительно ускоряет формирование документа, так как системе не приходится отрисовывать раскрытые ветки, которые вы все равно собираетесь скрыть.
Для успешного сворачивания группировок в 1С 8.3 необходимо соблюдать три условия:
ОтображатьГруппировки установлены в значение Истина.Соблюдение этих правил позволит вам создавать удобные и интерактивные отчеты, которые открываются в компактном и понятном для пользователя виде.