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

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

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

Шаг 1. Организация выборки данных через временные таблицы

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

Сначала мы создаем пакетный запрос. В первом пакете выбираем номенклатуру, которая удовлетворяет условию наличия приходов в заданный период &НачалоПериодаПриход и &КонецПериодаПриход.


ВЫБРАТЬ
    ПартииНаСкладахОбороты.Номенклатура,
    ПартииНаСкладахОбороты.Партия
ПОМЕСТИТЬ ДанныеОПоступлении
ИЗ
    РегистрНакопления.ПартииНаСкладах.Обороты(&НачалоПериодаПриход, &КонецПериодаПриход) КАК ПартииНаСкладахОбороты
ГДЕ
    ПартииНаСкладахОбороты.КоличествоПриход <> 0
;

Этот простой шаг позволяет нам зафиксировать «интересующий список» товаров, что значительно упростит дальнейшие вычисления.

Шаг 2. Соединение данных и классификация партий

Далее нам необходимо вывести данные о продажах. Основная сложность заключается в том, что партии из начальных остатков могут не попадать в период поступлений. Мы решим эту задачу с помощью конструкции ВЫБОР КОГДА, которая позволит нам логически сгруппировать «старые» партии в одну категорию.


ВЫБРАТЬ
    ДанныеОПродажах.Номенклатура,
    ЕСТЬNULL(ДанныеОПоступлении.Партия, "Партия до периода поступления") КАК Партия,
    СУММА(ДанныеОПродажах.КоличествоРасход) КАК КоличествоРасход
ИЗ
    РегистрНакопления.ПартииНаСкладах.ОстаткиИОбороты(&НачалоПериодаПродажа, &КонецПериодаПродажа, , , 
        Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура ИЗ ДанныеОПоступлении)) КАК ДанныеОПродажах
        ЛЕВОЕ СОЕДИНЕНИЕ ДанныеОПоступлении КАК ДанныеОПоступлении
        ПО ДанныеОПродажах.Номенклатура = ДанныеОПоступлении.Номенклатура
        И ДанныеОПродажах.Партия = ДанныеОПоступлении.Партия

СГРУППИРОВАТЬ ПО
    ДанныеОПродажах.Номенклатура,
    ЕСТЬNULL(ДанныеОПоступлении.Партия, "Партия до периода поступления")

Обратите внимание на использование функции ЕСТЬNULL. Она позволяет нам переопределить значение измерения Партия. Если партия не найдена в нашей временной таблице (то есть она относится к «старым» остаткам), она получит строковое представление, что позволит СКД автоматически сгруппировать их в одну строку.

Шаг 3. Использование связей наборов данных в СКД

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

  1. Набор 1 (Фильтр): Запрос, возвращающий список Номенклатура, удовлетворяющий условиям прихода.
  2. Набор 2 (Данные): Запрос к виртуальной таблице ОстаткиИОбороты.

В настройках СКД перейдите на вкладку Связи наборов данных и создайте связь: Набор 2 -> Набор 1 по полю Номенклатура. Установите флаг Левая связь. Это действие заставит СКД отфильтровать основной запрос на основании данных первого набора.

Рекомендации по реализации

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

← На главную