При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести количество определенных объектов в колонках. Например, количество сотрудников определенной категории, количество документов или флаги (булево). Проблема заключается в том, что если данные в колонках — это ссылки, перечисления или строки, обычное арифметическое сложение в ресурсах не сработает. Программа выдаст ошибку или пустой результат, так как она «не умеет» складывать ссылки.
В этой статье мы разберем, как правильно организовать суммирование таких данных, чтобы в итоге получить корректную пятую колонку с общим итогом. Мы проанализируем ситуацию на примере реального запроса и настроек системы компоновки данных.
Это самый простой и правильный путь, если вам нужно посчитать количество записей. Когда мы выводим в отчет поле, содержащее, например, Должность или ВидСобытия, СКД воспринимает их как объекты. Чтобы получить число, нам нужно применить к ним агрегатную функцию Количество().
Разберем по шагам, как это настроить в схеме компоновки данных:
Категория). В колонке «Выражение» выберем функцию Количество(Категория).Ученики). В выражении укажем Количество(Ученики).Количество(Категория) + Количество(Ученики).Важно помнить, что функция Количество() считает все непустые значения. Если в запросе поле содержит NULL, оно не будет учтено в итоговой сумме, что нам и требуется.
Если логика отчета сложная и вы хотите избежать путаницы с типами данных в самой СКД, можно подготовить данные заранее в тексте запроса. Этот метод часто называют «Методом единиц».
Проанализируем пример запроса, предоставленный пользователем. В нем используются конструкции ВЫБОР КОГДА ... ТОГДА Значение ИНАЧЕ NULL КОНЕЦ. Вместо того чтобы возвращать само значение, мы можем возвращать число 1.
Рассмотрим, как изменить фрагмент запроса:
ВЫБРАТЬ
ВЫБОР
КОГДА СведенияКонтрактаДоговораСотрудника.СрочныйДоговор = ИСТИНА
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК ВременноЧислом,
ВЫБОР
КОГДА КадроваяИсторияСотрудников.ФизическоеЛицо.Пол = ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Женский)
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК ПринятоЖенщинЧислом
В этом случае в СКД придут уже готовые числа (0 или 1). На закладке «Ресурсы» для таких полей достаточно будет использовать стандартную функцию СУММА(). Тогда сложение в пятой колонке станет тривиальной задачей: СУММА(ВременноЧислом) + СУММА(ПринятоЖенщинЧислом).
Вычисляемые поля — это мощный инструмент СКД, который позволяет производить расчеты над данными уже после выполнения запроса. Если нам нужно сложить две колонки, которые уже являются ресурсами, мы можем создать новое вычисляемое поле.
Рассмотрим алгоритм создания итоговой колонки через вычисляемые поля:
ВсегоКатегорийИУчеников.ВсегоКатегорийИУчеников.ЕСТЬNULL(Количество(Категория), 0) + ЕСТЬNULL(Количество(Ученики), 0).Важный нюанс: Использование функции ЕСТЬNULL() крайне рекомендуется. В 1С (и в SQL в целом) при сложении числа с NULL результат всегда будет NULL. Если у вас 10 учеников, но 0 сотрудников в категории (значение NULL), то без ЕСТЬNULL итоговая сумма превратится в пустоту.
В настройках ресурсов есть колонка «Рассчитывать по...». Если вы оставите это поле пустым, ресурс будет рассчитываться для всех группировок и для общих итогов. Если же вам нужно, чтобы итоговая сумма выводилась только в определенных разрезах (например, только по подразделениям, но не по конкретным сотрудникам), укажите нужные группировки в этом поле.
Для простых отчетов, где нужно просто сложить колонки в строке и получить общий итог внизу, это поле обычно оставляют незаполненным.
Разберем ситуации, которые могут привести к неверным данным:
Поле1 + Поле2 вместо СУММА(Поле1) + СУММА(Поле2). СКД может не понять, в какой момент выполнять сложение — до группировки записей или после.КадроваяИстория, СведенияОПенсиях, Ученики), может возникнуть ситуация «размножения» строк. Если у одного сотрудника две записи в доп. реквизитах, то функция Количество() посчитает его дважды. В этом случае используйте Количество(РАЗЛИЧНЫЕ Сотрудник).ВЫБОР КОГДА вы возвращаете пустую ссылку ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка), то функция Количество() всё равно её посчитает, так как пустая ссылка — это не NULL, а объект. В таких случаях в блоке ИНАЧЕ лучше возвращать NULL.Представим, что мы имеем запрос из сообщения 12. Нам нужно сложить Категория и Ученики. Выясним причину, почему простое сложение может не работать — это разные типы объектов. Настроим систему следующим образом:
На закладке «Ресурсы» прописываем:
Категория | Выражение: Количество(Категория)Ученики | Выражение: Количество(Ученики)ИтогоКоличество | Выражение: Количество(Категория) + Количество(Ученики)Если поле ИтогоКоличество не создано в запросе, просто впишите его название вручную в колонку «Поле» на закладке ресурсов, и СКД предложит создать его как вычисляемое. Это быстрый способ получить нужный результат без лишних манипуляций в конфигураторе.
Таким образом, комбинируя возможности запроса и механизмы ресурсов СКД, мы можем гибко управлять расчетом итогов даже для тех данных, которые изначально не являются числами. Помните о проверке на NULL и всегда анализируйте, не приводят ли соединения таблиц к дублированию записей, чтобы ваши итоги всегда оставались точными.