Как реализовать отчет по продажам за два периода в 1С:Розница 3.0 на СКД

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

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

Метод 1. Использование «ВЫБОР» в вычисляемых полях или ресурсах

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

Проанализируем алгоритм действий:

  1. В схеме компоновки данных создадим четыре параметра: &НачалоПериода1, &КонецПериода1, &НачалоПериода2 и &КонецПериода2.
  2. В основном запросе к виртуальной таблице Продажи.Обороты установим период, охватывающий оба интервала (от минимальной даты до максимальной).
  3. На вкладке «Вычисляемые поля» или непосредственно в ресурсах добавим новые поля для первого и второго периодов.

Пример выражения для ресурса «Сумма за период 1»:


СУММА(ВЫБОР 
    КОГДА Период МЕЖДУ &НачалоПериода1 И &КонецПериода1 
    ТОГДА СуммаОборот 
    ИНАЧЕ 0 
КОНЕЦ)

Аналогично создадим ресурс для второго периода:


СУММА(ВЫБОР 
    КОГДА Период МЕЖДУ &НачалоПериода2 И &КонецПериода2 
    ТОГДА СуммаОборот 
    ИНАЧЕ 0 
КОНЕЦ)

Рассмотрим преимущество этого метода: СУБД выполняет один запрос к данным, что существенно экономит ресурсы сервера при работе с большими объемами информации.

Метод 2. Объединение запросов (UNION ALL) в одном наборе данных

Если запрос в стандартном отчете «Розница 3.0» слишком сложный и содержит много вложенных таблиц, проще всего использовать механизм объединения. Мы создаем два идентичных блока запроса, но с разными параметрами дат.

Разберем структуру такого запроса:


ВЫБРАТЬ
    "Период 1" КАК НомерПериода,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода1, &КонецПериода1, , ) КАК ПродажиОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Период 2",
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода2, &КонецПериода2, , ) КАК ПродажиОбороты

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

Метод 3. Использование связи двух наборов данных

Иногда требуется соединить данные из разных источников. В этом случае создаются два набора данных — типа «Запрос». Посмотрим на типичную ошибку, с которой сталкиваются разработчики при копировании запросов: данные за второй период дублируют данные первого.

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

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

Метод 4. Механизм «Период сравнения» в платформе 8.3

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

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

Однако в «Розница 3.0» отчеты часто строятся динамически через общие модули. Рассмотрим, как правильно доработать такой отчет:

  1. Выгрузите стандартную схему компоновки данных из конфигуратора во внешний файл .xml.
  2. Создайте новый внешний отчет и загрузите эту схему.
  3. Примените метод UNION ALL, так как он наиболее устойчив к изменениям в структуре метаданных программы.

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

Таким образом, мы разобрали основные способы реализации двупериодного отчета. Выбор метода зависит от сложности исходного запроса: для простых выборок идеально подходит ВЫБОР, для сложных иерархических отчетов — ОБЪЕДИНИТЬ ВСЕ, а для интеграции с типовыми механизмами — настройка периодов сравнения в параметрах компоновки.

← На главную