При разработке отчетов на базе системы компоновки данных (СКД) разработчики часто сталкиваются с требованием заказчика вывести дополнительную аналитическую строку непосредственно под основной строкой группировки. Классический пример — управленческий отчет по взаиморасчетам или договорам, где сумма договора указана в валюте регламентированного учета (например, в рублях), а прямо под ней требуется отобразить пересчет этой же суммы в альтернативную валюту (например, в тенге, долларах или евро).
Естественное желание пользователя — видеть пересчитанную сумму строго в той же колонке, где находится исходный показатель, а не в отдельной колонке в правой части отчета. Вывод отдельной колонки раздувает горизонтальный размер таблицы, затрудняет печать документа и ухудшает визуальное сопоставление данных. Однако стандартное добавление вычисляемого поля в ресурсы приводит к тому, что СКД автоматически формирует для него новую самостоятельную колонку таблицы.
Архитектура компоновки данных строго разграничивает строки группировок и колонки показателей. Когда поле объявляется ресурсом на вкладке Ресурсы и выбирается в настройках отчета на вкладке Выбранные поля, компоновщик интерпретирует его как полноценную метрику отчета. Для каждого ресурса строится собственный столбец в итоговой таблице.
Если разработчик пытается решить задачу «в лоб» — добавляет в группировку подчиненную строку детальных записей, очищает в ней заголовки и выводит вычисляемое поле в ресурсы, СКД все равно выделяет под вычисляемое поле новый столбец правее основных колонок. Попытка убрать поле из выбранных полей группировки верхнего уровня и оставить только в детальных записях часто приводит либо к полному исчезновению значения, либо к смещению разметки ячеек.
Для реализации компактного представления существует три принципиально разных подхода: использование механизма условного оформления с динамической подменой поля, создание пользовательского макета поля и модификация исходного набора данных в запросе. Ниже подробно рассмотрены все три способа, шаги их настройки и сопутствующие ограничения.
Наиболее изящный способ, не требующий ручной перерисовки макета отчета, заключается в комбинировании подчиненной группировки детальных записей и механизма условного оформления СКД. Малоизвестная особенность условного оформления состоит в том, что параметр Текст может принимать не только фиксированную строку, но и значение любого доступного поля схемы компоновки данных.
Пошаговый алгоритм реализации:
СуммаВТенге. В колонке выражения укажите формулу пересчета, например: СуммаДоговора * КурсВалюты или вызов экспортной функции общего модуля.СуммаВТенге на вкладку Ресурсы. Если агрегация для всего отчета не нужна, можно обойтись без добавления в ресурсы, однако при использовании формул агрегации наличие ресурса гарантирует корректный расчет на всех уровнях.Контрагент), внутри нее — подчиненную группировку Договор, а внутрь группировки Договор добавьте подчиненный элемент Детальные записи.СуммаДоговора (ту колонку, в которой визуально должно отобразиться значение пересчета).СуммаВТенге.Договор) аналогичным образом настройте оформление: включите параметр Текст, но оставьте строковый тип и напишите пояснение, например, «В том числе в тенге:» или «Сумма в KZT».В результате формирования отчета СКД выведет строку договора с исходной суммой в рублях, а следующей строкой отобразит детальную запись, где в колонке договора будет написано служебное примечание, а в колонке суммы договора отобразится пересчитанное значение.
Ограничения способа: подмена параметра Текст меняет только визуальное строковое представление ячейки в табличном документе. При выгрузке отчета в Microsoft Excel значение в этой строке может трактоваться как текст, а не как числовое поле, что потребует дополнительного преобразования форматов при попытке суммирования ячеек в сторонней программе.
Если добавление новой физической строки отчета нежелательно из-за риска задвоения строк или усложнения структуры группировок, задачу можно решить выводом двух сумм в одной и той же ячейке таблицы друг под другом. Для этого используется механизм пользовательских макетов СКД.
Пошаговый порядок настройки:
СуммаВТенге с формулой расчета.СуммаДоговора, а в поле Группировка укажите группировку Договор.Значение на Шаблон.
[СуммаДоговора]
[СуммаВТенге]
В окне параметров макета для каждого из параметров можно индивидуально настроить форматирование (разделители групп, количество знаков после запятой, валютный постфикс). Для того чтобы визуально отделить вторую строку, перед нижним параметром можно добавить текстовую приставку, например: KZT: [СуммаВТенге].
Условия применения и ограничения: данный способ не создает дополнительных строк в отчете, исключает проблемы с задвоением итоговых сумм и гарантирует стабильную ширину столбцов. Однако объединение двух показателей в одной ячейке делает невозможным раздельное автосуммирование средствами табличного документа 1С или формулами Excel.
Когда требуется, чтобы вторая строка была полноценной строкой таблицы с числовым типом данных для всех выгрузок и расчетов, пересчет переносят на уровень набора данных запроса с помощью оператора ОБЪЕДИНИТЬ ВСЕ.
Пример структуры текста запроса:
ВЫБРАТЬ
Договоры.Ссылка КАК Договор,
Договоры.Владелец КАК Контрагент,
1 КАК ПорядокСтроки,
Договоры.Сумма КАК Сумма,
"Основная сумма (руб.)" КАК ОписаниеПоказателя
ИЗ
Справочник.ДоговорыКонтрагентов КАК Договоры
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Договоры.Ссылка КАК Договор,
Договоры.Владелец КАК Контрагент,
2 КАК ПорядокСтроки,
ВЫРАЗИТЬ(Договоры.Сумма * &КурсТенге КАК ЧИСЛО(15, 2)) КАК Сумма,
"В том числе в KZT" КАК ОписаниеПоказателя
ИЗ
Справочник.ДоговорыКонтрагентов КАК Договоры
В настройках СКД структура строится следующим образом: группировка Контрагент -> группировка Договор -> подчиненная группировка по полю ПорядокСтроки (или детальные записи с сортировкой по ПорядокСтроки). В выбранные поля выводится стандартное поле Сумма.
Условия применения и ограничения: способ гарантирует стопроцентную совместимость с экспортом в электронные таблицы и сохраняет числовой тип данных. Главный недостаток — усложнение набора данных и необходимость контроля итогов, поскольку простое применение функции Сумма(Сумма) на уровне вышестоящих группировок сложит рубли с тенге.
Использование подчиненных детальных записей или объединения строк создает серьезную опасность искажения общих итогов по группировкам Контрагент и отчета в целом. Если ресурс рассчитывается стандартным выражением Сумма(СуммаДоговора), СКД может просуммировать значения как исходной, так и дополнительной строки.
Чтобы исключить искажение итогов, примените один из следующих механизмов:
Сумма(ВЫБОР КОГДА ПорядокСтроки = 1 ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ)
Выбор конкретного варианта зависит от бизнес-требований к отчету: