Как в отчете СКД классифицировать клиентов на новых, первичных и повторных по количеству продаж?

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

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

  1. Нулевой клиент: совершил покупку в текущем году впервые за все время ведения базы (ранее продаж не было).
  2. Первичный клиент: совершил ровно одну покупку в текущем году, но уже покупал в прошлые годы.
  3. Повторный клиент: совершил более одной покупки в текущем году.

Методологические нюансы и подводные камни

Прежде чем приступать к написанию запроса, проанализируем особенности учета данных в типовых конфигурациях 1С, которые могут исказить итоговую статистику:

  1. Учет возвратов и сторно: если просто рассчитывать число покупок через функцию КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Регистратор), документы ВозвратТоваровОтКлиента или корректировки реализаций добавят лишние документы в выборку. Если клиент купил товар, а затем оформил возврат, без отбора по положительной сумме выручки он ошибочно будет признан покупателем.
  2. Контрагенты и партнеры: в современных конфигурациях (1С:Управление торговлей, 1С:ERP, 1С:Комплексная автоматизация) один фактический клиент (партнер) может работать через несколько юридических лиц (контрагентов). Если привязать расчет к контрагенту, смена реквизитов постоянного покупателя приведет к его ложной классификации как нового («нулевого»). В таких системах классификацию предпочтительнее вести в разрезе партнеров.
  3. Сводные документы в рознице: если продажи регистрируются документом ОтчетОРозничныхПродажах, документ-регистратор является общим для сотен покупателей. В розничной торговле корректный подсчет возможен только при наличии чеков ККМ или заказов с привязкой к карте лояльности.

Алгоритм расчета через запрос

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

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

Посмотрим на пример структуры запроса:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Статистика.Клиент КАК Клиент,
	Статистика.ПродажВТекущемГоду КАК ПродажВТекущемГоду,
	ВЫБОР
		КОГДА Статистика.ПродажВТекущемГоду > 1
			ТОГДА "Повторный"
		КОГДА Статистика.ПродажВТекущемГоду = 1 И НЕ Статистика.БылиПродажиВПрошлом
			ТОГДА "Нулевой"
		КОГДА Статистика.ПродажВТекущемГоду = 1 И Статистика.БылиПродажиВПрошлом
			ТОГДА "Первичный"
		ИНАЧЕ "Без покупок в текущем году"
	КОНЕЦ КАК КатегорияКлиента
ИЗ
	ВТ_СтатистикаКлиентов КАК Статистика

Оптимизация производительности в СКД

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

Чтобы избежать блокировок и ускорить выполнение отчета, применим разделение наборов данных в СКД:

  1. Набор данных 1 (Основной): формирует стандартный отчет по продажам за период, заданный пользователем в настройках отчета (получает клиента, номенклатуру, сумму и количество).
  2. Набор данных 2 (Классификация): вычисляет категорию клиента. Для проверки прошлых продаж лучше обращаться не к движениям регистра, а к периодической таблице оборотов за периоды до начала текущего года.
  3. Связи наборов данных: на вкладке «Связи наборов данных» связываем оба набора по полю Клиент. СКД автоматически ограничит выборку второго набора только теми клиентами, которые попали в основной результат отчета.

Настройка параметров СКД

Выясним, как настроить автоматическое определение границ текущего года без необходимости ручного ввода дат пользователем:

  1. На вкладке «Параметры» схемы компоновки данных добавим параметр НачалоТекущегоГода.
  2. В колонке «Выражение» укажем стандартную функцию языка выражений компоновки: НачалоПериода(ТекущаяДата(), "Год").
  3. Установим флаг «Ограничение доступности», чтобы пользователь не видел технический параметр в форме отчета.

Такой подход обеспечивает полностью автоматический расчет категорий контрагентов и корректно интегрируется в любой существующий отчет по продажам.

← На главную