группировка строк в форме
Программирование в 1С для всех
В этой статье я покажу, как в табличных документах 1С реализовывать группировку строк и колонок.
Группировка строк в табличном документе 1С
Для демонстрации создадим у обработки простой макет табличного документа с одной областью и с одним параметром области.
На основной форме обработки сделаем команду ВывестиГоризонтальнуюГруппировку, реквизит формы КоличествоЧисел (тип Число), и всё это разместим на форме.
При выполнении команды, я буду выводить ряд чисел с дробными частями. Для этого, создадим обработчик команды формы на клиенте и серверную процедуру, в которой будем заполнять табличный документ.
Получится такой код:
Подробно о формировании областей табличного документа читайте в статье:
Результат работы этого кода будет следующий:
Изменим этот макет: сделаем группировку целых чисел, а дробные числа будут с небольшим отступом.
Для того, чтобы дробные числа выводились с отступом изменим макет.
Откроем палитру свойств ячейки, в которой выводится параметр НомерСтроки.
В этой палитре нас интересует свойство АвтоОтступ. Установим в него значение.
На этом с макетом закончим. Доработаем код.
В этом коде мы применили методы НачатьАвтогруппировкуСтрок() и ЗакончитьАвтогруппировкуСтрок() перед тем как начали заполнять табличный документе, и после того как закончили. Кроме того, мы дополнили параметры метода Вывести табличного документе. Если в первом параметре указывается область которая будет выводиться в табличном документе, то во втором параметре указываем уровень группировки, в третьем – название группировки, а четвертом – булево значение, которое определяет, будет ли сворачиваться группировка или нет, после того, как она будет выведена.
Результат работы этого кода:
Группировка колонок в табличном документе 1С
Группировка колонок в табличном документе осуществляется по аналогии с группировкой строк. Для демонстрации создадим макет табличного документа, в котором сделаем вертикальную область с единственным параметром.
А также на основной форме обработки создадим команду формы, которую назовем «Вывести вертикальную группировку», и выведем её на форму.
Создадим обработчик команды и функцию в серверном контексте, которая формирует табличный документ с вертикальными областями, к которым применена группировка.
Смысл группировки вертикальных областей тот же, что и горизонтальных: используем методы НачатьАвтогруппировкуКолонок и ЗакончитьАвтогруппировкуКолонок перед выводом областей, а в методе Присоединить необходимо указать уровень группировки, название группы и признак того, будет развернута группа или нет, как и в методе Вывести.
Результат работы этого кода будет следующим:
Видео с бонусом! В этом бонусе я покажу, как сделать вывод иерархического справочника.
Другие статьи про табличные документы в 1С:
Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Интерактивные возможности табличного документа
Табличный документ 1С:Предприятия 8 служит не только для печати документов и отчетов. Он имеет расширенные возможности, которые превращают его в интерактивное средство взаимодействия с пользователем. К таким возможностям относятся:
Стоит заметить, что к интерактивным возможностям табличного документа можно также отнести сводные таблицы и элементы управления, располагающиеся в ячейках, но сейчас мы не будем на них останавливаться, а подробнее рассмотрим вышеперечисленные механизмы.
Расшифровки
Система «1С:Предприятие 8» поддерживает механизм расшифровок (drill-down, drill-through), когда пользователь щелкает на строке или ячейке отчета и получает более детальный отчет, если конечно это предусмотрено программистом.
Расшифровки делятся на стандартные и нестандартные. Стандартные расшифровки обрабатываются системой автоматически и не требуют дополнительных усилий от программиста, например, для документов будет открыта форма документа, а для элементов справочника будет открыта форма элемента. Если справочник редактируется в списке, то курсор будет установлен на текущем элементе в форме списка. Для выполнения нестандартной расшифровки предназначено событие ОбработкаРасшифровки.
Событие «ОбработкаРасшифровки» можно обработать, только если табличный документ помещен в форму как элемент управления, а не открывается в отдельном окне, поскольку это событие существует только у элемента управления «ПолеТабличногоДокумента». Ниже показаны категория свойств «События» элемента управления «ПолеТабличногоДокумента», где назначается процедура-обработчик расшифровки:
Сама процедура «РасшифроватьСтроку» может выглядеть следующим образом (как пример):
Примечание 1. В модуле приложения (аналог глобального модуля в версии 7.7) больше нет события ОбработкаЯчейкиТаблицы. Вся обработка расшифровок должна быть произведена в модуле формы, где располагается элемент управления «ПолеТабличногоДокумента».
Примечание 2. Событие «ОбработкаРасшифровки» возникает при щелчке на ячейке или рисунке, содержащих расшифровку. Не путайте его с событием «Выбор», возникающим для всех ячеек и рисунков при двойном щелчке мыши или нажатии клавиши Enter, причем, сначала возникает событие «Выбор», а потом «ОбработкаРасшифровки».
Группировки
В 1С:Предприятии 8 появилась возможность группировать данные в отчете. Группировки могут быть горизонтальные и вертикальные, тогда слева и сверху появляются специальные маркеры, позволяющие пользователю разворачивать и сворачивать группы, как показано на следующем рисунке:
Самый простой способ добавить группировки в отчет — доверить эту задачу системе, тогда от программиста потребуются минимальные усилия. Необходимо всего лишь применить методы НачатьАвтоГруппировкуСтрок/НачатьАвтоГруппировкуКолонок и ЗакончитьАвтоГруппировкуСтрок/ЗакончитьАвтоГруппировкуКолонок, которые включают режим автоматической группировки строк или колонок соответственно. В этом режиме при вызове методов Вывести (для строк) и Присоединить (для колонок) указываются дополнительные параметры для группировки:
При использовании группировок очень полезно установить свойство ячейки «АвтоОтступ» в какое-нибудь ненулевое значение, например, 5. Тогда система будет автоматически добавлять заданное количество пробелов слева текста ячейки, основываясь на текущем уровне группировки. В результате отчет приобретет удобный внешний вид для отображения иерархии данных.
Следующий пример выводит список товаров с группировками:
Примечания
Ячейки табличного документа могут иметь примечания, тогда в правом верхнем углу ячейки выводится маленький красный треугольник. При наведении курсора мыши на ячейку примечание показывается во всплывающем окне:
Программная установка примечаний реализуется следующим образом:
Обратите внимание, что свойство «Примечание» у объекта «ОбластьЯчеекМакета» является объектом типа «Рисунок», а не простой строкой. Через этот объект можно редактировать внешний вид примечания, шрифт и цвет текста, фон, линии и т.д.
Группировка табличной части документа
(22) В табЧасти никак не сделаете, потому что там нельзя просто деревозначений сделать. По поводу дублей тут странно так как реквизит формы не должен влиять на печать никак.
По поводу группировки, да тут видать все таки сортировка не совсем так отрабатывает, лучше все таки через двойной перебор сделать, он подстроки не создал здесь;
Соответствие тут нужно для быстрого поиска родителей.
Ну так как у вас тут нет иерархии то придется два раза переборку делать, что бы сначала вывести строки родителей а уже потом в данные строки добавлять детей
ну как то так
ТаблицаФормы должна быть с типом ДеревоЗначений
Если в модуле объекта, тогда у вас там ДеревоЗначений будет уже, и работать надо с деревом значений
Все примерно также, только вместо
(8)
простите, я слишком глуп чтобы сразу всё понять.
На данный момент я заполнял Табличное поле «Расшифровка», которое берет данные с Табличной части «Расшифровка». Заполняется при нажатии на кнопку и вызывает процедуру с модуля объекта
Чтобы сделать так, как вы сказали, то мне надо удалить эту табличную часть «Расшифровка» и вместо неё на форму добавить ДеревоЗначений?
Я пробовал вместо табличного поля создать дерево значений РасшифровкаДерево, но когда к нему пытаюсь обратиться с модуля объекта, то пишет, что Переменная не определена
Простите за глупые вопросы, просто хочу понять как это правильно делается
ПриСозданииНаСервере, заполняйте этот реквизит из вашей табличнойЧасти, по первому методу
Тут попытка все в один цикл запихать, по идее должно сработать так как у нас отсортировано все как надо
Группировка в 1С СКД
Одним из базовых функционалов 1С СКД является возможность определения структуры отчета. Ни один отчет в СКД не обходится без настройки группировок. Поэтому в этой статье мы разберем, как производится такая настройка.
Итак, после того как вы определили наборы данных, по которым будет построен отчет, вы можете приступать к настройке структуры отчета. До этого этапа обычно также производят настройку ресурсов, но такая последовательность не является обязательной.
Определение группировок производится на закладке «Настройка» схемы компоновки данных в верхнем правом окне.
Рисунок 1
Детальные записи
Начнем с простого. Если нам нужно вывести все строки набора в отчет, добавляем группировку «Детальные записи». Добавление новой группировки производится через правую клавишу мыши (ПКМ) на уровне отчета или через клавишу «Ins». Чтобы добавить группировку «Детальные записи», в открывшемся диалоге мы не указываем поле.
Далее в области «Настройки текущей группировки» (см. рисунок 1) мы можем на закладке «Выбранные поля» просто перенести все доступные поля в список выбранных. При этом мы указали настройки (список полей) для всего отчета. В нашем случае весь отчет это одна группировка, поэтому нет разницы — задаем мы настройки для всего отчета или для группировки.
Итоговый отчет будет выглядеть как таблица с колонками выбранных полей и со всеми строками из набора.
Такой вариант отчет бывает полезным для отладки, чтобы понять какие данные содержатся в наборе.
Группировка по полю
Дальше у нас может возникнуть задача — добавить итоговые записи в отчет по какому-то полю. В этом случае при добавлении новой группировки мы должны указать это поле. Например, в нашем случае мы можем добавить группировку по контрагенту.
Теперь, если как прежде добавим все поля в выбранные поля для нашей группировки, мы не получим ожидаемый результат
Все потому что в группировку, определяющую итоговую запись попадают только значения полей, из которых состоит эта группировка и ресурсы. Ресурсы мы не определили, поэтому они не попали в отчет. Давайте определим два ресурса
Теперь в наш отчет попали ресурсы, но не попали прочие поля. Об этом поговорим позже.
Группировка иерархическая
В 1С СКД есть возможность добавления итоговой записи для иерархических объектов – справочников, планов видов характеристик. В этом случае кроме итоговой записи по конечному элементу в отчет добавляется итоговая запись по всем родителям, содержащим этот элемент.
Например, сделаем вариант отчета с группировкой по номенклатуре, включая итоги по группам (папкам).
Если выбрать вариант «Иерархия» добавляются итоги по родителям и элементам, если «Только иерархия», то итоги только по родителям. Выберем вариант «Иерархия» и посмотрим, что получится:
В отчет кроме итоговых записей по элементам добавились записи по родительским элементам.
Группировка по нескольким полям
Группировку можно сделать не по одному полю, а по нескольким. Например, в случае нашего отчета сделаем группировку по периоду и включим для этого в группировку два поля – начало периода и конец периода. Добавим группировку, указав поле начало периода (или не указывая ничего), затем кликнем по группировке, в открывшемся списке определим следующие поля:
По смыслу такая группировка аналогична конструкции «СГРУППИРОВАТЬ ПО НачалоПериода, КонецПериода» в языке запросов.
Получим вот такой отчет
Подчиненные группировки
Теперь вернемся к разделу «Группировка по одному полю». В принципе на предыдущем примере мы это тоже можем реализовать – в отчет у нас не попали прочие поля. Как уже было озвучено ранее, потому что в группировку попадают только значения полей группировки и ресурсы.
В 1С СКД имеется возможность создавать подчиненные группировки. Как мы добавляли первую группировку для всего отчета, так мы можем добавить любую подчиненную группировку для другой (родительской группировки).
Добавим в предыдущий вариант отчета группировку детальных записей:
И добавим сразу себестоимость в ресурсы. Получится такой отчет:
Действие настроек родительской группировки на подчиненные
При использовании группировок нужно учитывать важную особенность работы СКД – наследование настроек подчиненными группировками. Все группировки наследуют все настройки заданные на уровне отчета. Все подчиненные группировки наследуют список выбранных полей и сортировку от родительской группировки, если в списке указан элемент «Авто». Условное оформление, отбор, другие настройки не наследуются от родительской группировоки.
Для подчиненных группировок мы можем определить свои настройки. Например, определим для детальных записей в последнем варианте свой список полей. Допустим в детальных записях нам нужно к общим полям добавить код номенклатуры:
Для этого мы в поле «Настройки» выбираем группировку «Детальные записи». В выбранных полях оставляем «Авто» — это значит, что мы наследуем в группировке поля из родительских группировок. И добавляем поле код. Получаем (в других настройках нужно указать расположение реквизитов – «Отдельно»):
Мы можем переопределить полностью родительские поля и задать свой список полей:
Таблица
До сих пор мы рассматривали с вами «одномерные» отчеты, когда информация из набора разворачивалась в одном направлении – вертикальном. В 1С СКД имеется возможность выводить информацию в двух направлениях одновременно – в вертикальном и горизонтальном в виде таблицы. Для этого используется элемент структуры «Таблица»:
При добавлении таблицы в настройки у нее доступны два измерения, в которые можно добавлять группировки – «Строки» для вертикального разворота, «Колонки» — для горизонтального разворота:
Используя набор данных с простым запросом:
Построим отчет, в котором в строках разместим группировку по контрагенту и номенклатуре, а в колонках по году и месяцу:
В отчете у нас определены ресурсы, которые мы добавили в настройки для отчета в выбранные поля:
Получили вот такой отчет:
Как видно в настройках и в результате отчета, подчиненные группировки можно добавлять не только для строк, но и для колонок.
Собственные итоги
При использовании таблицы в структуре отчета на СКД часто возникает необходимость добавить дополнительные колонки со своим составом полей или реализовать итог по горизонтали с другим составом ресурсов. Тоже самое касается и строк – чаще бывает необходимо реализовать собственные итоги в строках.
Рассмотрим на практическом примере. Пусть у нас есть такой (немного странный отчет):
За каждый месяц мы выводим количество поступивших и проданных товаров. В общем итоге по горизонтали (и только в нем) нам нужно вывести процентное отношение расхода к приходу. Первой колонкой нужно вывести остаток по номенклатуре. В общем итоге за период нужно вывести максимальный приход и максимальный расход.
Итак, первоначальная настройка отчета у нас совсем простая:
Набор и запрос несложные – вы можете сделать его на своей конфигурации сами.
Начнем с добавления процента в общем итоге. Для этого отключим вывод общего итога по горизонтали на закладке «Другие настройки»:
Далее нам нужно добавить группировку в колонки, в которой мы разместим наши итоги. Это может быть или группировка детальных записей или группировка по вычисляемому полю. Первое чуть проще, но итоговый результат нас не совсем устроит – нет заголовка у итога (это можно доработать с помощью макета), выберем второй вариант. Для этого добавим вычисляемое поле для общего итога «Итого», добавим вычисляемое поле «Процент» для расчета процента:
Добавим ресурс для общего итога с такой формулой:
Добавим колонку в настройки, добавим наши поля в выбранные ТОЛЬКО для группировки «Итого»:
Получим отчет в нужном виде:
Теперь добавим колонку остатка после колонки номенклатура. Для этого добавим второй набор данных (остатки), свяжем его с основным набором:
Теперь мы реализуем колонку через детальные записи, чтобы увидеть различие с группировкой по вычисляемому полю. Это не будет окончательное решение, но в рамках данной статьи будет достаточным:
Получим вот такую форму отчета:
И последняя задача – поменять общий вертикальный итог. Для нашей задачи такое требование можно выполнить несколько проще — без добавления группировки с собственным итогом, потому что в нашем случае не меняется макет общего итога, а меняются только значения ресурсов. Если нужно поменять макет ресурсов (состав ресурсов), то у нас есть ролик, в котором можно посмотреть, как делаются собственные итоги в строках.
Мы же решим эту часть задачи по другому, с помощью опции «Рассчитывать по» на закладке «Ресурсы»:
Процент для общего итога по строкам в общем итоге по горизонтали считать не будем. Получаем вот такой отчет:
Здесь важно заметить, что в исходном наборе данные по номенклатуре и месяцу должны быть сгруппированы, чтобы не было повторений для одной номенклатуры. Если такие повторения будут, то функция «Максимум» будет работать неверно. В этом случае выражение для ресурса в общем итоге будет более сложное, но это тема для другой статьи.
Вывод группировок в пользовательские настройки
Кроме изменения структуры отчета через варианты отчета в СКД имеется возможность изменять группировки отчета в режиме пользовательских настроек. Это может пригодится если пользователь пользуется одним и тем же вариантом отчета, но может часто изменять группировки отчета по своему желанию.
Для этого в СКД есть возможность добавить настройку группировок в пользовательские настройки:
Для отчета в целом
Для таблицы есть возможность управлять группировками строк и колонок:
Для выбранной группировки можно управлять вложенными (подчиненными) группировками:
В режиме предприятия это выглядит примерно так:
Группировки добавляются к заданным в варианте отчета. Можно не устанавливать никакие группировки в варианте отчета и тогда пользователь может полностью управлять структурой отчета. Надо конечно заметить, что в этом режиме нельзя добавить таблицу или диаграмму – только обычную группировку. Причем нельзя добавить составную группировку. При добавлении группировки как показано на рисунке устанавливается дополнительно две родительских группировки, а не одна составная:
Программная работа с группировками
При создании отчета на СКД имеется возможность создать отчет полностью программно. При этом можно таким образом создать как схему компоновки, так и заполнить настройки компоновщика настроек. В обоих случаях мы работаем с объектом «НастройкиКомпоновкиДанных».
Пример программного создания группировки
// Добавим новую группировку в структуру отчета.
// Укажем, по каким полям нужно группировать.
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(«Номенклатура»);
// Укажем тип иерархии.
Более подробно можно изучить программную работу с настройками (не только группировок) можно по ссылкам указанным в материалах для подготовки.