Как в СКД 1С разделить общее количество звонков на эффективные и запланированные?

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

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

Постановка задачи и анализ проблемы

Рассмотрим ситуацию: у нас есть регистр сведений ДанныеОЗвонках. В нем фиксируется работа менеджера. Для каждой записи существуют такие поля, как Контрагент, ПодписанДоговор (Булево) и ДатаПереноса (Дата). Нам необходимо вывести отчет за неделю, в котором будут колонки:

  1. Общее количество звонков.
  2. Количество запланированных звонков (где заполнена дата переноса).
  3. Количество эффективных звонков (где установлен признак «Подписан договор»).
  4. Количество звонков, запланированных на следующий период (дата переноса больше конца текущей недели).

Основная ошибка заключается в том, что если просто добавить поле Контрагент в ресурсы с функцией Количество(), система посчитает все строки без учета условий. Проанализируем, как решить эту задачу правильно.

Решение 1: Использование выражений в ресурсах СКД

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

Рассмотрим подробнее формулы для каждого показателя:

  1. Общее количество звонков: Здесь мы оставляем стандартное Количество(Контрагент) или Количество(Период).
  2. Эффективные звонки: Нам нужно суммировать только те строки, где флаг подписания договора равен «Истина». Сумма(Выбор Когда ПодписанДоговор Тогда 1 Иначе 0 Конец)
  3. Запланированные звонки: Условием является наличие заполненной даты в поле ДатаПереноса. Сумма(Выбор Когда ЗначениеЗаполнено(ДатаПереноса) Тогда 1 Иначе 0 Конец)
  4. На следующий период: Нам нужно сравнить дату переноса с параметром окончания текущего периода. Сумма(Выбор Когда ДатаПереноса > &КонецПериода Тогда 1 Иначе 0 Конец)

Решение 2: Подготовка данных в тексте запроса

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


ВЫБРАТЬ
    КОЛИЧЕСТВО(*) КАК ОбщееКоличествоЗвонков,
    СУММА(ВЫБОР
            КОГДА ДанныеОЗвонках.ПодписанДоговор = ИСТИНА
                ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ) КАК КоличествоЭффективныхЗвонков,
    СУММА(ВЫБОР
            КОГДА ДанныеОЗвонках.ДатаПереноса <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ) КАК КоличествоЗапланированныхЗвонков,
    СУММА(ВЫБОР
            КОГДА ДанныеОЗвонках.ДатаПереноса > &КонецПериода
                ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ) КАК КоличествоЗапланированныхЗвонковНаСледующийПериод
ИЗ
    РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
ГДЕ
    ДанныеОЗвонках.Период МЕЖДУ &НачалоПериода И &КонецПериода

Важный нюанс: Обратите внимание на условие ГДЕ. Если мы ограничиваем выборку текущей неделей, то в отчет попадут только те звонки, которые были совершены на этой неделе. Если звонок был совершен раньше, но перенесен на следующую неделю, он не попадет в выборку, если период в ГДЕ его не захватывает. В нашей задаче мы анализируем работу менеджера за текущий период, поэтому фильтр по полю Период корректен.

Решение 3: Вычисляемые поля как альтернатива

Разберем еще один изящный способ реализации — через вкладку «Вычисляемые поля» в СКД. Это позволяет не загромождать запрос сложными конструкциями и при этом не писать громоздкие формулы в ресурсах.

Посмотрим, как это настроить:

  1. Переходим на вкладку Вычисляемые поля.
  2. Добавляем поле с именем ЭтоЭффективныйЗвонок. В выражении пишем: ВЫБОР КОГДА ПодписанДоговор ТОГДА 1 ИНАЧЕ 0 КОНЕЦ.
  3. Добавляем поле ЭтоЗапланированныйЗвонок. Выражение: ВЫБОР КОГДА ДатаПереноса > ДАТАВРЕМЯ(1,1,1) ТОГДА 1 ИНАЧЕ 0 КОНЕЦ.
  4. Теперь на вкладке Ресурсы нам достаточно просто применить функцию Сумма() к этим новым полям.

Тонкости работы с датами и пустыми значениями

Проанализируем ситуацию с «пустыми» датами. В языке запросов 1С пустая дата — это ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). В выражениях СКД (в ресурсах или вычисляемых полях) лучше использовать функцию ЗначениеЗаполнено(). Она универсальна и корректно обрабатывает не только даты, но и ссылочные типы.

Если вы сравниваете дату переноса с параметром &КонецПериода, убедитесь, что параметр имеет тип Дата (со временем 23:59:59), иначе звонки, запланированные на последний день периода, могут быть посчитаны как «на следующий период» из-за разницы в секундах.

Дополнительные возможности оформления

Чтобы отчет был не только информативным, но и удобным, рекомендуем использовать Условное оформление. Например, можно выделить красным цветом записи, где количество запланированных звонков на следующий период равно нулю, или зеленым цветом — менеджеров с высокой долей эффективных звонков.

Для расчета эффективности (конверсии) в процентах, можно добавить еще один ресурс с выражением:

Выбор Когда Сумма(ОбщееКоличество) = 0 Тогда 0 Иначе Сумма(КоличествоЭффективных) / Сумма(ОбщееКоличество) * 100 Конец

Такой подход позволит сразу видеть КПД сотрудников в итоговой таблице.

Заключение

Мы рассмотрели три способа реализации условных показателей в СКД. Использование Сумма(Выбор...) в ресурсах является наиболее гибким методом, так как он позволяет легко манипулировать данными без изменения структуры запроса. Помните о правильной обработке пустых дат и использовании параметров периода для получения точных результатов.

← На главную