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