При разработке аналитических отчетов в системе компоновки данных (СКД) часто возникает задача классификации объектов. Например, нам нужно разбить клиентскую базу на категории (A, B, C, D) и показать, какую долю в количественном выражении занимает каждая группа. Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с тем, что данные в консоли запросов и в итоговом отчете СКД не совпадают. Разберем по шагам, как правильно настроить такой отчет, посчитать уникальных клиентов и вывести их процентное соотношение.
Рассмотрим ситуацию: у нас есть временная таблица ВТ_ГОТОВО, в которой уже распределены контрагенты по категориям. Типичная ошибка на первом этапе — использование конструкции Сумма(1) в тексте запроса. Посмотрим на пример кода, который может приводить к некорректным итогам:
ВЫБРАТЬ
Сумма(1) как Количество,
ВТ_ГОТОВО.КатегорияABCD КАК Категория
ИЗ
ВТ_ГОТОВО КАК ВТ_ГОТОВО
СГРУППИРОВАТЬ ПО
ВТ_ГОТОВО.КатегорияABCD
Проанализируем, почему такой подход может подвести. Если в настройках СКД вы добавите группировку по категории, а в ресурсы выберете поле Количество с функцией Сумма, система может выдать неожиданный результат, если записи в исходной таблице дублируются или если компоновщик перенастроит запрос под свои нужды. Выясним причину: СКД — это не просто средство вывода запроса, это мощный движок, который сам управляет группировками.
Для получения точных данных, особенно если один и тот же партнер теоретически может упоминаться в таблице несколько раз (например, при соединении с продажами), необходимо использовать подсчет различных ссылок. Проанализируем правильный вариант запроса:
ВЫБРАТЬ
ВТ_ГОТОВО.Контрагент КАК Партнер,
ВТ_ГОТОВО.КатегорияABCD КАК Категория
ИЗ
ВТ_ГОТОВО КАК ВТ_ГОТОВО
В самом запросе мы можем даже не выполнять агрегацию, оставив это на откуп системе компоновки. Рассмотрим, как настроить это на вкладке Ресурсы в схеме СКД. Это самый гибкий метод:
Партнер.Количество(Различные Партнер).Теперь, как бы мы ни группировали отчет, СКД всегда будет считать только уникальных клиентов в каждой категории. Это решение помогло автору темы в сообщении 18, где он заменил простую сумму на КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагент).
После того как мы получили количество клиентов в каждой группе, перейдем к расчету их доли (процента) от общего числа. Рассмотрим три способа решения этой задачи.
В современных версиях платформы 1С СКД поддерживает специальные функции для работы с процентами прямо в окне ресурсов. Для вывода доли группы от общего итога выполним следующие действия:
Партнер).ПроцентВОбщемИтоге(Количество(Различные Партнер)).ПроцентОтОбщего.Это самый быстрый способ, не требующий написания сложных формул. Система сама определит знаменатель (общее количество по отчету) и разделит на него значение текущей строки.
Если нам нужен более сложный расчет (например, процент не от общего итога, а от вышестоящей группы), воспользуемся функцией ВычислитьВыражение. Разберем пример формулы для ресурса:
Количество(Различные Партнер) * 100 / ВычислитьВыражение("Количество(Различные Партнер)", "ОбщийИтог")
Здесь параметр "ОбщийИтог" принудительно заставляет СКД взять значение знаменателя из итоговой строки всего отчета. Это гарантирует, что сумма процентов по всем категориям (A, B, C, D) всегда будет равна 100%.
Чтобы отчет выглядел профессионально, число 0.15 должно превратиться в 15%. Посмотрим, как настроить форматирование без изменения кода запроса:
ЧЦ=5; ЧДЦ=2; ЧС=0 (это обеспечит 2 знака после запятой). %, либо настроить это через условное оформление.Часто бизнес-заказчик хочет видеть в отчете все категории, даже если в группе B на данный момент нет ни одного клиента. Если мы просто выберем данные из ВТ_ГОТОВО, категория с нулевым количеством просто исчезнет из отчета. Разберем, как этого избежать.
Создадим внутри запроса статическую таблицу всех возможных категорий и соединим ее с нашими данными:
// Сначала создаем список всех категорий
ВЫБРАТЬ "A" КАК Категория ОБЪЕДИНИТЬ ВЫБРАТЬ "B" ОБЪЕДИНИТЬ ВЫБРАТЬ "C" ОБЪЕДИНИТЬ ВЫБРАТЬ "D"
ПОМЕСТИТЬ ВТ_ВсеКатегории;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ВсеКатегории.Категория,
ЕСТЬNULL(Данные.Партнер, "Нет клиентов") КАК Партнер
ИЗ
ВТ_ВсеКатегории КАК ВТ_ВсеКатегории
ЛЕВОЕ СОЕДИНЕНИЕ
ВТ_ГОТОВО КАК Данные ПО ВТ_ВсеКатегории.Категория = Данные.КатегорияABCD
При такой структуре запроса в отчет попадут все буквы алфавита ABC-анализа. В ресурсах СКД при использовании Количество(Различные Партнер) для пустых категорий автоматически отобразится 0, что позволит корректно рассчитать процент (0%).
Таким образом, комбинируя правильный подсчет уникальных ссылок в ресурсах и функции расчета по общим итогам, мы получаем гибкий и точный инструмент для анализа клиентской базы.