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

Обновлено: 05.07.2024

Построитель отчета - мощная штука для быстрого написания отчетов.
Однако иногда хочется использовать свои макеты, да и просто хотелось бы иметь "рыбу", которую можно было бы быстро использовать для написания отчета, особенно если данные берутся из таблицы значений.
Это именно такая "рыба".

Я предлагаю функцию обПостроительВывестиПоГруппировкам , которая занимается выводом таблицы значений с помощью построителя отчета с заданными группировками, итогами и параметрами группировок.
Итоги можно использовать любые - количество, сумма, среднее.
Пока еще не поддерживается сортировка, именно поэтому список параметров передается в виде структуры, чтобы можно было добавлять свои параметры.
Используется гибкое управление параметрами:
= Если не задан макет, то замена макета не производится
= Если не заданы параметры построителя, то они и не назначаются
= Может использоваться в качестве источника не только таблица значений, но и результат запроса
= Если не задан табличный документ, то она не выводится

Пример вызова функции:

Структура макета

Строки с уровнями именуются Уровень0, Уровень1, .
Колонки с уровнями именуются кУровень0, кУровень1, …
Детальная информация по строкам именуется кДетали.
Общие итоги именуются ОбщиеИтоги, шапка таблицы - ШапкаТаблицы, подвал таблицы - ПодвалТаблицы.


Может быть на картинке не заметно, но колонки с итогами содержат параметры, которые называются так же, как итоги в таблице значений, т.е. например "Сумма", "Остаток", "Количество".

Кроме измерений и итогов, можно выводить доп.параметры, например на рисунке виден параметр Адрес.

Замечания по коду

Пусть у нас есть некая таблица значений ТЗ.
Построитель отчета, привязанный к этой таблице значений, создается так:

Допустим, в списке значений спзГруппы у нас находится список колонок-группировок для отчета, в структуре спзИтоги - список колонок-итогов (колонки-итоги должны иметь явно указанный тип число, иначе не будет суммироваться итог).

Нужно указать, что колонки спзГруппы будут измерениями построителя - функция обПостроительОтчетаУстановитьИзмерения .
Нужно указать, что колонки спзИтоги будут итогами построителя и назначить им некоторую функцию итогов (Количество,Сумма) - функция обПостроительОтчетаУстановитьИтоги .
Затем вызывает заполнение настроек построителя:

Затем мы выполняем построитель и заполняем параметры вывода макета:

Теперь нужно подставить в построитель наш собственный макет. Но в макете построителя и в нашем названия групп могут не совпадать, поэтому нужно скорректировать названия. В переменной Макет хранится наш макет, мы его обработаем и подставим в макет построителя:

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

Группировка строк в табличном документе 1С

Для демонстрации создадим у обработки простой макет табличного документа с одной областью и с одним параметром области.

Макет табличного документа 1С

На основной форме обработки сделаем команду ВывестиГоризонтальнуюГруппировку, реквизит формы КоличествоЧисел (тип Число), и всё это разместим на форме.

Управляемая форма обработки 1С

При выполнении команды, я буду выводить ряд чисел с дробными частями. Для этого, создадим обработчик команды формы на клиенте и серверную процедуру, в которой будем заполнять табличный документ.

Получится такой код:

Подробно о формировании областей табличного документа читайте в статье:

Результат работы этого кода будет следующий:

Табличный документ 1С

Изменим этот макет: сделаем группировку целых чисел, а дробные числа будут с небольшим отступом.

Для того, чтобы дробные числа выводились с отступом изменим макет.

Откроем палитру свойств ячейки, в которой выводится параметр НомерСтроки.

Ячейка табличного документа 1С

В этой палитре нас интересует свойство АвтоОтступ. Установим в него значение.

Свойство Отступ ячейки табличного документа

На этом с макетом закончим. Доработаем код.

В этом коде мы применили методы НачатьАвтогруппировкуСтрок() и ЗакончитьАвтогруппировкуСтрок() перед тем как начали заполнять табличный документе, и после того как закончили. Кроме того, мы дополнили параметры метода Вывести табличного документе. Если в первом параметре указывается область которая будет выводиться в табличном документе, то во втором параметре указываем уровень группировки, в третьем – название группировки, а четвертом – булево значение, которое определяет, будет ли сворачиваться группировка или нет, после того, как она будет выведена.

Результат работы этого кода:

Группировка строк в табличном документе 1С

Группировка колонок в табличном документе 1С

