Как добавить в отчет по валовой прибыли УТ 11 цену из прайс-листа на дату продажи

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

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

Анализируем структуру данных: где хранятся цены

Прежде чем приступать к редактированию отчета, нам необходимо определиться с источником данных. В «1С:Управление торговлей 11» цены номенклатуры хранятся в регистрах сведений. Важно учитывать версию вашей конфигурации:

  1. УТ 11.4 и ниже: Используется регистр сведений ЦеныНоменклатуры.
  2. УТ 11.5 и выше: Внедрена новая архитектура ценообразования (версия 2.5), и данные хранятся в регистре ЦеныНоменклатуры25.

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

Способ 1: Использование связи наборов данных в СКД (рекомендуемый)

Проанализируем наиболее правильный подход. Мы не будем переписывать основной запрос отчета, а добавим второй набор данных и свяжем их на уровне схемы компоновки. Это позволит серверу 1С эффективно получить цену для каждой строки отчета.

Шаг 1: Добавление нового набора данных

Откроем схему компоновки данных отчета (в расширении или копии типового отчета). Добавим новый НаборДанных-запрос. Назовем его, например, НаборДанныхЦены.

Текст запроса для этого набора будет выглядеть следующим образом (для версии 11.5):


ВЫБРАТЬ
    ЦеныНоменклатуры25СрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры25СрезПоследних.Характеристика КАК Характеристика,
    ЦеныНоменклатуры25СрезПоследних.Цена КАК ЦенаИзПрайса,
    ЦеныНоменклатуры25СрезПоследних.Упаковка КАК УпаковкаЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(&ПериодЦен, ВидЦены = &ВидЦеныДляСравнения) КАК ЦеныНоменклатуры25СрезПоследних

Шаг 2: Настройка связей наборов данных

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

Важный нюанс: Установка связи по периоду позволяет СКД для каждой строки продажи выполнять виртуальную таблицу СрезПоследних именно на дату этой продажи. Это решает проблему «цены на момент продажи».

Способ 2: Левое соединение в одном запросе (через временные таблицы)

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

Посмотрим на примерную логику работы:

  1. Сначала мы выбираем все продажи во временную таблицу ВТ_Продажи.
  2. Затем мы выбираем только уникальные пары Номенклатура + Дата из ВТ_Продажи во вторую временную таблицу ВТ_УникальныеПары.
  3. Получаем цены из регистра для этих уникальных пар, используя соединение с физической таблицей регистра и условием на максимальную дату (срез последних вручную).
  4. Соединяем полученные цены обратно с ВТ_Продажи.

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


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДатыЦен.Номенклатура,
    ДатыЦен.Период,
    ЦеныРегистр.Цена
ИЗ
    ВТ_МаксимальныеДатыЦен КАК ДатыЦен
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныРегистр
        ПО ДатыЦен.Номенклатура = ЦеныРегистр.Номенклатура
        И ДатыЦен.ПериодЦены = ЦеныРегистр.Период
        И ЦеныРегистр.ВидЦены = &НужныйВидЦены

Проблема упаковок и коэффициентов

Выясним причину, по которой цифры в отчете могут «поплыть». В справочнике цена может быть установлена за штуку (базовая единица), а в документе «Реализация товаров и услуг» продажа может быть зафиксирована в коробках.

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

ЦенаВОтчете = ЦенаИзРегистра * (КоэффициентУпаковкиДокумента / КоэффициентУпаковкиЦены)

Для этого в СКД в вычисляемых полях или прямо в запросе необходимо получить коэффициенты упаковок из справочника УпаковкиЕдиницыИзмерения. Если упаковки не используются, коэффициент всегда равен 1.

Учет валютных курсов

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

В этом случае нам потребуется:

  1. Подтянуть в отчет курс валюты цены на дату продажи.
  2. Подтянуть курс валюты документа (если они отличаются).
  3. Пересчитать цену из прайса в валюту документа через РегистрСведений.КурсыВалют.

Рекомендации по производительности

Выполнение «Среза последних» для каждой строки — операция ресурсоемкая. Чтобы отчет работал быстрее, воспользуйтесь следующими советами:

Использование расширений для модификации

Поскольку ВаловаяПрибыль — это сложный типовой отчет, крайне не рекомендуется вносить изменения напрямую в конфигурацию. Лучше создать расширение, добавить в него отчет и изменить его схему компоновки данных. Это позволит вам беспрепятственно обновлять «1С:Управление торговлей» в будущем, сохраняя при этом ваши доработки.

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

← На главную