Как получить сумму продаж по конкретной карте лояльности в 1С:УТ 11 и КА 2

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

В современных конфигурациях 1С, таких как «Управление торговлей 11» или «Комплексная автоматизация 2», разработчики часто сталкиваются с задачей получения суммы накоплений по конкретной карте лояльности. Ситуация осложняется тем, что в типовой архитектуре не существует отдельного регистра накопления, где в качестве измерения выступала бы КартаЛояльности с ресурсом суммы продаж. Давайте подробно разберем, как устроена эта система, и как правильно составить запрос для получения нужных данных. Для этой задачи можно использовать готовый отчет по продажам в разрезе карт лояльности.

Архитектурная особенность учета карт лояльности

Для начала проанализируем, почему стандартный поиск регистра накопления по картам не дает результатов. В 1С:УТ 11 и КА 2 учет выручки ведется в регистре ВыручкаИСебестоимостьПродаж. Основными аналитическими разрезами здесь являются АналитикаУчетаПоПартнерам (где хранятся Партнер, Контрагент и Организация) и АналитикаУчетаНоменклатуры.

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

Разбор механизма накопления скидок

Рассмотрим, как система рассчитывает скидку при выполнении условия «За накопленный объем продаж по карте». Поскольку прямого регистра нет, программные механизмы 1С выполняют динамический анализ истории продаж. Они обращаются к регистру ВыручкаИСебестоимостьПродаж, но при этом соединяются с документами-основаниями, такими как РеализацияТоваровУслуг или ЧекККМ, чтобы проверить наличие заполненного реквизита КартаЛояльности в шапке этих документов.

Вариант 1: Построение запроса через соединение с регистратором

Самый точный способ получить сумму продаж по конкретной карте — это обратиться к регистру выручки и «вытащить» карту из документа, который сделал движение. Разберем этот алгоритм на примере написания запроса. Нам необходимо связать обороты регистра с реквизитами документов-регистраторов.

Посмотрим на пример запроса, который учитывает специфику как оптовых, так и розничных продаж:


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

Проанализируем этот код. Здесь мы используем обращение через точку от поля Регистратор. Важно понимать, что в регистр выручки пишут разные документы. Основные из них — это РеализацияТоваровУслуг и ОтчетОРозничныхПродажах. У обоих этих документов есть реквизит КартаЛояльности.

Особенности розничных продаж (Чеки ККМ)

Выясним важный нюанс: как учитываются продажи через рабочее место кассира (РМК). Пока смена не закрыта, продажи фиксируются документами ЧекККМ. После закрытия смены они сворачиваются в ОтчетОРозничныхПродажах (ОРП).

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

Проблема фильтрации «СуммаВыручки > 0»

Рассмотрим распространенную ошибку при написании таких отчетов. Многие программисты добавляют условие ГДЕ Выручка.СуммаВыручки > 0, чтобы отсечь «пустые» записи. Однако это действие приводит к искажению данных о накоплениях.

Почему это важно: Возвраты товаров в 1С отражаются в регистре выручки либо отрицательными числами, либо сторнирующими записями. Если мы отфильтруем только положительные суммы, то накопленный объем продаж по карте будет завышен, так как возвращенные товары не уменьшат общую сумму. Для корректного расчета скидок и накоплений всегда нужно использовать агрегатную функцию СУММА без фильтрации по знаку суммы.

Вариант 2: Использование бонусных программ как «технического» регистра

Если ваша компания не планирует использовать сложную систему баллов, но вам жизненно необходим быстрый отчет по накоплениям в разрезе карт, мы можем применить небольшую хитрость. Разберем использование функционала бонусных программ в техническом режиме.

  1. Создадим бонусную программу лояльности.
  2. Настроим правило начисления: 1 балл за 1 рубль покупки.
  3. В этом случае система начнет автоматически заполнять регистр накопления БонусныеБаллы.

Этот регистр уже имеет измерение КартаЛояльности. В результате нам не придется делать тяжелые соединения с документами-регистраторами, и мы сможем получить остаток накоплений простым запросом к виртуальной таблице Остатки регистра бонусных баллов. Это значительно повысит производительность системы при большом объеме данных.

Резюме и практические советы

Подведем итог нашему исследованию. Чтобы получить корректную сумму продаж по карте лояльности, придерживайтесь следующих правил:

Рассмотренные методы позволяют гибко настроить отчетность и обеспечить прозрачность работы системы лояльности в вашей организации.

← На главную