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