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