Группировка колонок в табличном документе осуществляется по аналогии с группировкой строк. Для демонстрации создадим макет табличного документа, в котором сделаем вертикальную область с единственным параметром.

Макет табличного документа

А также на основной форме обработки создадим команду формы, которую назовем «Вывести вертикальную группировку», и выведем её на форму.

Создадим обработчик команды и функцию в серверном контексте, которая формирует табличный документ с вертикальными областями, к которым применена группировка.

Смысл группировки вертикальных областей тот же, что и горизонтальных: используем методы НачатьАвтогруппировкуКолонок и ЗакончитьАвтогруппировкуКолонок перед выводом областей, а в методе Присоединить необходимо указать уровень группировки, название группы и признак того, будет развернута группа или нет, как и в методе Вывести.

Результат работы этого кода будет следующим:

 Группировка колонок в табличном документе 1С

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

Группировка табличного документа 1С

Другие статьи про табличные документы в 1С:

Это изображение имеет пустой атрибут alt; его имя файла - 1C-в-желтом-цвете-3D-221x300.jpg

Это изображение имеет пустой атрибут alt; его имя файла - 1_в-желтом-цвете-3D-маленькая-221x300.jpg

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Кнопочки для управления уровнями группировки генерируются программно.

Для этого в модуле формы, в самом конце процедуры формирования отчета, нужно вызвать процедуру СгенерироватьКнопкиУправленияГруппировкой().

В модуль формы нужно добавить две процедуры, где "ПолеТабДок" - это поле табличного документа, в которое выводится отчет:

Примечание:

Как справедливо заметил VladZetRu , вышеприведенный код будет работать правильно, если ПолеТабличногоДокумента, на которое выводится Отчет, расположено на Форме. Если же ПолеТабличногоДокумента расположено на Панели, то строчку кода, в которой создается НоваяКнопка, необходимо чуть дополнить:

В комментарии № 58 приведено решение для генерации кнопок в отчетах, построенных на СКД.

Вот собственно и всё. Результат видно на скриншоте ниже.

1. Это вторая версия алгоритма, спасибо Pashkaa за дельное предложение. Алгоритм стал лучше и универсальнее. Не нужно теперь вручную указывать начальные координаты кнопочек, они привязаны к верхнему левому углу ПоляТабличногоДокумента. Кнопочки не требуют дополнительного места на форме т.к. находятся там, где должны быть системные кнопки при отображении заголовков таблицы.

3. (15.12.2011) Версия 2a. Добавлен код (одна строка) для назначения горячих клавиш для сгенерированных кнопочек. Теперь можно с помощью комбинаций Alt+[номер кнопки] сворачивать/разворачивать группировки с помошью клавиатуры. Спасибо rumik007 за идею.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

В табличных документах 1С 8 имеется отличная возможность использования группировок, но управление уровнями группировок через контекстное меню не очень удобное.
В своих отчетах для управления уровнями группировок я использую маленькие кнопочки на поле табличного документа - это намного удобнее и быстрее, чем через контекстное меню.

И зачем? Если для поля табличного документа отобразить заголовки, то кнопочки волшебным образом появятся сами собой. Saint,
Да, можно и так.
Но (IMHO) отчет с включенными заголовками смотрится как-то "лохмато", непрофессионально. Заголовки захламляют отчет, представляя собой совершенно лишнюю информацию. А также занимают место, уменьшая полезную площадь для отчета, которой порой так не хватает.
Вобщем я пользуюсь сгенерированными кнопочками. Может кому-то это тоже понравится. Как говорится - "На вкус и цвет. ". :D Привяжи начальные координаты к верхнему углу ПоляТабличногоДокумента, будет универсальние. В отчете могут быть отборы как в типовых отчетах. И надо уж тогда менять координаты кнопок при влючении и выключении отборов в отчетах.

НачалоВерх = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх + 3; // Тут установить начальные координаты для кнопок
НачалоЛево = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Лево + 3; // Тут установить начальные координаты для кнопок
.

НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
.

Испоравь так. Так кнопки сгенерерованные перекроют даже кнопки при включенном заголовке )))

