К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как получить обороты по регистру накопления в 1С

Как получить обороты по регистру накопления в 1С: запрос с виртуальной таблицей Обороты, СКД, отчёт и программный код. Параметры, отборы, типичные ошибки.

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

Ключевой момент, который часто упускают, — обороты нельзя получить обращением к физической таблице движений напрямую без группировки. Платформа 1С предоставляет для этого виртуальную таблицу РегистрНакопления.ИмяРегистра.Обороты, которая сама агрегирует данные по заданным параметрам: периоду, отбору и разрезам.

Что такое виртуальная таблица «Обороты» и когда её использовать

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

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

Важно понимать вид регистра: для регистра остатков обороты — это суммарные приходы и расходы, для регистра оборотов — просто сумма движений, разделения на приход/расход там нет, только поле ИмяРесурсаОборот.

Как получить обороты запросом к виртуальной таблице

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

ВЫБРАТЬ

Обороты.Номенклатура,

Обороты.КоличествоПриход,

Обороты.КоличествоРасход,

Обороты.КоличествоОборот

ИЗ

РегистрНакопления.ТоварыНаСкладах.Обороты(

&НачалоПериода,

&КонецПериода,

Месяц,

Склад = &Склад) КАК Обороты

Параметры запроса передаются стандартно через Запрос.УстановитьПараметр(). Обратите внимание: конец периода виртуальная таблица трактует как границу «по», поэтому для включения всего последнего дня лучше передавать конец дня или начало следующего периода с учётом поведения итогов.

Четвёртый параметр — отбор — записывается как условие без слова «ГДЕ», например Номенклатура В (&СписокНоменклатуры). Отбор в параметрах таблицы эффективнее отбора в секции ГДЕ, потому что платформа применяет его до агрегации и читает меньше данных.

Порядок получения оборотов запросом
  1. 1
    Определите вид регистра (остатки или обороты) и нужные измерения
  2. 2
    Создайте объект Запрос и напишите текст с обращением к виртуальной таблице Обороты
  3. 3
    Передайте параметры: НачалоПериода, КонецПериода, периодичность, отбор
  4. 4
    Выполните запрос и обойдите выборку или выгрузите в таблицу значений
  5. 5
    Проверьте результат на контрольном примере с известными движениями

Параметры виртуальной таблицы: периодичность и отбор

Периодичность определяет, будет ли результат разбит по временным интервалам. Значение Период (или пусто) даёт одну строку на комбинацию измерений за весь период. Значения День, Месяц, Квартал, Год добавляют в результат поле Период и разбивают обороты по интервалам.

Отбор в параметрах таблицы поддерживает сравнение, В, В ИЕРАРХИИ и подобные операторы, но работает только по полям, доступным виртуальной таблице: измерениям, реквизитам (для оборотов по регистратору — нет). Попытка отобрать по ресурсу в параметрах вызовет ошибку — условия на ресурсы пишутся в секции ГДЕ или ИМЕЮЩИЕ.

ПараметрНазначениеПример
НачалоПериодаЛевая граница интервала&НачалоПериода
КонецПериодаПравая граница интервала&КонецПериода
ПериодичностьРазбивка по интерваламМесяц, День, Период, Регистратор
ОтборУсловие до агрегацииСклад = &Склад

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

Как получить обороты в отчёте на СКД

Для пользовательских отчётов оптимален путь через систему компоновки данных. В схеме компоновки создаётся набор данных «Запрос» с обращением к виртуальной таблице «Обороты», а период и отборы выносятся в параметры СКД, которые пользователь задаёт в форме отчёта.

Типовой приём — использовать стандартный период: в запросе параметры &НачалоПериода и &КонецПериода, в настройках СКД — параметр «Период» типа СтандартныйПериод, значения которого подставляются в запрос. Тогда пользователь выбирает период привычным календарём.

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

Программное получение оборотов без запроса

В редких сценариях обороты получают через менеджер регистра и выборку движений с последующей суммировкой, но это почти всегда медленнее запроса к виртуальной таблице. Объектная модель оправдана, только когда нужно обойти движения конкретного документа — там работает набор записей РегистрыНакопления.Имя.СоздатьНаборЗаписей() с отбором по регистратору.

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

Способы получения оборотов

Запрос к виртуальной таблице

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

Отчёт на СКД

Лучший вариант для пользователей: отборы и период задаются в форме. Избыточен для разовой проверки.

Обход движений объектной моделью

Подходит только для движений одного документа. Для оборотов за период медленный и не рекомендуется.

Проверка результата и типичные ошибки

Контрольный приём — сверить рассчитанные обороты с типовым отчётом по тому же регистру (например, с ведомостью по товарам) за тот же период и с теми же отборами. Совпадение сумм означает, что параметры переданы верно.

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

Вторая типичная проблема — отключённые итоги. Если итоги по регистру срезаны на более позднюю дату, чем запрашиваемый период, запрос к виртуальной таблице может выполняться крайне медленно. Проверьте в режиме управления итогами, что период рассчитанных итогов покрывает нужные даты.

Типичные ошибки
01
Передача начала дня как конца периода — теряются движения последнего дня
02
Отбор в секции ГДЕ вместо параметра таблицы — запрос читает все движения и работает медленно
03
Ожидание полей Приход/Расход у регистра оборотов — там есть только поле Оборот, запрос падает с ошибкой
04
Запрос оборотов за период вне рассчитанных итогов — резкая деградация производительности
Контрольные точки

Как проверить результат

Суммы оборотов
Норма

Совпадают с типовым отчётом за тот же период

Тревожный признак

Расхождения — проверьте границы периода и отборы

Время выполнения запроса
Норма

Запрос выполняется за секунды на типовом объёме

Тревожный признак

Минуты ожидания — проверьте рассчитанные итоги и отбор в параметрах

Структура полей
Норма

Для регистра остатков есть Приход и Расход

Тревожный признак

Ошибка «поле не найдено» — проверьте вид регистра

FAQ

Чем отличаются обороты от остатков по регистру накопления?

Обороты показывают, сколько ресурса изменилось за период (пришло и ушло), а остатки — сколько ресурса числится на конкретный момент времени. Для остатков используется виртуальная таблица «Остатки», для обоих показателей сразу — «ОстаткиИОбороты».

Почему в моём регистре нет полей Приход и Расход?

Эти поля есть только у регистров накопления с видом «Остатки». У регистров с видом «Обороты» доступно единственное поле вида «ИмяРесурсаОборот», потому что движения там не имеют направления.

Как получить обороты с разбивкой по месяцам?

Передайте третьим параметром виртуальной таблицы значение «Месяц» — в результате появится поле Период, и каждая комбинация измерений будет разбита по месяцам. Аналогично работают значения День, Квартал и Год.

Можно ли отобрать обороты по конкретному документу?

Да, укажите периодичность «Регистратор» — в результате появится поле Регистратор, по которому можно поставить отбор. Альтернатива для одного документа — прочитать его набор движений объектной моделью.

Запрос к виртуальной таблице выполняется очень долго. Что делать?

Проверьте три вещи: рассчитаны ли итоги на нужный период, вынесены ли отборы в параметры таблицы, а не в ГДЕ, и не запрашиваете ли вы периодичность «Регистратор» на большом интервале. Обычно устранения этих причин достаточно.

Как получить обороты в разрезе реквизита измерения, например по артикулу номенклатуры?

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