При работе с отчетами в 1С:Предприятии, особенно в контексте обычных (неуправляемых) форм, часто возникает необходимость гибко настраивать вывод данных. Одной из таких задач является создание и отображение группировок столбцов в табличном документе. Группировки значительно улучшают читаемость объемных отчетов, позволяя пользователю сворачивать и разворачивать детализированные блоки информации.
Мы рассмотрим ситуацию, когда при выводе макета в поле табличного документа, группировки столбцов, созданные программно или изначально имеющиеся в макете, не отображаются, несмотря на установленное свойство ОтображатьГруппировки = Истина. Выясним причину такого поведения и предложим эффективное решение.
Рассмотрим типовую ситуацию, с которой сталкиваются разработчики. У нас есть форма отчета в обычных формах, на которой размещено поле типа "Табличный документ". Мы выводим в это поле заранее подготовленный макет, который, по задумке, должен содержать группировки столбцов. Однако после вывода, ожидаемые маркеры группировок не появляются.
Наш код может выглядеть примерно так:
ТабДокумент = ЭлементыФормы.тдРасшифровка;
ТабДокумент.Очистить();
Макет = ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("Шапка"); // Или другая область, содержащая данные
ТабДокумент.Вывести(Область);
ТабДокумент.ОтображатьСетку = Истина;
ТабДокумент.ОтображатьЗаголовки = Истина;
ТабДокумент.ОтображатьГруппировки = Истина; // Это свойство установлено!
ТабДокумент.ТолькоПросмотр = Истина;
Несмотря на то что свойство ТабДокумент.ОтображатьГруппировки установлено в Истина, группировки не видны. Это происходит потому, что это свойство лишь управляет *видимостью* маркеров группировок, но не *создает* сами группировки. Если группировки не были корректно заданы в макете или при программном выводе, или не были активированы для выведенных областей, то даже при установленном флаге отображения, ничего показываться не будет.
Для создания группировок в табличном документе существует несколько подходов:
Вывести(Область) эти свойства не всегда автоматически транслируются в интерактивные группировки табличного документа.Вывести() можно указать дополнительные параметры, такие как уровень группировки (второй параметр), имя группы (третий параметр) и состояние группы (открыта/свернута, четвертый параметр). Например: ТабДокумент.Вывести(Область, УровеньГруппировки, ИмяГруппы, Открыта). Это более явный способ управления группировками во время вывода.Сгруппировать(). Именно этот способ оказался наиболее эффективным в рассматриваемой нами проблеме.Сгруппировать()Выясним, что наиболее надежным и гибким способом активации группировок столбцов является программное применение метода Сгруппировать() к нужным областям табличного документа уже после вывода основных данных. Этот подход позволяет динамически управлять структурой группировок, независимо от того, как они были изначально заданы в макете.
Метод Сгруппировать() применяется к объекту типа ОбластьТабличногоДокумента. Для того чтобы его использовать, нам сначала необходимо получить ссылку на ту часть табличного документа, которую мы хотим сгруппировать.
Вывести() для макетов или отдельных ячеек.
ТабДокумент = ЭлементыФормы.тдРасшифровка;
ТабДокумент.Очистить();
Макет = ПолучитьМакет("Макет");
// Предположим, что у нас есть область "Шапка" и "Данные"
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДокумент.Вывести(ОбластьШапка);
// Вывод строк данных (пример)
Для Каждого СтрокаТаблицы Из МоиДанные Цикл
ОбластьДанных = Макет.ПолучитьОбласть("СтрокаДанных");
ОбластьДанных.Параметры.Заполнить(СтрокаТаблицы);
ТабДокумент.Вывести(ОбластьДанных);
КонецЦикла;
Область() объекта ТабличныйДокумент. Важно правильно указать параметры этого метода.Сигнатура метода Область() выглядит так: Область(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка).
При группировке столбцов мы хотим, чтобы группировка применялась ко всем строкам в заданном диапазоне колонок. Здесь возникает важный нюанс, отмеченный в обсуждении: первый параметр (НачальнаяСтрока) может быть не указан. Если первый и третий параметры (НачальнаяСтрока и КонечнаяСтрока) опущены или переданы как пустые значения, это интерпретируется как "группировка по всем строкам" или "по всей высоте табличного документа".
Таким образом, для группировки одного или нескольких столбцов, мы указываем только номера колонок. Например, чтобы сгруппировать столбец с номером 16:
ОбластьДляГруппировки = ТабДокумент.Область(, 16, , 16);
Здесь:
Это означает: "выделить область, начинающуюся с колонки 16 и заканчивающуюся колонкой 16, для всех строк табличного документа".
Если нам необходимо сгруппировать диапазон столбцов, например, со 2-й по 6-ю колонку:
ОбластьДляГруппировки = ТабДокумент.Область(, 2, , 6);
Или, как было указано в одном из примеров, для группировки 7-й и 8-й колонок:
ОбластьДляГруппировки = ТабДокумент.Область(, 7, , 8);
Сгруппировать(): После получения нужной области, просто вызываем для нее метод Сгруппировать().
ОбластьДляГруппировки.Сгруппировать();
Весь код, демонстрирующий решение, будет выглядеть следующим образом:
ТабДокумент = ЭлементыФормы.тдРасшифровка;
ТабДокумент.Очистить();
Макет = ПолучитьМакет("Макет");
// Выводим все необходимые области макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДокумент.Вывести(ОбластьШапка);
// ... Продолжаем выводить данные ...
// Устанавливаем свойства отображения
ТабДокумент.ОтображатьСетку = Истина;
ТабДокумент.ОтображатьЗаголовки = Истина;
ТабДокумент.ОтображатьГруппировки = Истина; // Обязательно для видимости маркеров
ТабДокумент.ТолькоПросмотр = Истина;
// Создаем группировку для конкретного столбца (например, 16-го)
// Важно: первый и третий параметры (строки) опущены, чтобы сгруппировать весь столбец
ОбластьДляГруппировки = ТабДокумент.Область(, 16, , 16);
ОбластьДляГруппировки.Сгруппировать();
// Пример группировки диапазона столбцов (например, с 7-го по 8-й)
Результат_ТабДок = ТабДокумент; // Используем то же имя переменной для наглядности
ОбластьДляГруппировкиДвухКолонок = Результат_ТабДок.Область(, 7, , 8);
ОбластьДляГруппировкиДвухКолонок.Сгруппировать();
После выполнения этого кода на вашем табличном документе появятся маркеры группировок для указанных столбцов, позволяя пользователю сворачивать и разворачивать их.
Помимо группировок, для удобства работы с объемными табличными документами часто требуется фиксировать определенные области – обычно это заголовки или первые столбцы, содержащие ключевую информацию. Это позволяет этим областям оставаться видимыми при прокрутке документа. Для этого используются свойства ФиксацияСлева и ФиксацияСверху объекта ТабличныйДокумент.
ТабДокумент.ФиксацияСлева: Это свойство задает количество столбцов слева, которые будут зафиксированы. При прокрутке табличного документа по горизонтали, эти столбцы останутся на месте. Значение указывается как число, равное количеству фиксируемых столбцов. Например, если вы хотите зафиксировать первые 6 столбцов:
ТабДокумент.ФиксацияСлева = 6;
Это очень полезно, когда первые столбцы содержат идентификаторы или наименования, которые всегда должны быть видны, чтобы понимать, к какой строке относятся данные в прокручиваемой части таблицы.
ТабДокумент.ФиксацияСверху: Это свойство задает количество строк сверху, которые будут зафиксированы. При прокрутке табличного документа по вертикали, эти строки (обычно заголовки) останутся на месте. Значение указывается как число, равное количеству фиксируемых строк. Например, если вы хотите зафиксировать первую строку (заголовки отчета):
ТабДокумент.ФиксацияСверху = 1;
Это критически важно для отчетов, чтобы заголовки колонок всегда были видны, независимо от того, насколько далеко пользователь прокрутил отчет вниз.
Эти настройки могут быть применены в том же месте кода, где вы управляете свойствами отображения табличного документа:
// ... код вывода данных и создания группировок ...
ТабДокумент.ОтображатьСетку = Истина;
ТабДокумент.ОтображатьЗаголовки = Истина;
ТабДокумент.ОтображатьГруппировки = Истина;
ТабДокумент.ТолькоПросмотр = Истина;
// Добавляем фиксацию областей для удобства пользователя
ТабДокумент.ФиксацияСлева = 6; // Фиксируем первые 6 колонок
ТабДокумент.ФиксацияСверху = 1; // Фиксируем первую строку
ТабличныйДокумент и его методы остаются схожими.Группировка() таблицы значений: Не путайте группировки в ТабличномДокументе с методом Группировка(), который применяется к объекту ТаблицаЗначений. Метод ТаблицаЗначений.Группировка() используется для агрегации данных и получения новой таблицы значений, но не влияет на визуальное отображение группировок в табличном документе.Сгруппировать() создает группировку на определенном уровне. Если вам нужно создать несколько вложенных группировок, вызывайте Сгруппировать() для соответствующих областей, начиная с самого внутреннего уровня, или же используйте методы НачатьАвтоГруппировкуКолонок() / ЗакончитьАвтоГруппировкуКолонок() при пошаговом формировании документа, явно указывая уровень.Мы успешно разобрали, как решить проблему с отображением группировок столбцов в табличном документе 1С 8.х в обычных формах. Ключевым моментом является программное применение метода Сгруппировать() к нужным областям табличного документа после их вывода. Особое внимание следует уделить правильному указанию параметров метода Область(), особенно при группировке столбцов по всей высоте документа, где параметр начальной строки должен быть опущен.
Дополнительно мы рассмотрели, как использовать свойства ФиксацияСлева и ФиксацияСверху для улучшения интерактивности и удобства использования отчетов, что особенно важно при работе с табличными документами, содержащими большое количество строк и столбцов. Используя эти методы, вы сможете создавать функциональные и удобные для пользователя отчеты в 1С:Предприятии.