Как исключить товары с метками брака и возврата при расчете бонусов в отчете 1С?

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

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

Анализ проблемы и структуры данных

В исходном отчете расчет выполняется путем обращения к виртуальной таблице РегистрНакопления.Продажи.Обороты. Однако стандартный регистр накопления Продажи хранит аналитику по номенклатуре, контрагентам и договорам, но не содержит сведений о пользовательских метках, таких как «06- Возврат товара» или «07- Уикенд, Брак, Пересорт».

Проанализируем варианты решения задачи в зависимости от того, где именно хранятся метки и как оформляется возврат товара:

  1. Учет чистых оборотов (Продажи минус Возвраты): Если возврат или брак оформляется стандартным документом ВозвратТоваровОтПокупателя, таблица оборотов регистра Продажи по умолчанию уменьшает сумму оборота за период.
  2. Фильтрация по документам-регистраторам: Если необходимо полностью исключить операции возврата или определенных реализаций, нужно детализировать виртуальную таблицу по периодичности Регистратор.
  3. Фильтрация по смежному регистру или реквизитам документа: Если метка фиксируется при оформлении накладной (например, в документе РеализацияТоваровУслуг или в регистре ПродажиПоДисконтнымКартам), необходимо выполнить левое соединение с соответствующей таблицей.

Способ 1. Фильтрация оборотов с использованием детализации по регистратору

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


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

Использование проверки НЕ Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя позволяет исключить из выборки записи, сформированные документами возврата.

Способ 2. Отбор по метке из документа реализации

Если пользователь выбирает метку непосредственно в документе продажи, обратимся к реквизиту документа через конструкцию ВЫРАЗИТЬ. Посмотрим на пример добавления условия в запрос:


|ВЫБРАТЬ
|	Сотрудники.Сотрудник КАК Сотрудник,
|	ПродажиОбороты.Номенклатура КАК Номенклатура,
|	ПродажиОбороты.СтоимостьОборот КАК Стоимость
|ПОМЕСТИТЬ Продажи
|ИЗ
|	РегистрНакопления.Продажи.Обороты(&Нач, &Кон, Регистратор, ) КАК ПродажиОбороты
|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сотрудники КАК Сотрудники
|	ПО ПродажиОбороты.Контрагент = Сотрудники.Сотрудник
|ГДЕ
|	ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&Элит, &Кофе)
|	И НЕ ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг).Метка В (&ИсключаемыеМетки)
|;

В данном случае в параметры запроса передается массив или список значений ИсключаемыеМетки, содержащий ссылки на метки типа «Возврат товара» и «Брак».

Способ 3. Соединение с регистром «ПродажиПоДисконтнымКартам»

Выясним, как поступить, если данные о метках и дисконтных картах фиксируются в отдельном регистре накопления ПродажиПоДисконтнымКартам. Для этого свяжем таблицу оборотов продаж с регистром дисконтных карт по документу-регистратору и номенклатуре:


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

Важные особенности и рекомендации по оптимизации

При реализации отборов обратим внимание на следующие технические нюансы:

  1. Производительность запроса: Использование периодичности Регистратор или Запись в виртуальной таблице оборотов отключает применение предрассчитанных агрегатов регистра. Чтобы запрос не замедлял работу базы, обязательно задавайте жесткие границы периода &Нач и &Кон.
  2. Оптимизация условия ПОДОБНО: Конструкции вида ПОДОБНО "фильтр%" внутри выражений ВЫБОР КОГДА создают высокую нагрузку на СУБД. В перспективе рекомендуется классифицировать товары с помощью категорий или групп справочника Номенклатура.
  3. Установка параметров: Перед вызовом метода Запрос.Выполнить() не забудьте передать сформированный массив исключаемых меток: Запрос.УстановитьПараметр("ИсключаемыеМетки", МассивМеток);
← На главную