Разработка и Конфигурация · 9 мин
Как получить обороты по регистру накопления в 1С
Как получить обороты по регистру накопления в 1С: запрос с виртуальной таблицей Обороты, СКД, отчёт и программный код. Параметры, отборы, типичные ошибки.
Обороты по регистру накопления — это суммарные изменения ресурсов (приход и расход) за выбранный период в разрезе измерений. Получить их можно тремя основными способами: запросом к виртуальной таблице «Обороты», через СКД в отчёте и программно через построитель запроса или объектную модель. Выбор зависит от задачи: разовая проверка данных, пользовательский отчёт или расчёт внутри алгоритма проведения.
Ключевой момент, который часто упускают, — обороты нельзя получить обращением к физической таблице движений напрямую без группировки. Платформа 1С предоставляет для этого виртуальную таблицу РегистрНакопления.ИмяРегистра.Обороты, которая сама агрегирует данные по заданным параметрам: периоду, отбору и разрезам.
Что такое виртуальная таблица «Обороты» и когда её использовать
Виртуальная таблица «Обороты» не хранится в базе как отдельный объект — платформа вычисляет её на лету, суммируя движения по заданным условиям. Результат содержит измерения регистра, а также поля вида ИмяРесурсаПриход, ИмяРесурсаРасход и ИмяРесурсаОборот (разница прихода и расхода).
Таблица подходит, когда нужны именно суммы изменений за период, а не остатки на дату. Если требуется узнать, сколько товара поступило и сколько ушло за месяц — это обороты. Если нужно, сколько товара есть на складе сейчас — используйте виртуальную таблицу «Остатки» (для регистра остатков) или «ОстаткиИОбороты», когда нужны оба показателя.
Важно понимать вид регистра: для регистра остатков обороты — это суммарные приходы и расходы, для регистра оборотов — просто сумма движений, разделения на приход/расход там нет, только поле ИмяРесурсаОборот.
Как получить обороты запросом к виртуальной таблице
Базовый запрос к виртуальной таблице выглядит так: указываются параметры в скобках после имени таблицы, затем выбираются измерения и ресурсы. Параметры задаются по позиции: начало периода, конец периода, периодичность, отбор.
ВЫБРАТЬ
Обороты.Номенклатура,
Обороты.КоличествоПриход,
Обороты.КоличествоРасход,
Обороты.КоличествоОборот
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(
&НачалоПериода,
&КонецПериода,
Месяц,
Склад = &Склад) КАК Обороты
Параметры запроса передаются стандартно через Запрос.УстановитьПараметр(). Обратите внимание: конец периода виртуальная таблица трактует как границу «по», поэтому для включения всего последнего дня лучше передавать конец дня или начало следующего периода с учётом поведения итогов.
Четвёртый параметр — отбор — записывается как условие без слова «ГДЕ», например Номенклатура В (&СписокНоменклатуры). Отбор в параметрах таблицы эффективнее отбора в секции ГДЕ, потому что платформа применяет его до агрегации и читает меньше данных.
- 1Определите вид регистра (остатки или обороты) и нужные измерения
- 2Создайте объект Запрос и напишите текст с обращением к виртуальной таблице Обороты
- 3Передайте параметры: НачалоПериода, КонецПериода, периодичность, отбор
- 4Выполните запрос и обойдите выборку или выгрузите в таблицу значений
- 5Проверьте результат на контрольном примере с известными движениями
Параметры виртуальной таблицы: периодичность и отбор
Периодичность определяет, будет ли результат разбит по временным интервалам. Значение Период (или пусто) даёт одну строку на комбинацию измерений за весь период. Значения День, Месяц, Квартал, Год добавляют в результат поле Период и разбивают обороты по интервалам.
Отбор в параметрах таблицы поддерживает сравнение, В, В ИЕРАРХИИ и подобные операторы, но работает только по полям, доступным виртуальной таблице: измерениям, реквизитам (для оборотов по регистратору — нет). Попытка отобрать по ресурсу в параметрах вызовет ошибку — условия на ресурсы пишутся в секции ГДЕ или ИМЕЮЩИЕ.
| Параметр | Назначение | Пример |
|---|---|---|
| НачалоПериода | Левая граница интервала | &НачалоПериода |
| КонецПериода | Правая граница интервала | &КонецПериода |
| Периодичность | Разбивка по интервалам | Месяц, День, Период, Регистратор |
| Отбор | Условие до агрегации | Склад = &Склад |
Отдельного внимания заслуживает периодичность Регистратор: она возвращает обороты в разрезе документов, создавших движения. Это полезно для анализа, какие документы сформировали оборот, но на больших базах такой запрос заметно тяжелее.
Как получить обороты в отчёте на СКД
Для пользовательских отчётов оптимален путь через систему компоновки данных. В схеме компоновки создаётся набор данных «Запрос» с обращением к виртуальной таблице «Обороты», а период и отборы выносятся в параметры СКД, которые пользователь задаёт в форме отчёта.
Типовой приём — использовать стандартный период: в запросе параметры &НачалоПериода и &КонецПериода, в настройках СКД — параметр «Период» типа СтандартныйПериод, значения которого подставляются в запрос. Тогда пользователь выбирает период привычным календарём.
Если отчёт строится только для просмотра, дополнительного кода не нужно: СКД сама сгруппирует данные по выбранным пользователем полям. Программная доработка требуется лишь для вычисляемых полей, нестандартных итогов или расшифровки.
Программное получение оборотов без запроса
В редких сценариях обороты получают через менеджер регистра и выборку движений с последующей суммировкой, но это почти всегда медленнее запроса к виртуальной таблице. Объектная модель оправдана, только когда нужно обойти движения конкретного документа — там работает набор записей РегистрыНакопления.Имя.СоздатьНаборЗаписей() с отбором по регистратору.
Для разовой проверки в режиме «1С:Предприятие» удобна консоль запросов (в типовых конфигурациях — инструменты разработчика или внешняя консоль): пишете запрос к виртуальной таблице, задаёте параметры и сразу видите результат без создания отчёта.
Способы получения оборотов
Универсальный и быстрый способ; подходит для кода, отчётов и консоли. Требует понимания параметров таблицы.
Лучший вариант для пользователей: отборы и период задаются в форме. Избыточен для разовой проверки.
Подходит только для движений одного документа. Для оборотов за период медленный и не рекомендуется.
Проверка результата и типичные ошибки
Контрольный приём — сверить рассчитанные обороты с типовым отчётом по тому же регистру (например, с ведомостью по товарам) за тот же период и с теми же отборами. Совпадение сумм означает, что параметры переданы верно.
Частая ошибка — неверная граница конца периода: если передать начало последнего дня, движения этого дня не попадут в выборку. Передавайте конец дня через КонецДня(Период) или используйте объект Граница с видом «Включая».
Вторая типичная проблема — отключённые итоги. Если итоги по регистру срезаны на более позднюю дату, чем запрашиваемый период, запрос к виртуальной таблице может выполняться крайне медленно. Проверьте в режиме управления итогами, что период рассчитанных итогов покрывает нужные даты.
Как проверить результат
Совпадают с типовым отчётом за тот же период
Расхождения — проверьте границы периода и отборы
Запрос выполняется за секунды на типовом объёме
Минуты ожидания — проверьте рассчитанные итоги и отбор в параметрах
Для регистра остатков есть Приход и Расход
Ошибка «поле не найдено» — проверьте вид регистра
FAQ
Чем отличаются обороты от остатков по регистру накопления?
Обороты показывают, сколько ресурса изменилось за период (пришло и ушло), а остатки — сколько ресурса числится на конкретный момент времени. Для остатков используется виртуальная таблица «Остатки», для обоих показателей сразу — «ОстаткиИОбороты».
Почему в моём регистре нет полей Приход и Расход?
Эти поля есть только у регистров накопления с видом «Остатки». У регистров с видом «Обороты» доступно единственное поле вида «ИмяРесурсаОборот», потому что движения там не имеют направления.
Как получить обороты с разбивкой по месяцам?
Передайте третьим параметром виртуальной таблицы значение «Месяц» — в результате появится поле Период, и каждая комбинация измерений будет разбита по месяцам. Аналогично работают значения День, Квартал и Год.
Можно ли отобрать обороты по конкретному документу?
Да, укажите периодичность «Регистратор» — в результате появится поле Регистратор, по которому можно поставить отбор. Альтернатива для одного документа — прочитать его набор движений объектной моделью.
Запрос к виртуальной таблице выполняется очень долго. Что делать?
Проверьте три вещи: рассчитаны ли итоги на нужный период, вынесены ли отборы в параметры таблицы, а не в ГДЕ, и не запрашиваете ли вы периодичность «Регистратор» на большом интервале. Обычно устранения этих причин достаточно.
Как получить обороты в разрезе реквизита измерения, например по артикулу номенклатуры?
Соедините виртуальную таблицу со справочником по полю измерения и выберите нужный реквизит, либо используйте разыменование через точку: Обороты.Номенклатура.Артикул. Первый вариант с явным соединением предсказуемее по производительности.