Как суммировать нечисловые колонки (категории, ссылки) в отчете СКД

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести количество определенных объектов в колонках. Например, количество сотрудников определенной категории, количество документов или флаги (булево). Проблема заключается в том, что если данные в колонках — это ссылки, перечисления или строки, обычное арифметическое сложение в ресурсах не сработает. Программа выдаст ошибку или пустой результат, так как она «не умеет» складывать ссылки.

В этой статье мы разберем, как правильно организовать суммирование таких данных, чтобы в итоге получить корректную пятую колонку с общим итогом. Мы проанализируем ситуацию на примере реального запроса и настроек системы компоновки данных.

Метод 1. Использование агрегатных функций на закладке «Ресурсы»

Это самый простой и правильный путь, если вам нужно посчитать количество записей. Когда мы выводим в отчет поле, содержащее, например, Должность или ВидСобытия, СКД воспринимает их как объекты. Чтобы получить число, нам нужно применить к ним агрегатную функцию Количество().

Разберем по шагам, как это настроить в схеме компоновки данных:

  1. Перейдем на закладку «Ресурсы».
  2. Добавим поле (например, Категория). В колонке «Выражение» выберем функцию Количество(Категория).
  3. Добавим второе поле (например, Ученики). В выражении укажем Количество(Ученики).
  4. Чтобы создать итоговую колонку, которая суммирует эти показатели, нам нужно добавить в список ресурсов новое выражение. В колонке «Поле» можно выбрать существующее вычисляемое поле или создать его «на лету», написав в выражении: Количество(Категория) + Количество(Ученики).

Важно помнить, что функция Количество() считает все непустые значения. Если в запросе поле содержит NULL, оно не будет учтено в итоговой сумме, что нам и требуется.

Метод 2. Преобразование данных в число на уровне запроса

Если логика отчета сложная и вы хотите избежать путаницы с типами данных в самой СКД, можно подготовить данные заранее в тексте запроса. Этот метод часто называют «Методом единиц».

Проанализируем пример запроса, предоставленный пользователем. В нем используются конструкции ВЫБОР КОГДА ... ТОГДА Значение ИНАЧЕ NULL КОНЕЦ. Вместо того чтобы возвращать само значение, мы можем возвращать число 1.

Рассмотрим, как изменить фрагмент запроса:


ВЫБРАТЬ
    ВЫБОР 
        КОГДА СведенияКонтрактаДоговораСотрудника.СрочныйДоговор = ИСТИНА 
        ТОГДА 1 
        ИНАЧЕ 0 
    КОНЕЦ КАК ВременноЧислом,
    ВЫБОР 
        КОГДА КадроваяИсторияСотрудников.ФизическоеЛицо.Пол = ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Женский) 
        ТОГДА 1 
        ИНАЧЕ 0 
    КОНЕЦ КАК ПринятоЖенщинЧислом

В этом случае в СКД придут уже готовые числа (0 или 1). На закладке «Ресурсы» для таких полей достаточно будет использовать стандартную функцию СУММА(). Тогда сложение в пятой колонке станет тривиальной задачей: СУММА(ВременноЧислом) + СУММА(ПринятоЖенщинЧислом).

Метод 3. Работа с вычисляемыми полями

Вычисляемые поля — это мощный инструмент СКД, который позволяет производить расчеты над данными уже после выполнения запроса. Если нам нужно сложить две колонки, которые уже являются ресурсами, мы можем создать новое вычисляемое поле.

Рассмотрим алгоритм создания итоговой колонки через вычисляемые поля:

  1. Перейдем на закладку «Вычисляемые поля».
  2. Добавим новое поле с именем ВсегоКатегорийИУчеников.
  3. В поле «Выражение» мы можем оставить пустоту или написать логику для детальных записей. Однако основная магия происходит на закладке «Ресурсы».
  4. На закладке «Ресурсы» добавим наше новое поле ВсегоКатегорийИУчеников.
  5. В качестве выражения укажем сумму агрегатов: ЕСТЬNULL(Количество(Категория), 0) + ЕСТЬNULL(Количество(Ученики), 0).

Важный нюанс: Использование функции ЕСТЬNULL() крайне рекомендуется. В 1С (и в SQL в целом) при сложении числа с NULL результат всегда будет NULL. Если у вас 10 учеников, но 0 сотрудников в категории (значение NULL), то без ЕСТЬNULL итоговая сумма превратится в пустоту.

Особенности функции «Рассчитывать по...»

В настройках ресурсов есть колонка «Рассчитывать по...». Если вы оставите это поле пустым, ресурс будет рассчитываться для всех группировок и для общих итогов. Если же вам нужно, чтобы итоговая сумма выводилась только в определенных разрезах (например, только по подразделениям, но не по конкретным сотрудникам), укажите нужные группировки в этом поле.

Для простых отчетов, где нужно просто сложить колонки в строке и получить общий итог внизу, это поле обычно оставляют незаполненным.

Типичные ошибки при суммировании в СКД

Разберем ситуации, которые могут привести к неверным данным:

Практический пример итоговой настройки

Представим, что мы имеем запрос из сообщения 12. Нам нужно сложить Категория и Ученики. Выясним причину, почему простое сложение может не работать — это разные типы объектов. Настроим систему следующим образом:

На закладке «Ресурсы» прописываем:

  1. Поле: Категория | Выражение: Количество(Категория)
  2. Поле: Ученики | Выражение: Количество(Ученики)
  3. Поле: ИтогоКоличество | Выражение: Количество(Категория) + Количество(Ученики)

Если поле ИтогоКоличество не создано в запросе, просто впишите его название вручную в колонку «Поле» на закладке ресурсов, и СКД предложит создать его как вычисляемое. Это быстрый способ получить нужный результат без лишних манипуляций в конфигураторе.

Таким образом, комбинируя возможности запроса и механизмы ресурсов СКД, мы можем гибко управлять расчетом итогов даже для тех данных, которые изначально не являются числами. Помните о проверке на NULL и всегда анализируйте, не приводят ли соединения таблиц к дублированию записей, чтобы ваши итоги всегда оставались точными.

← На главную