Как вывести поля группировки строк в отчете СКД дважды (в начале и в конце таблицы)?

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

При работе с отчетами в 1С:Предприятии, особенно с широкими табличными отчетами, предназначенными для печати, часто возникает необходимость дублировать ключевые поля группировки. Представьте ситуацию: у вас есть отчет, в котором строки группируются по номенклатуре, а колонки — по контрагентам. Отчет получается очень широким, и при просмотре распечатанной версии или при горизонтальной прокрутке становится сложно сопоставить данные в конце строки с ее заголовком-номенклатурой, расположенным только в начале. Пользователи хотят видеть эту номенклатуру как слева, так и справа от основной части отчета. Мы с вами разберем несколько подходов к решению этой задачи, от простых до более продвинутых, а также рассмотрим, как избежать типичных ошибок при настройке сортировки в таких отчетах.

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

Метод с вычисляемым полем и ресурсом

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

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

    Нажимаем кнопку «Добавить» и задаем следующие параметры:

    • Имя: Например, НоменклатураПраваяКолонка.
    • Выражение: Указываем имя поля, которое мы хотим продублировать, в нашем случае это Номенклатура.
    • Тип значения: Убедитесь, что тип соответствует типу исходного поля (например, СправочникСсылка.Номенклатура или Строка, если это представление).

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

  2. Создание ресурса на основе вычисляемого поля: Следующий шаг — превратить наше вычисляемое поле в ресурс. Переходим на вкладку «Ресурсы» в схеме компоновки данных.

    Нажимаем кнопку «Добавить» и задаем параметры для нового ресурса:

    • Выражение: Здесь мы указываем агрегатную функцию для нашего вычисляемого поля. Для текстовых полей, таких как наименование номенклатуры, часто используются функции Максимум() или Минимум(). Например: Максимум(НоменклатураПраваяКолонка).
    • Поле: Указываем имя нашего вычисляемого поля НоменклатураПраваяКолонка.
    • Функция: Выбираем Максимум (или Минимум).

    Почему Максимум() или Минимум()? В контексте одной сгруппированной строки отчета, значение номенклатуры будет одним и тем же. Агрегатные функции Максимум() и Минимум() для текстовых полей просто возвращают это единственное значение (по сути, "последнее" или "первое" в алфавитном порядке, но поскольку оно одно, это не имеет значения). Это позволяет Системе Компоновки Данных воспринимать текстовое поле как ресурс и выводить его в областях, предназначенных для итогов, включая колонки отчета.

  3. Добавление ресурса в настройки отчета: Теперь, когда у нас есть ресурс, который отображает нашу номенклатуру, мы можем добавить его в структуру отчета как обычное поле.

    Переходим на вкладку «Настройки» в СКД, выбираем тип настройки «Расширенный». В нашей структуре отчета, где у нас есть группировка по строкам (Номенклатура) и колонкам (Контрагенты), нам нужно добавить новый элемент.

    Найдите группировку по колонкам (Контрагенты) и в ней добавьте новое поле. Это поле должно быть нашим созданным ресурсом НоменклатураПраваяКолонка. Расположите его после всех колонок с данными (например, после колонки с количеством или суммой).

    После этих действий отчет будет выводить номенклатуру как в начале строки (как поле группировки), так и в конце (как ресурс).

  4. Сохранение иерархии номенклатуры в дублирующей колонке (дополнительно): Стандартный вывод ресурса не отображает иерархию с отступами, как это делает поле группировки. Он просто выведет наименование элемента или группы. Если нам необходимо визуально отобразить иерархию в дублирующей колонке, мы можем немного усложнить наше вычисляемое поле.

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

    Модифицируем наше вычисляемое поле НоменклатураПраваяКолонка на вкладке «Вычисляемые поля»:

    • Имя: НоменклатураПраваяКолонкаСИерархией (создадим новое для наглядности).
    • Выражение: Используем функцию УровеньВГруппировке() и СтрПовторить() для создания отступов.
    
    СтрПовторить(" ", УровеньВГруппировке("Номенклатура") * 3) + Представление(Номенклатура)
    

    Здесь "Номенклатура" — это имя группировки, для которой мы хотим получить уровень. Коэффициент 3 в * 3 определяет размер отступа. Функция Представление() используется для корректного вывода наименования элемента справочника.

    После создания такого вычисляемого поля, вы создаете ресурс на его основе аналогично предыдущему пункту (например, Максимум(НоменклатураПраваяКолонкаСИерархией)) и добавляете этот ресурс в структуру отчета.

