В практике автоматизации торговых предприятий часто возникает задача учета продажи не просто отдельных товаров, а целых маркетинговых наборов (комплектов). Сложность заключается в том, что в документах Реализация товаров и услуг эти товары указываются отдельными строками, а менеджеру требуется посчитать именно количество проданных полных «наборов» для начисления премий. Рассмотрим подробно, как решить эту задачу с помощью механизмов платформы «1С:Предприятие 8.3».
Представим ситуацию: директор объявляет акцию, в которой набором считается одновременная продажа трех видов гелей для душа в определенном количестве (например, 3 шт. «Морской свежести», 2 шт. «Малины» и 2 шт. «Ванили»). Все эти позиции должны присутствовать в одном документе реализации. Если клиент купил больше товара, мы должны посчитать только количество полных наборов.
Для решения мы применим алгоритм «минимальной кратности». Разберем его суть на примере: если в документе числится 6 ед. первого товара (нужно 3), 2 ед. второго (нужно 2) и 4 ед. третьего (нужно 2), то мы делим факт на норму:
Минимальное из этих чисел — 1. Значит, продан ровно один полный набор. Если бы какой-то позиции из состава акции в документе не оказалось вовсе, количество наборов обнулилось бы.
Проанализируем структуру справочников. По условию, менеджеры являются родителями (группами) в справочнике Контрагенты. Это не самая стандартная архитектура, но она встречается в самописных конфигурациях. В запросе нам нужно будет обращаться к полю Контрагент.Родитель, чтобы сгруппировать продажи по ответственным лицам.
Также важно определиться, где хранить состав набора. Рассмотрим рекомендации экспертов: лучше всего создать отдельный справочник Наборы или Акции с табличной частью Состав. Однако, если отчет должен формироваться динамически на основании выбора руководителя в форме, мы будем передавать состав набора в запрос как внешний параметр (таблицу значений).
Прежде чем сравнивать продажи с набором, проанализируем ситуацию с дублями строк. В одной реализации товар может быть разбит на несколько строк (например, из-за разных партий или скидок). Поэтому первым делом в запросе мы должны «свернуть» данные по документу и номенклатуре.
Рассмотрим пример временной таблицы, которая собирает продажи, фильтруя их по периоду и вхождению в акционный список:
ВЫБРАТЬ
Продажи.Ссылка КАК Документ,
Продажи.Номенклатура КАК Товар,
СУММА(Продажи.Количество) КАК ФактическоеКоличество
ПОМЕСТИТЬ ВТ_ПродажиПоДокументам
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Продажи
ГДЕ
Продажи.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
СГРУППИРОВАТЬ ПО
Продажи.Ссылка,
Продажи.Номенклатура
Теперь выясним, как сопоставить фактические продажи с требованиями акции. Нам понадобится ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Это позволит сразу отсечь документы, в которых нет ни одного товара из акции. Для расчета количества наборов мы будем использовать функцию ВЫРАЗИТЬ для получения целого числа.
Важный нюанс: В языке запросов 1С функция ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0)) округляет значения по арифметическим правилам. Чтобы получить количество именно полных наборов (округление вниз), мы вычтем 0.5 перед округлением. Например, 1.9 превратится в 1.4, что при округлении даст 1.
Проанализируем фрагмент запроса:
ВЫБРАТЬ
Продажи.Документ,
Продажи.Документ.Контрагент.Родитель КАК Менеджер,
ВЫРАЗИТЬ(Продажи.ФактическоеКоличество / Состав.КоличествоВНаборе - 0.5 КАК ЧИСЛО(15, 0)) КАК КратностьТовара,
1 КАК ВхождениеПозиции
ИЗ
ВТ_ПродажиПоДокументам КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СоставНабора КАК Состав
ПО Продажи.Товар = Состав.Товар
Выясним, как понять, что в документе присутствуют все позиции набора. Для этого мы сравним количество уникальных акционных товаров в документе с общим количеством позиций в заданном наборе. Если эти числа совпадают, значит, набор укомплектован.
Рассмотрим итоговый запрос, который вычисляет лидера по продажам среди менеджеров:
ВЫБРАТЬ
Итоги.Менеджер,
СУММА(Итоги.КоличествоПолныхНаборов) КАК ВсегоНаборов
ИЗ (
ВЫБРАТЬ
Вложенный.Менеджер,
Вложенный.Документ,
ВЫБОР
КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Вложенный.Товар) = &ОбщееКоличествоПозицийВНаборе
ТОГДА МИНИМУМ(Вложенный.КратностьТовара)
ИНАЧЕ 0
КОНЕЦ КАК КоличествоПолныхНаборов
ИЗ
(
// Здесь наш запрос из Шага 3
) КАК Вложенный
СГРУППИРОВАТЬ ПО
Вложенный.Менеджер,
Вложенный.Документ
) КАК Итоги
СГРУППИРОВАТЬ ПО
Итоги.Менеджер
УПОРЯДОЧИТЬ ПО
ВсегоНаборов УБЫВ
Если мы строим отчет с использованием Системы компоновки данных (СКД), процесс значительно упрощается. Мы можем использовать вычисляемые поля или ресурсы. Например, ресурс Минимум(Кратность), рассчитанный в разрезе группировки по документу, автоматически покажет количество наборов.
Рассмотрим преимущества использования СКД для данной задачи:
ВнешниеНаборыДанных.Посмотрим на ситуацию с точки зрения производительности. Если база данных большая, запрос к табличной части документа РеализацияТоваровУслуг.Товары будет работать медленно. Профессиональным подходом считается использование Регистра накопления (например, «Продажи» или «ВыручкаИСебестоимостьПродаж»).
Обращение к виртуальной таблице Обороты регистра работает в разы быстрее, так как данные в ней уже предварительно агрегированы. Кроме того, в регистре обычно уже есть все необходимые измерения: Номенклатура, Контрагент, Склад и т.д.
Резюмируем: для корректного расчета наборов в запросе необходимо:
Этот алгоритм гарантирует точность данных и позволяет автоматизировать систему мотивации персонала даже в самых сложных маркетинговых акциях.