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

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

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

Решение через виртуальную таблицу ОстаткиИОбороты и конструкцию ИТОГИ ПО ПЕРИОДАМИ

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


ВЫБРАТЬ
    ВРК.Контрагент КАК Контрагент,
    ВРК.СуммаУпрКонечныйОстаток КАК СуммаУпрКонечныйОстаток,
    ВРК.Период КАК Период
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , Контрагент = &Контрагент) КАК ВРК
ИТОГИ
    СУММА(СуммаУпрКонечныйОстаток)
ПО
    Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон),
    Контрагент

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

  1. Параметры виртуальной таблицы: третьим параметром передается периодичность — в примере указано День. Это указывает платформе формировать промежуточные итоги по каждому дню, в котором были движения.
  2. Конструкция ИТОГИ ПО Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон): дополняет выборку периодами, в которых не было фактических движений по регистру. Это позволяет сформировать непрерывную временную шкалу от начальной до конечной границы интервала с сохранением актуального конечного остатка.

Разбор ошибки «Поле не найдено» и нюансов Конструктора запросов

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

  1. Не указана периодичность в параметрах виртуальной таблицы: если третий параметр таблицы ОстаткиИОбороты оставлен пустым, таблица рассчитывает только сводный итог за весь интервал отчета, и поля периодов в структуре полей просто отсутствуют.
  2. Именование полей периодов: в зависимости от указанной периодичности поля могут иметь разные имена. Например, при значении периодичности Авто формируются поля ПериодСекунда, ПериодМинута, ПериодЧас, ПериодДень, ПериодНеделя, ПериодДекада, ПериодМесяц, ПериодКвартал, ПериодПолугодие, ПериодГод, Регистратор и НомерСтроки. В таком случае обращение к универсальному имени Период вызовет ошибку.

Чтобы избежать ошибки, при редактировании запроса в Конструкторе сначала перейдите на вкладку «Таблицы и поля», откройте параметры виртуальной таблицы и явно укажите периодичность (например, День или Авто), после чего выберите соответствующее поле периода в список полей выборки.

Особенности обхода результата запроса

Обратите внимание на поведение платформы при работе с конструкцией ПЕРИОДАМИ:

  1. Дополнение пропущенных дат работает только на уровне группировок при иерархическом обходе выборки через Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам...).
  2. Если выполнить прямую выгрузку результата запроса в плоскую таблицу через Запрос.Выполнить().Выгрузить() или производить линейный обход детальных записей, строки за даты без движений дополнены не будут.

Альтернативное решение в Системе компоновки данных (СКД)

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

  1. В наборе данных-запросе для виртуальной таблицы ОстаткиИОбороты укажите периодичность Авто и метод дополнения ДвиженияИГраницыПериода.
  2. На вкладке «Настройки» в структуре отчета добавьте группировку по полю периода (например, ПериодДень).
  3. В свойствах группировки включите «Тип дополнения» — День, указав параметры начала и окончания периода. СКД автоматически сгенерирует непрерывный календарный ряд с корректными остатками и оборотами.
← На главную