Оборотный регистр накопления в 1С: виртуальные таблицы и агрегаты
Содержание
Частая путаница новичка-разработчика: взять оборотный регистр и попытаться вытащить из него остаток на дату. Не выйдет — вид регистра накопления «Обороты» физически не хранит итоговый остаток, он копит только приход и расход за период.
Если вам нужны именно движения за интервал — продажи за месяц, списанные материалы, начисленная выручка — то оборотный регистр в 1С 8.3 и есть правильный инструмент. Ниже разберём, как он устроен внутри, чем отличается от остаточного, как его создать и как корректно получить обороты запросом через виртуальные таблицы.
Что такое регистр накопления и зачем отдельный вид «Обороты»
Регистр накопления — это прикладной объект конфигурации, который суммирует числовые данные в разрезе измерений. Проще говоря, таблица, куда документы «складывают» числа, а платформа умеет их быстро агрегировать.
У регистра накопления два вида:
- 📈 Остатки — считает остаток на любой момент (сколько товара на складе, сколько денег на счёте). Движения бывают
ПриходиРасход. - 🔄 Обороты — копит только суммарный оборот за период (сколько продали, сколько начислили). Движения только одного типа —
Приходфактически не делится, у записи нет направления.
Вид задаётся один раз, в свойстве регистра, и потом менять его на боевой базе больно: структура таблиц в СУБД разная.
Правило выбора простое. Нужен ответ на вопрос «сколько ОСТАЛОСЬ» — берите Остатки. Нужен ответ «сколько ПРОШЛО за период» — берите Обороты.
ОстаткиИОбороты отдаёт и то, и другое. Отдельный оборотный регистр не нужен.Чем оборотные регистры накопления отличаются от остаточных
Разница не только в логике, но и в том, что платформа создаёт в базе данных. Остаточный регистр тянет за собой таблицу итогов и обходится дороже при записи.
| Признак | Остатки | Обороты |
|---|---|---|
| Тип движения | Приход / Расход | Без деления (только «плюс») |
| Что хранит | Остаток на дату + обороты | Только обороты за период |
| Таблицы в СУБД | Движения + Итоги | Движения (+ агрегаты опц.) |
| Виртуальные таблицы | Остатки, Обороты, ОстаткиИОбороты | Обороты |
| Скорость записи | Ниже (пересчёт итогов) | Выше |
| Типовой пример | «ТоварыНаСкладах», «Взаиморасчёты» | «Продажи», «Выручка» |
Ключевой вывод: оборотный регистр дешевле при проведении документов, потому что не пересчитывает итоги остатков. На высоконагруженных участках (много продаж в секунду) это заметно.
Когда оборотный регистр НЕ нужен
- Если из этого же показателя вам когда-нибудь понадобится остаток — сразу берите Остатки, из них обороты тоже доступны.
- Если данные и так лежат в остаточном регистре рядом — не плодите второй регистр ради «удобной» таблицы оборотов.
Структура оборотного регистра: измерения, ресурсы, реквизиты
Состав полей одинаков у обоих видов, отличается смысл.
- Измерения — разрезы, по которым группируются числа:
Номенклатура,Организация,Склад,Контрагент. По ним потом строится группировка в виртуальной таблице. - Ресурсы — собственно числа, которые суммируются:
Количество,Сумма,Выручка. Это то, что копится. - Реквизиты — дополнительная информация записи, которая НЕ суммируется и не участвует в группировке итогов (например,
Комментарий,ДокументОснование).
Частая ошибка проектирования — засунуть в измерения то, что должно быть реквизитом. Лишнее измерение раздувает таблицу итогов/агрегатов и замедляет запись. В измерения — только то, по чему реально фильтруете и группируете.
Связь с регистратором и уникальность записей
Регистр накопления почти всегда подчинён регистратору — документу, который делает движения. У записи есть служебные поля:
Регистратор— ссылка на документ-источник движения.НомерСтроки— порядковый номер строки внутри набора записей одного регистратора.Период— момент времени, к которому отнесён оборот.Активность— флаг: неактивные записи в итоги/обороты не попадают.
Уникальность записи в наборе определяется парой Регистратор + НомерСтроки. Поэтому нельзя записать две строки одного документа с одинаковым номером — платформа не даст.
Записывают движения обычно в модуле проведения документа:
Движения.Продажи.Записывать = Истина;
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Организация = Организация;
Движение.Количество = ТекСтрока.Количество;
Движение.Выручка = ТекСтрока.Сумма;
Флаг Записывать = Истина обязателен — без него набор в базу не уйдёт.
Как создать и настроить оборотный регистр накопления в 1С
Порядок в конфигураторе (или в режиме EDT):
- В дереве конфигурации → ветка Регистры накопления → добавить новый.
- На вкладке «Основные» задать имя, например
Продажи. - Свойство Вид регистра переключить с
ОстаткинаОбороты. Это делается один раз и до ввода данных. - На вкладке «Данные» добавить измерения (
Номенклатура,Организация), ресурсы (Количество,Выручка) и при необходимости реквизиты. - На вкладке «Регистраторы» отметить документы, которые будут писать движения.
- Через Конструктор движений в модуле документа быстро сгенерировать код заполнения набора записей.
Конструктор движений — это помощник, который по галочкам сопоставляет табличную часть документа с измерениями и ресурсами регистра и пишет готовый цикл. Экономит время и снижает шанс опечатки.
Виртуальные таблицы: как получить обороты запросом
Напрямую к таблице движений в запросах почти не обращаются. Работают с виртуальными таблицами — платформа сама агрегирует данные и отдаёт результат.
У вида «Обороты» доступна ровно одна виртуальная таблица — Обороты. У вида «Остатки» их три: Остатки, Обороты, ОстаткиИОбороты.
Базовый запрос оборотов за период:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот,
ПродажиОбороты.ВыручкаОборот
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
,
Организация = &Организация) КАК ПродажиОбороты
Что тут важно:
- К имени ресурса в виртуальной таблице оборотов добавляется суффикс Оборот:
Количество→КоличествоОборот. - Первые два параметра — начало и конец периода. Границы включаются.
- Третий параметр (пропущен запятой) — периодичность (для оборотов по под-периодам: День, Месяц, Квартал).
- Четвёртый — условие на измерения (отбор). Ставьте его в параметр таблицы, а не в
ГДЕ— так платформа отфильтрует данные ДО агрегации и запрос будет быстрее.
Обороты с периодичностью удобны для отчётов «по месяцам»: укажите третий параметр Периодичность = Месяц, и в результате появится поле Период с разбивкой.
Обороты из остаточного регистра
Если регистр остаточный, обороты берутся из его таблицы Обороты или ОстаткиИОбороты. Во второй у ресурсов появляются суффиксы НачальныйОстаток, Приход, Расход, Оборот, КонечныйОстаток — всё в одной строке.
Что происходит в СУБД при записи
Понимание физики помогает не удивляться тормозам.
- Для оборотного регистра платформа держит основную таблицу движений. Если включён режим агрегатов или итогов — плюс служебные таблицы.
- Для остаточного — таблица движений плюс таблица итогов, которая пересчитывается при каждой записи. Это и есть основная цена остаточного регистра.
Отсюда практический вывод: если показатель нужен только «за период», оборотный регистр снимет с базы лишнюю нагрузку на итоги.
Агрегаты и режим итогов: ускоряем обороты
На больших объёмах даже оборотный регистр начинает медленно отдавать данные за длинные интервалы. Два механизма ускорения:
- Итоги оборотов — предрассчитанные суммы по периодам. Можно включать/отключать. При отключённых итогах обороты считаются «на лету» по таблице движений — медленнее, но запись легче.
- Агрегаты — доступны только оборотным регистрам. Это дополнительные предагрегированные срезы по выбранным измерениям и периодичности. Платформа сама выбирает подходящий агрегат при выполнении запроса.
Агрегаты настраивают отдельно (состав измерений, периодичность, использование) и периодически пересчитывают/оптимизируют регламентным заданием. Смысл — обменять место в базе и время на обновление агрегатов на быстрые отчёты.
Агрегаты — не бесплатны. Каждый агрегат надо обновлять, он занимает место и замедляет запись. Включайте их точечно, под конкретные тяжёлые отчёты, а не «на всякий случай».
Типичные ошибки при работе с оборотным регистром
- ❌ Пытаться получить остаток из оборотного регистра. Его там нет — только оборот.
- ❌ Забыть суффикс
Обороту ресурса в запросе (ВыручкавместоВыручкаОборот) — поле не найдётся. - ❌ Ставить отбор в
ГДЕвместо параметра виртуальной таблицы — фильтрация после агрегации, лишняя работа СУБД. - ❌ Менять вид регистра на рабочей базе с данными — структура таблиц другая, ждите проблем с реструктуризацией.
- ❌ Лишние измерения «про запас» — раздувают агрегаты и тормозят проведение.
- ❌ Не выставить
Движения.Регистр.Записывать = Истина— движения не пишутся, а ошибки нет.
Частые вопросы
Можно ли из оборотного регистра получить остаток?
Чем отличается КоличествоОборот от Количество?
Количество — имя ресурса в самом регистре. В виртуальной таблице оборотов к нему добавляется суффикс Оборот, поэтому в запросе поле называется КоличествоОборот — это сумма за период.Что быстрее пишется — оборотный или остаточный регистр?
Зачем нужны агрегаты и когда их включать?
Можно ли поменять вид регистра с «Остатки» на «Обороты» на рабочей базе?
Как получить обороты с разбивкой по месяцам?
Обороты — периодичность Месяц. В результат добавится поле Период с помесячной разбивкой оборота.