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