Pashkaa,
Спасибо за дельное дополнение, так действительно будет лучше и универсальнее.
Уже поправил. (5) Возможно, что для универсальности строку с именем элемента управления "ТабличноеПоле" (т.е. "ТабДок") лучше передавать как параметр в обе процедуры, чтобы не пришлось менять код в случае с другими именами.
Или вариант 2 - сделать спец.шаблон 1С, в котором имя будет запрашиваться и подставляться в код. (8)Да, на счет передачи, как параметра, ты прав, так будет лучше.
А про "спец.шаблон 1С" - чёт не понял. ((( (9) Ну этот код явно просится быть добавленным в файл шаблонов 1С, при вставке шаблона в код можно юзать подстановку параметров. (10) Теперь понятно, о чем речь. Тоже неплохая идея. Спасибо, artbear. В случае если табличное поле находится на панели, ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх даст результат расстояния поля от верха панели, а не формы. Для корректного формирования кнопок в этом случае их нужно формировать на панели. VladZetRu,
Да, конечно,если ПолеТабличногоДокумента находится на Панели, то в этом случае кнопочки нужно формировать на Панели, а не на Форме.
И код тогда надо будет изменить так:
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель1); Клевая штучка, но не более, нужно быть очень метким чтобы "ткнуть" на эту кнопочку.
Очень удобный вариант сделан в "1с Деньги". (11) На счет: ". нужно быть очень метким . " - эти кнопочки даже чуть-чуть больше, чем те системные кнопки, которые появляются при отображении заголовков Таблицы.
Интересно, а какой вариант в "1С Деньги"? Я не видел. Респект! Надо будет к универсальному отчету прикрутить.

и разворачивает тоже.

(16) e.kogan,
Твой вариант Процедуры СвернутьДоУровня(Элемент) предпологает другой алгоритм работы кнопок, отличающийся от системного. Наверное кому-то понравится и твой вариант, что-то в нем есть.
Но твой вариант требует проработки. Попробуй сразу после формирования отчета: нажать 1 (сверется до уровня 1), потом нажать 2 (развернется уровень 1 и уровень 2), потом снова нажать 1 (ничего не происходит. а срабатывает только по повторному нажатию). (17) Да я сама что-то, видимо, под конец рабочего дня перекрутила мысль :) Ну нафиг, оставлю у себя как было. Можно передавать ЭлементыФормы и ПолеТабличногоДокумента как параметры процедуры. Тогда не будет привязки к конкретной форме и табличному полю, а сама процедура станет универсальной и ее можно будет вынести в один из общих модулей. (18) Да, можно и так - прописать параметры и вынести в общий модуль. Получится действитель универсально.
В публикации описана сама идея генерации кнопочек, а как ее применить - каждый для себя решит сам, в меру своих знаний и потребностей. :D (18) Я об этом уже говорил в (8)
Есть один минус - у действия "СвернутьДоУровня" может быть только один параметр (Элемент), сюда параметры не передашь, значит, нужно либо где-то отдельно хранить данные либо пользоваться шаблоном, который автоматом развернется в нужный/правильный код. Врезал в типовой универсальный отчет. Теперь работает во всех отчетах, сделанных на его основе включая внешние. Спасибо за идею.

+23 Изменения для модуля УниверсальногоОтчета с учетом комментария (27)

// ИС КАВ ( 20.04.2011
Перем ФормаДляГруппировок ;
Перем ЭлементовГруппировок ;

Процедура СгенерироватьКнопкиУправленияГруппировкой ( ТабличныйДокумент , УдалитьВсеКнопки = Ложь)

Если ФормаДляГруппировок = Неопределено Тогда
Возврат;
КонецЕсли;

ЭлементыФормы = ФормаДляГруппировок . ЭлементыФормы ;
ИмяТабличногоДокумента = ТабличныйДокумент . Имя ;

НачалоВерх = ТабличныйДокумент . Верх + 2 ; // Привязка к верхнему левому углу ПоляТабличногоДокумента
НачалоЛево = ТабличныйДокумент . Лево + 2 ; // Привязка к верхнему левому углу ПоляТабличногоДокумента

// Удалим лишние кнопки
КоличествоГруппировок = ТабличныйДокумент . КоличествоУровнейГруппировокСтрок ();
Для Индекс = ?( УдалитьВсеКнопки , 1 , КоличествоГруппировок + 1 ) По ЭлементовГруппировок Цикл
ИмяКнопки = "КнопкаГруппировки_" + Формат ( Индекс , "ЧЦ=3; ЧН=; ЧВН color:red">) + "_" + ИмяТабличногоДокумента ;
ТекЭлемент = ЭлементыФормы . Найти ( ИмяКнопки );
Если ТекЭлемент <> Неопределено Тогда
ЭлементыФормы . Удалить ( ТекЭлемент );
КонецЕсли;
КонецЦикла;

// Добавим новые кнопки по количеству группировок
Для Индекс = 1 По КоличествоГруппировок Цикл
ИмяКнопки = "КнопкаГруппировки_" + Формат ( Индекс , "ЧЦ=3; ЧН=; ЧВН color:red">) + "_" + ИмяТабличногоДокумента ;
Если ЭлементыФормы . Найти ( ИмяКнопки ) = Неопределено Тогда
НоваяКнопка = ЭлементыФормы . Добавить ( Тип ( "Кнопка" ), ИмяКнопки );
НоваяКнопка . Верх = НачалоВерх ;
НоваяКнопка . Лево = НачалоЛево + ( 13 * ( Индекс - 1 ));
НоваяКнопка . Высота = 12 ;
НоваяКнопка . Ширина = 12 ;
НоваяКнопка . Шрифт = Новый Шрифт ( "Arial" , 7 );
НоваяКнопка . Заголовок = "" + Индекс ;
Если Индекс = 1 Тогда
НоваяКнопка . Подсказка = "Показать группировки верхнего уровня" ;
ИначеЕсли Индекс = КоличествоГруппировок Тогда
НоваяКнопка . Подсказка = "Показать все группировки" ;
Иначе
НоваяКнопка . Подсказка = "Показать группировки до уровня " + Индекс ;
КонецЕсли;
НоваяКнопка . ГоризонтальноеПоложение = ГоризонтальноеПоложение . Право ;
Попытка
НоваяКнопка . УстановитьДействие ( "Нажатие" , Новый Действие ( "КоманднаяПанельФормыБыстрыеОтборы" ));
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;

КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()
// ИС КАВ )

Процедура СформироватьОтчет ( ТабличныйДокумент , Очищать = Истина, ФиксироватьЗаголовок = Истина, Отчет = Неопределено) Экспорт

СгенерироватьКнопкиУправленияГруппировкой ( ТабличныйДокумент ); // ИС КАВ 20.04.2011

Процедура УправлениеОтображениемЭлементовФормы ( Объект , Форма , КнопкаИмя = Неопределено) Экспорт

// ИС КАВ ( 20.04.2011
Если Лев ( КнопкаИмя , 18 ) = "КнопкаГруппировки_" Тогда
ТабличныйДокумент = Форма . ЭлементыФормы [ Сред ( КнопкаИмя , 23 )];
Форма . ТекущийЭлемент = ТабличныйДокумент ;
Уровень = Число ( Форма . ЭлементыФормы [ КнопкаИмя ]. Заголовок ); // здесь записан нужный уровень
ТабличныйДокумент . ПоказатьУровеньГруппировокСтрок ( Уровень - 1 );
Возврат;
КонецЕсли;
// ИС КАВ )

Процедура УправлениеПанельюБыстрыеОтборы ( Объект , Форма ) Экспорт

// ИС КАВ ( 25.04.2011
Если Форма . ЭлементыФормы . Найти ( "ПолеТабличногоДокументаРезультат" ) <> Неопределено Тогда
СгенерироватьКнопкиУправленияГруппировкой ( Форма . ЭлементыФормы . ПолеТабличногоДокументаРезультат , Истина);
КонецЕсли;
// ИС КАВ )

Процедура ФормаПриОткрытии ( Объект , Отчет , Форма , СоставПанелиДополнительныхЭлементовФормы = Неопределено, ИмяОбъекта = Неопределено) Экспорт

// ИС КАВ ( 20.04.2011
ФормаДляГруппировок = Форма ;
ЭлементовГруппировок = 0 ;
// ИС КАВ )

Свертка группировок определенного уровня

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


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


Для того чтобы свернуть/развернуть группировки определенного уровня у табличного документа имеется метод ПоказатьУровеньГруппировокСтрок() (для колонок имеется аналогичный метод ПоказатьУровеньГруппировокКолонок ). Данный метод раскрывает группировки с уровнем, меньше переданного в метод (нумерация уровней начинается с нуля), закрывает группировки с уровнем, равным переданным и отставляет без изменений группировки с уровнем больше переданного.

Таким образом, если вызывать метод ПоказатьУровеньГруппировокСтрок() с уровнем 1, то результат для приведенного в начале статьи примера будет следующим:


При этом если раскрыть зарытые группировки, то вложенные группировки будут раскрытыми.


Если нужно, чтобы были скрыты все группировки до определенного уровня, то следует вызывать метод ПоказатьУровеньГруппировокСтрок() в цикле, последовательно скрывая все уровни до нужного.

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

Читайте также: