При разработке дополнительных отчетов и обработок по расчету премий менеджеров и контрагентов часто возникает необходимость отфильтровать продажи. Например, если товар был продан, а затем возвращен или помечен как брак, такие позиции не должны участвовать в расчете бонусов. Рассмотрим, как правильно скорректировать запрос к регистру накопления Продажи в конфигурации «Управление торговлей», редакция 10.3.
В исходном отчете расчет выполняется путем обращения к виртуальной таблице РегистрНакопления.Продажи.Обороты. Однако стандартный регистр накопления Продажи хранит аналитику по номенклатуре, контрагентам и договорам, но не содержит сведений о пользовательских метках, таких как «06- Возврат товара» или «07- Уикенд, Брак, Пересорт».
Проанализируем варианты решения задачи в зависимости от того, где именно хранятся метки и как оформляется возврат товара:
ВозвратТоваровОтПокупателя, таблица оборотов регистра Продажи по умолчанию уменьшает сумму оборота за период.Регистратор.РеализацияТоваровУслуг или в регистре ПродажиПоДисконтнымКартам), необходимо выполнить левое соединение с соответствующей таблицей.Разберем по шагам, как изменить запрос, если метка или тип документа определяются на уровне регистратора. В виртуальной таблице оборотов укажем периодичность Регистратор, чтобы получить доступ к документам продажи и возврата:
|ВЫБРАТЬ
| Сотрудники.Сотрудник КАК Сотрудник,
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.СтоимостьОборот КАК Стоимость
|ПОМЕСТИТЬ Продажи
|ИЗ
| РегистрНакопления.Продажи.Обороты(&Нач, &Кон, Регистратор, ) КАК ПродажиОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сотрудники КАК Сотрудники
| ПО ПродажиОбороты.Контрагент = Сотрудники.Сотрудник
|ГДЕ
| ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&Элит, &Кофе)
| И НЕ ПродажиОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
|;
Использование проверки НЕ Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя позволяет исключить из выборки записи, сформированные документами возврата.
Если пользователь выбирает метку непосредственно в документе продажи, обратимся к реквизиту документа через конструкцию ВЫРАЗИТЬ. Посмотрим на пример добавления условия в запрос:
|ВЫБРАТЬ
| Сотрудники.Сотрудник КАК Сотрудник,
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.СтоимостьОборот КАК Стоимость
|ПОМЕСТИТЬ Продажи
|ИЗ
| РегистрНакопления.Продажи.Обороты(&Нач, &Кон, Регистратор, ) КАК ПродажиОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сотрудники КАК Сотрудники
| ПО ПродажиОбороты.Контрагент = Сотрудники.Сотрудник
|ГДЕ
| ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&Элит, &Кофе)
| И НЕ ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг).Метка В (&ИсключаемыеМетки)
|;
В данном случае в параметры запроса передается массив или список значений ИсключаемыеМетки, содержащий ссылки на метки типа «Возврат товара» и «Брак».
Выясним, как поступить, если данные о метках и дисконтных картах фиксируются в отдельном регистре накопления ПродажиПоДисконтнымКартам. Для этого свяжем таблицу оборотов продаж с регистром дисконтных карт по документу-регистратору и номенклатуре:
|ВЫБРАТЬ
| ПродажиОбороты.Контрагент КАК Сотрудник,
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.СтоимостьОборот КАК Стоимость
|ПОМЕСТИТЬ Продажи
|ИЗ
| РегистрНакопления.Продажи.Обороты(&Нач, &Кон, Запись, ) КАК ПродажиОбороты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиПоДисконтнымКартам КАК ДисконтныеКарты
| ПО ПродажиОбороты.Регистратор = ДисконтныеКарты.Регистратор
| И ПродажиОбороты.Номенклатура = ДисконтныеКарты.Номенклатура
|ГДЕ
| ПродажиОбороты.Контрагент В (&Сотрудники)
| И ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&Элит, &Кофе)
| И НЕ ДисконтныеКарты.ДисконтнаяКарта.Метка В (&МассивМеток)
|;
При реализации отборов обратим внимание на следующие технические нюансы:
Регистратор или Запись в виртуальной таблице оборотов отключает применение предрассчитанных агрегатов регистра. Чтобы запрос не замедлял работу базы, обязательно задавайте жесткие границы периода &Нач и &Кон.ПОДОБНО "фильтр%" внутри выражений ВЫБОР КОГДА создают высокую нагрузку на СУБД. В перспективе рекомендуется классифицировать товары с помощью категорий или групп справочника Номенклатура.Запрос.Выполнить() не забудьте передать сформированный массив исключаемых меток:
Запрос.УстановитьПараметр("ИсключаемыеМетки", МассивМеток);