При разработке отчетов в системе компоновки данных (СКД) начинающие специалисты часто сталкиваются с ситуацией, когда стандартная агрегатная функция Количество() во вкладке «Ресурсы» выдает общую сумму записей для всех колонок. В этой статье мы подробно разберем, как на основе одного регистра сведений получить детализированную статистику: общее количество звонков, количество эффективных сделок и планы на будущие периоды.
Рассмотрим ситуацию: у нас есть регистр сведений ДанныеОЗвонках. В нем фиксируется работа менеджера. Для каждой записи существуют такие поля, как Контрагент, ПодписанДоговор (Булево) и ДатаПереноса (Дата). Нам необходимо вывести отчет за неделю, в котором будут колонки:
Основная ошибка заключается в том, что если просто добавить поле Контрагент в ресурсы с функцией Количество(), система посчитает все строки без учета условий. Проанализируем, как решить эту задачу правильно.
Это самый быстрый способ, не требующий серьезного изменения текста запроса. Вместо стандартного выбора поля в колонке «Выражение» на вкладке «Ресурсы», мы будем использовать агрегатную функцию Сумма() в сочетании с логическим оператором Выбор.
Рассмотрим подробнее формулы для каждого показателя:
Количество(Контрагент) или Количество(Период).
Сумма(Выбор Когда ПодписанДоговор Тогда 1 Иначе 0 Конец)
ДатаПереноса.
Сумма(Выбор Когда ЗначениеЗаполнено(ДатаПереноса) Тогда 1 Иначе 0 Конец)
Сумма(Выбор Когда ДатаПереноса > &КонецПериода Тогда 1 Иначе 0 Конец)
Выясним причину, по которой опытные разработчики часто предпочитают вычислять эти данные прямо в запросе. Это позволяет сделать схему компоновки данных более «чистой», а ресурсы — простыми для суммирования. Проанализируем пример запроса, который сразу возвращает готовые цифры.
ВЫБРАТЬ
КОЛИЧЕСТВО(*) КАК ОбщееКоличествоЗвонков,
СУММА(ВЫБОР
КОГДА ДанныеОЗвонках.ПодписанДоговор = ИСТИНА
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК КоличествоЭффективныхЗвонков,
СУММА(ВЫБОР
КОГДА ДанныеОЗвонках.ДатаПереноса <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК КоличествоЗапланированныхЗвонков,
СУММА(ВЫБОР
КОГДА ДанныеОЗвонках.ДатаПереноса > &КонецПериода
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК КоличествоЗапланированныхЗвонковНаСледующийПериод
ИЗ
РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
ГДЕ
ДанныеОЗвонках.Период МЕЖДУ &НачалоПериода И &КонецПериода
Важный нюанс: Обратите внимание на условие ГДЕ. Если мы ограничиваем выборку текущей неделей, то в отчет попадут только те звонки, которые были совершены на этой неделе. Если звонок был совершен раньше, но перенесен на следующую неделю, он не попадет в выборку, если период в ГДЕ его не захватывает. В нашей задаче мы анализируем работу менеджера за текущий период, поэтому фильтр по полю Период корректен.
Разберем еще один изящный способ реализации — через вкладку «Вычисляемые поля» в СКД. Это позволяет не загромождать запрос сложными конструкциями и при этом не писать громоздкие формулы в ресурсах.
Посмотрим, как это настроить:
ЭтоЭффективныйЗвонок. В выражении пишем: ВЫБОР КОГДА ПодписанДоговор ТОГДА 1 ИНАЧЕ 0 КОНЕЦ.ЭтоЗапланированныйЗвонок. Выражение: ВЫБОР КОГДА ДатаПереноса > ДАТАВРЕМЯ(1,1,1) ТОГДА 1 ИНАЧЕ 0 КОНЕЦ.Сумма() к этим новым полям.Проанализируем ситуацию с «пустыми» датами. В языке запросов 1С пустая дата — это ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). В выражениях СКД (в ресурсах или вычисляемых полях) лучше использовать функцию ЗначениеЗаполнено(). Она универсальна и корректно обрабатывает не только даты, но и ссылочные типы.
Если вы сравниваете дату переноса с параметром &КонецПериода, убедитесь, что параметр имеет тип Дата (со временем 23:59:59), иначе звонки, запланированные на последний день периода, могут быть посчитаны как «на следующий период» из-за разницы в секундах.
Чтобы отчет был не только информативным, но и удобным, рекомендуем использовать Условное оформление. Например, можно выделить красным цветом записи, где количество запланированных звонков на следующий период равно нулю, или зеленым цветом — менеджеров с высокой долей эффективных звонков.
Для расчета эффективности (конверсии) в процентах, можно добавить еще один ресурс с выражением:
Выбор Когда Сумма(ОбщееКоличество) = 0 Тогда 0 Иначе Сумма(КоличествоЭффективных) / Сумма(ОбщееКоличество) * 100 Конец
Такой подход позволит сразу видеть КПД сотрудников в итоговой таблице.
Мы рассмотрели три способа реализации условных показателей в СКД. Использование Сумма(Выбор...) в ресурсах является наиболее гибким методом, так как он позволяет легко манипулировать данными без изменения структуры запроса. Помните о правильной обработке пустых дат и использовании параметров периода для получения точных результатов.