Как в 1С реализовать отчет по продаже наборов товаров с помощью запроса

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

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

Постановка задачи и логика решения

Представим ситуацию: директор объявляет акцию, в которой набором считается одновременная продажа трех видов гелей для душа в определенном количестве (например, 3 шт. «Морской свежести», 2 шт. «Малины» и 2 шт. «Ванили»). Все эти позиции должны присутствовать в одном документе реализации. Если клиент купил больше товара, мы должны посчитать только количество полных наборов.

Для решения мы применим алгоритм «минимальной кратности». Разберем его суть на примере: если в документе числится 6 ед. первого товара (нужно 3), 2 ед. второго (нужно 2) и 4 ед. третьего (нужно 2), то мы делим факт на норму:

  1. 6 / 3 = 2 набора;
  2. 2 / 2 = 1 набор;
  3. 4 / 2 = 2 набора.

Минимальное из этих чисел — 1. Значит, продан ровно один полный набор. Если бы какой-то позиции из состава акции в документе не оказалось вовсе, количество наборов обнулилось бы.

Шаг 1. Подготовка структуры данных

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

Также важно определиться, где хранить состав набора. Рассмотрим рекомендации экспертов: лучше всего создать отдельный справочник Наборы или Акции с табличной частью Состав. Однако, если отчет должен формироваться динамически на основании выбора руководителя в форме, мы будем передавать состав набора в запрос как внешний параметр (таблицу значений).

Шаг 2. Группировка данных документа

Прежде чем сравнивать продажи с набором, проанализируем ситуацию с дублями строк. В одной реализации товар может быть разбит на несколько строк (например, из-за разных партий или скидок). Поэтому первым делом в запросе мы должны «свернуть» данные по документу и номенклатуре.

Рассмотрим пример временной таблицы, которая собирает продажи, фильтруя их по периоду и вхождению в акционный список:


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

Шаг 3. Соединение с составом набора и расчет кратности

Теперь выясним, как сопоставить фактические продажи с требованиями акции. Нам понадобится ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Это позволит сразу отсечь документы, в которых нет ни одного товара из акции. Для расчета количества наборов мы будем использовать функцию ВЫРАЗИТЬ для получения целого числа.

Важный нюанс: В языке запросов 1С функция ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0)) округляет значения по арифметическим правилам. Чтобы получить количество именно полных наборов (округление вниз), мы вычтем 0.5 перед округлением. Например, 1.9 превратится в 1.4, что при округлении даст 1.

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


ВЫБРАТЬ
    Продажи.Документ,
    Продажи.Документ.Контрагент.Родитель КАК Менеджер,
    ВЫРАЗИТЬ(Продажи.ФактическоеКоличество / Состав.КоличествоВНаборе - 0.5 КАК ЧИСЛО(15, 0)) КАК КратностьТовара,
    1 КАК ВхождениеПозиции
ИЗ
    ВТ_ПродажиПоДокументам КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СоставНабора КАК Состав
    ПО Продажи.Товар = Состав.Товар

Шаг 4. Финальный расчет полных наборов

Выясним, как понять, что в документе присутствуют все позиции набора. Для этого мы сравним количество уникальных акционных товаров в документе с общим количеством позиций в заданном наборе. Если эти числа совпадают, значит, набор укомплектован.

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


ВЫБРАТЬ
    Итоги.Менеджер,
    СУММА(Итоги.КоличествоПолныхНаборов) КАК ВсегоНаборов
ИЗ (
    ВЫБРАТЬ
        Вложенный.Менеджер,
        Вложенный.Документ,
        ВЫБОР
            КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Вложенный.Товар) = &ОбщееКоличествоПозицийВНаборе
                ТОГДА МИНИМУМ(Вложенный.КратностьТовара)
            ИНАЧЕ 0
        КОНЕЦ КАК КоличествоПолныхНаборов
    ИЗ
        (
            // Здесь наш запрос из Шага 3
        ) КАК Вложенный
    СГРУППИРОВАТЬ ПО
        Вложенный.Менеджер,
        Вложенный.Документ
) КАК Итоги
СГРУППИРОВАТЬ ПО
    Итоги.Менеджер
УПОРЯДОЧИТЬ ПО
    ВсегоНаборов УБЫВ

Особенности реализации в СКД

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

Рассмотрим преимущества использования СКД для данной задачи:

Рекомендации по оптимизации

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

Обращение к виртуальной таблице Обороты регистра работает в разы быстрее, так как данные в ней уже предварительно агрегированы. Кроме того, в регистре обычно уже есть все необходимые измерения: Номенклатура, Контрагент, Склад и т.д.

Резюмируем: для корректного расчета наборов в запросе необходимо:

  1. Сгруппировать продажи по документам и товарам.
  2. Соединить их с эталонным составом набора.
  3. Рассчитать целую часть отношения «Факт / Норма».
  4. Убедиться, что количество найденных видов номенклатуры соответствует количеству в наборе.
  5. Взять минимальное значение кратности среди всех строк документа, относящихся к набору.

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

← На главную