Решение проблемы с сортировкой группировок в СКД

Настройка сортировки в СКД иногда может вызывать затруднения, особенно когда вы пытаетесь сортировать по полям, которые не являются частью основных группировок или ресурсов в текущем представлении. Если в группировке по контрагентам вы указываете сортировку по полю Контрагент.Код в общих настройках отчета, СКД может выдавать ошибку. Давайте разберем, почему это происходит и как правильно настроить сортировку.

  1. Анализируем причину ошибки: Ошибка часто возникает, когда сортировка задана на самом верхнем уровне отчета (вкладка «Настройки» -> «Сортировка»), а поле, по которому ведется сортировка (например, Контрагент.Код), является частью вложенной группировки (например, колонок) и не присутствует напрямую в детальных записях или в других явно выведенных полях на этом уровне. Система компоновки данных пытается применить сортировку ко всему результату, но не может однозначно определить, как это сделать для каждого элемента, не имеющего прямого отношения к верхнеуровневому полю сортировки.

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

    Разберем по шагам:

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

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

  3. Использование «Выражения упорядочивания»: В некоторых случаях, когда требуется более сложная логика сортировки, или если прямое указание поля по-прежнему вызывает проблемы, можно использовать «Выражение упорядочивания».

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

    Контрагент.Код

    или даже более сложные выражения, включающие функции, если это необходимо. Например, для сортировки строк по представлению, когда само поле является ссылкой:

    Представление(Номенклатура)

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

