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