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

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

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

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

Архитектурная причина проблемы

Проанализируем структуру регистра накопления. В платформе 1С измерения предназначены для формирования разрезов учета (аналитики), а ресурсы — для накопления числовых показателей. Когда непрерывная или изменяемая числовая величина (например, площадь конкретного изделия) выносится в измерение:

  1. Таблица итогов регистра начинает стремительно разрастаться, так как для каждого уникального числа создается новая комбинация ключа уникальности.
  2. Виртуальная таблица Остатки перестает корректно агрегировать данные для типового анализа движений, так как на остатке остаются висеть строки прихода с конкретным числовым значением измерения.

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

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

Способ 1. Использование физической таблицы регистра с отбором по виду движения

Если в регистре накопления нет ресурсов, по которым можно было бы задействовать виртуальные таблицы, или если для отчета требуется детальная информация (документ-регистратор, номер строки, точный момент времени движения), оптимальным решением является обращение к физической (основной) таблице регистра.

Разберем по шагам построение такого запроса:

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

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


ВЫБРАТЬ
    Потолки.Период КАК Период,
    Потолки.Регистратор КАК Регистратор,
    Потолки.Площадь КАК Площадь
ИЗ
    РегистрНакопления.Потолки КАК Потолки
ГДЕ
    Потолки.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    {ГДЕ
    (Потолки.Период >= &НачалоПериода),
    (Потолки.Период <= &КонецПериода)}

Важный момент: при использовании физической таблицы обращение к системному перечислению выполняется конструкцией ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход), что исключает необходимость передачи дополнительных параметров через код на встроенном языке.

Способ 2. Использование виртуальной таблицы «Обороты»

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

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

Рассмотрим структуру запроса:


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

Выясним преимущества данного подхода:

  1. Платформа использует таблицу итогов оборотов, что существенно ускоряет выборку данных на больших объемах информации по сравнению с чтением физической таблицы.
  2. Исключаются дубли строк по одинаковым значениям измерения Площадь за счет группировки в виртуальной таблице.
  3. Использование расширения языка запросов в фигурных скобках {&НачалоПериода} позволяет СКД оптимально передавать границы периода непосредственно в параметры виртуальной таблицы.

Способ 3. Анализ закрытия приходов через таблицу «ОстаткиИОбороты»

Иногда задача формулируется сложнее: необходимо не просто вывести строки расхода, а сопоставить расход с приходом и скрыть те строки, по которым еще не было списания (то есть исключить «чистые» остатки прихода).

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

Посмотрим на пример запроса для такой выборки:


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

Разберем логику работы этого условия: фильтр КоличествоРасход <> 0 исключает все записи, где за выбранный интервал времени списания не производились, оставляя только те элементы измерения Площадь, по которым зафиксировано реальное движение расхода.

Рекомендации по настройке СКД

Для корректного отображения данных в отчете обратите внимание на следующие параметры схемы компоновки:

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