Гибкая настройка с использованием макетов оформления СКД

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

  1. Переход к макетам: Начинаем с перехода на вкладку «Макеты» в схеме компоновки данных. Здесь мы будем создавать пользовательский макет для нашей группировки.

  2. Создание нового макета для группировки:

    • Нажимаем кнопку «Добавить макет».
    • В открывшемся окне выбираем «Тип макета» как Группировка.
    • Для «Использование» выбираем нашу группировку, например, Номенклатура.
    • Устанавливаем «Тип области» как Заголовок или Строка, в зависимости от того, как мы хотим встроить дубликат. Чаще всего для таких целей подходит Заголовок группировки.
  3. Разработка макета в табличном документе: Откроется встроенный табличный документ, который является конструктором макета. Здесь мы можем "нарисовать" желаемую структуру строки отчета.

    • Мы создаем строку или несколько строк, которые будут представлять собой заголовок нашей группировки Номенклатура.
    • Размещаем ячейки для Номенклатуры: В начале строки создаем ячейку, в которую будет выводиться Номенклатура (основная). В конце строки, после предполагаемых колонок с данными, создаем еще одну ячейку, куда также будем выводить Номенклатуру.
    • Определяем параметры ячеек: Для каждой из этих ячеек (а также для любых других ячеек, которые будут содержать данные или текст), в свойствах ячейки (через контекстное меню или панель свойств) указываем «Параметр». В качестве значения параметра выбираем Номенклатура (или наше вычисляемое поле, если мы хотим использовать его с иерархией).
    • Добавляем промежуточные ячейки: Между двумя ячейками с номенклатурой мы должны предусмотреть место для колонок с данными (Контрагенты, показатели и т.д.). Эти области в макете могут быть пустыми или содержать специальные параметры, которые СКД автоматически заполнит данными.
    • Настройка иерархии: В макетах можно вручную управлять отступами, объединением ячеек, шрифтами и цветами, что позволяет очень точно имитировать иерархическую структуру. Например, можно использовать условное форматирование для изменения отступов в зависимости от уровня, хотя это сложнее, чем использование СтрПовторить().
  4. Связывание макета с отчетом: После того как макет готов, СКД автоматически применит его к выбранной группировке. Макеты дают полный контроль над структурой и внешним видом каждой строки или заголовка, позволяя дублировать поля, применять уникальное форматирование и точно позиционировать элементы.

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

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

  1. Обработчик события ПриКомпоновкеРезультата: В модуле объекта отчета (если это отчет, реализованный как объект конфигурации) или в модуле менеджера (если это внешний отчет/обработка) мы можем использовать обработчик события ПриКомпоновкеРезультата. Это событие вызывается после того, как СКД сформировала данные, но до того, как они будут окончательно выведены на экран.

    
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
        // Отключаем стандартную обработку, чтобы вручную вывести отчет
        СтандартнаяОбработка = Ложь;
    
        // Создаем новый табличный документ, куда будем выводить отчет
        НовыйТабличныйДокумент = Новый ТабличныйДокумент;
    
        // Формируем отчет в НовыйТабличныйДокумент
        // Здесь может быть вызов стандартного формирования СКД,
        // или более сложная логика, если требуется.
        // Например:
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(НовыйТабличныйДокумент);
        ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
        // Теперь НовыйТабличныйДокумент содержит сформированный отчет.
        // Приступаем к его программной модификации.
    
        // ... (дальнейший код для модификации)
    
        // Передаем измененный табличный документ в основной документ отчета
        ДокументРезультат.Очистить();
        ДокументРезультат.Вывести(НовыйТабличныйДокумент);
    
    КонецПроцедуры
    
  2. Модификация ТабличногоДокумента: После того как отчет сформирован в объект ТабличныйДокумент, мы можем программно пройти по его строкам и колонкам. Для этого используются методы объекта ТабличныйДокумент, такие как Область(), НайтиТекст(), Вывести(), Присоединить() и другие.

    Примерный алгоритм действий:

    1. Итерация по строкам: Мы можем пройти по каждой строке табличного документа, используя цикл.
    2. Определение области группировки: Для каждой строки, которая является заголовком группировки Номенклатура, нам нужно определить область, где выводится ее наименование. Это можно сделать, анализируя текст ячеек или используя расшифровку отчета.
    3. Копирование значения: После того как мы нашли ячейку с номенклатурой в начале строки, мы можем получить ее значение (НовыйТабличныйДокумент.Область(НомерСтроки, НачальнаяКолонка).Текст).
    4. Вставка значения: Затем мы программно вставляем это значение в новую ячейку в конце той же строки. Для этого нам может потребоваться добавить новую колонку (НовыйТабличныйДокумент.ДобавитьКолонку()) или просто установить текст в существующую ячейку (НовыйТабличныйДокумент.Область(НомерСтроки, КонечнаяКолонка).Текст = ЗначениеНоменклатуры;).
    5. Сохранение форматирования: При копировании и вставке важно также скопировать форматирование (шрифт, цвет, отступы), чтобы дублированная колонка выглядела идентично исходной. Это делается через свойства объекта ЯчейкаТабличногоДокумента (например, Ячейка.Шрифт, Ячейка.Отступ).

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

В заключение, мы с вами рассмотрели несколько способов дублирования полей группировки в отчетах СКД. Метод с вычисляемым полем и ресурсом является самым быстрым и легким в реализации для простых случаев. Макеты оформления предоставляют отличный баланс между гибкостью и сложностью, позволяя тонко настроить внешний вид. Наконец, программная доработка табличного документа — это ультимативное решение для самых сложных и уникальных требований к отображению отчета. Выбирайте метод, который наилучшим образом соответствует вашим задачам и уровню необходимой детализации.

← На главную