Как в отчете 1С на СКД сгруппировать данные и подсчитать количество и суммы документов

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

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

Разберем два основных способа решения этой задачи: стандартными средствами механизма ресурсов СКД и путем группировки данных непосредственно в тексте запроса, а также рассмотрим особенности добавления контактной информации (e-mail) без задвоения показателей.

Способ 1. Настройка агрегации через ресурсы и структуру СКД

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

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

  1. Настройка вкладки «Ресурсы»:

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

    Для поля СуммаДокумента укажем выражение: Сумма(СуммаДокумента).

    Для поля Ссылка (или Номер) укажем выражение подсчета количества: Количество(Различные Ссылка). При необходимости переименуем заголовок этого поля в настройках, задав понятное имя, например Количество неподписанных.

  2. Настройка структуры отчета:

    Перейдем на вкладку Настройки в раздел Структура. Если по умолчанию там добавлена группировка Детальные записи, удалим ее или заменим группировкой по полю Контрагент.

    Нажимаем правой кнопкой мыши на отчет, выбираем Добавить группировку и в поле группировки указываем Контрагент. Вложенных группировок внутри нее создавать не нужно.

  3. Выбор полей для отображения:

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

  4. Формирование плоского списка без иерархических отступов:

    Чтобы отчет формировался как обычная плоская таблица без лишних группировочных отступов и свернутых уровней, перейдем на вкладку Другие настройки:

    Установим параметр Расположение полей группировок в значение Отдельно и только в итогах или Вместе.

    Для поля Контрагент в свойствах группировки укажем тип Элементы вместо Иерархия, чтобы исключить отображение групп справочника.

Способ 2. Группировка данных непосредственно в тексте запроса

Если детализация до отдельных документов в отчете не требуется вовсе, а отчет предназначен исключительно для выгрузки или рассылки, целесообразно выполнить подсчет прямо в запросе на уровне СУБД. Это ускоряет работу отчета при больших объемах данных.

Проанализируем пример текста запроса:


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

Разберем ключевые особенности этого запроса:

  1. Использование конструкции КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Реализация.Ссылка) гарантирует корректный подсчет числа документов без повторений.
  2. Обязательное наложение условий Проведен = ИСТИНА и ПометкаУдаления = ЛОЖЬ предотвращает попадание в отчет удаленных и черновых документов.
  3. Секция СГРУППИРОВАТЬ ПО содержит все неагрегированные поля выборки.

Подключение E-mail контрагента без риска искажения итогов

Когда требуется дополнить свернутый отчет контактными данными (например, адресом электронной почты) для последующей отправки писем, необходимо учитывать особенности хранения контактной информации в типовых конфигурациях 1С.

Если просто соединить таблицу документов со справочником контрагентов и его контактной информацией левым соединением, наличие нескольких адресов e-mail у одного контрагента приведет к размножению строк документов и завышению сумм.

Посмотрим на пример безопасного соединения с предварительным отбором контактных данных:


ВЫБРАТЬ
    Реализация.Контрагент КАК Контрагент,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Реализация.Ссылка) КАК КоличествоНеподписанных,
    СУММА(Реализация.СуммаДокумента) КАК СуммаДокументов,
    ЕСТЬNULL(Контакты.АдресЭП, "") КАК Email
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    ЛЕВОЕ СОЕДИНЕНИЕ (
        ВЫБРАТЬ
            КИ.Объект КАК Объект,
            МАКСИМУМ(КИ.АдресЭП) КАК АдресЭП
        ИЗ
            РегистрСведений.КонтактнаяИнформация КАК КИ
        ГДЕ
            КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
            И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailКонтрагента)
        СГРУППИРОВАТЬ ПО
            КИ.Объект
    ) КАК Контакты ПО Контакты.Объект = Реализация.Контрагент
ГДЕ
    Реализация.Проведен = ИСТИНА
    И Реализация.ПометкаУдаления = ЛОЖЬ
    И Реализация.Подписан = ЛОЖЬ
СГРУППИРОВАТЬ ПО
    Реализация.Контрагент,
    ЕСТЬNULL(Контакты.АдресЭП, "")

Важные правила при работе с контактной информацией:

  1. Всегда явно указывайте тип контактной информации через ЗНАЧЕНИЕ(...), чтобы исключить получение телефонных номеров или фактических адресов.
  2. Используйте агрегатную функцию (например, МАКСИМУМ) во вложенной таблице, если у контрагента может быть зарегистрировано более одного e-mail одного вида. Это защитит отчет от дублирования строк.
  3. При использовании первого варианта (через ресурсы СКД) поле e-mail можно добавить непосредственно в список полей группировки Контрагент или вывести его через механизм реквизитов (Контрагент.ОсновнойEmail в зависимости от конфигурации).
← На главную