Оборотный регистр накопления в 1С: виртуальные таблицы и агрегаты

· 8 мин

Содержание

Частая путаница новичка-разработчика: взять оборотный регистр и попытаться вытащить из него остаток на дату. Не выйдет — вид регистра накопления «Обороты» физически не хранит итоговый остаток, он копит только приход и расход за период.

Если вам нужны именно движения за интервал — продажи за месяц, списанные материалы, начисленная выручка — то оборотный регистр в 1С 8.3 и есть правильный инструмент. Ниже разберём, как он устроен внутри, чем отличается от остаточного, как его создать и как корректно получить обороты запросом через виртуальные таблицы.

Что такое регистр накопления и зачем отдельный вид «Обороты»

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

У регистра накопления два вида:

  • 📈 Остатки — считает остаток на любой момент (сколько товара на складе, сколько денег на счёте). Движения бывают Приход и Расход.
  • 🔄 Обороты — копит только суммарный оборот за период (сколько продали, сколько начислили). Движения только одного типа — Приход фактически не делится, у записи нет направления.

Вид задаётся один раз, в свойстве регистра, и потом менять его на боевой базе больно: структура таблиц в СУБД разная.

Правило выбора простое. Нужен ответ на вопрос «сколько ОСТАЛОСЬ» — берите Остатки. Нужен ответ «сколько ПРОШЛО за период» — берите Обороты.

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

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

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

ПризнакОстаткиОбороты
Тип движенияПриход / РасходБез деления (только «плюс»)
Что хранитОстаток на дату + оборотыТолько обороты за период
Таблицы в СУБДДвижения + ИтогиДвижения (+ агрегаты опц.)
Виртуальные таблицыОстатки, Обороты, ОстаткиИОборотыОбороты
Скорость записиНиже (пересчёт итогов)Выше
Типовой пример«ТоварыНаСкладах», «Взаиморасчёты»«Продажи», «Выручка»

Ключевой вывод: оборотный регистр дешевле при проведении документов, потому что не пересчитывает итоги остатков. На высоконагруженных участках (много продаж в секунду) это заметно.

Когда оборотный регистр НЕ нужен

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

Структура оборотного регистра: измерения, ресурсы, реквизиты

Состав полей одинаков у обоих видов, отличается смысл.

  • Измерения — разрезы, по которым группируются числа: Номенклатура, Организация, Склад, Контрагент. По ним потом строится группировка в виртуальной таблице.
  • Ресурсы — собственно числа, которые суммируются: Количество, Сумма, Выручка. Это то, что копится.
  • Реквизиты — дополнительная информация записи, которая НЕ суммируется и не участвует в группировке итогов (например, Комментарий, ДокументОснование).

Частая ошибка проектирования — засунуть в измерения то, что должно быть реквизитом. Лишнее измерение раздувает таблицу итогов/агрегатов и замедляет запись. В измерения — только то, по чему реально фильтруете и группируете.

Связь с регистратором и уникальность записей

Регистр накопления почти всегда подчинён регистратору — документу, который делает движения. У записи есть служебные поля:

  • Регистратор — ссылка на документ-источник движения.
  • НомерСтроки — порядковый номер строки внутри набора записей одного регистратора.
  • Период — момент времени, к которому отнесён оборот.
  • Активность — флаг: неактивные записи в итоги/обороты не попадают.

Уникальность записи в наборе определяется парой Регистратор + НомерСтроки. Поэтому нельзя записать две строки одного документа с одинаковым номером — платформа не даст.

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

Движения.Продажи.Записывать = Истина;
Движение = Движения.Продажи.Добавить();
Движение.Период       = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Организация  = Организация;
Движение.Количество   = ТекСтрока.Количество;
Движение.Выручка      = ТекСтрока.Сумма;

Флаг Записывать = Истина обязателен — без него набор в базу не уйдёт.

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

Порядок в конфигураторе (или в режиме EDT):

  1. В дереве конфигурации → ветка Регистры накопления → добавить новый.
  2. На вкладке «Основные» задать имя, например Продажи.
  3. Свойство Вид регистра переключить с Остатки на Обороты. Это делается один раз и до ввода данных.
  4. На вкладке «Данные» добавить измерения (Номенклатура, Организация), ресурсы (Количество, Выручка) и при необходимости реквизиты.
  5. На вкладке «Регистраторы» отметить документы, которые будут писать движения.
  6. Через Конструктор движений в модуле документа быстро сгенерировать код заполнения набора записей.

Конструктор движений — это помощник, который по галочкам сопоставляет табличную часть документа с измерениями и ресурсами регистра и пишет готовый цикл. Экономит время и снижает шанс опечатки.

Чек-лист перед созданием оборотного регистра
Выполнено: 0 / 6

Виртуальные таблицы: как получить обороты запросом

Напрямую к таблице движений в запросах почти не обращаются. Работают с виртуальными таблицами — платформа сама агрегирует данные и отдаёт результат.

У вида «Обороты» доступна ровно одна виртуальная таблица — Обороты. У вида «Остатки» их три: Остатки, Обороты, ОстаткиИОбороты.

Базовый запрос оборотов за период:

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот,
    ПродажиОбороты.ВыручкаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(
        &НачалоПериода,
        &КонецПериода,
        ,
        Организация = &Организация) КАК ПродажиОбороты

Что тут важно:

  • К имени ресурса в виртуальной таблице оборотов добавляется суффикс Оборот: КоличествоКоличествоОборот.
  • Первые два параметра — начало и конец периода. Границы включаются.
  • Третий параметр (пропущен запятой) — периодичность (для оборотов по под-периодам: День, Месяц, Квартал).
  • Четвёртый — условие на измерения (отбор). Ставьте его в параметр таблицы, а не в ГДЕ — так платформа отфильтрует данные ДО агрегации и запрос будет быстрее.

Обороты с периодичностью удобны для отчётов «по месяцам»: укажите третий параметр Периодичность = Месяц, и в результате появится поле Период с разбивкой.

Обороты из остаточного регистра

Если регистр остаточный, обороты берутся из его таблицы Обороты или ОстаткиИОбороты. Во второй у ресурсов появляются суффиксы НачальныйОстаток, Приход, Расход, Оборот, КонечныйОстаток — всё в одной строке.

Что происходит в СУБД при записи

Понимание физики помогает не удивляться тормозам.

  • Для оборотного регистра платформа держит основную таблицу движений. Если включён режим агрегатов или итогов — плюс служебные таблицы.
  • Для остаточного — таблица движений плюс таблица итогов, которая пересчитывается при каждой записи. Это и есть основная цена остаточного регистра.

Отсюда практический вывод: если показатель нужен только «за период», оборотный регистр снимет с базы лишнюю нагрузку на итоги.

Агрегаты и режим итогов: ускоряем обороты

На больших объёмах даже оборотный регистр начинает медленно отдавать данные за длинные интервалы. Два механизма ускорения:

  • Итоги оборотов — предрассчитанные суммы по периодам. Можно включать/отключать. При отключённых итогах обороты считаются «на лету» по таблице движений — медленнее, но запись легче.
  • Агрегаты — доступны только оборотным регистрам. Это дополнительные предагрегированные срезы по выбранным измерениям и периодичности. Платформа сама выбирает подходящий агрегат при выполнении запроса.

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

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

Типичные ошибки при работе с оборотным регистром

  • ❌ Пытаться получить остаток из оборотного регистра. Его там нет — только оборот.
  • ❌ Забыть суффикс Оборот у ресурса в запросе (Выручка вместо ВыручкаОборот) — поле не найдётся.
  • ❌ Ставить отбор в ГДЕ вместо параметра виртуальной таблицы — фильтрация после агрегации, лишняя работа СУБД.
  • ❌ Менять вид регистра на рабочей базе с данными — структура таблиц другая, ждите проблем с реструктуризацией.
  • ❌ Лишние измерения «про запас» — раздувают агрегаты и тормозят проведение.
  • ❌ Не выставить Движения.Регистр.Записывать = Истина — движения не пишутся, а ошибки нет.
Проверьте себя
Что физически хранит регистр накопления вида «Обороты»?
Какой суффикс получает ресурс «Сумма» в виртуальной таблице оборотов?
Где правильнее указать отбор по организации в запросе к виртуальной таблице?
Какой механизм ускорения доступен только оборотным регистрам?

Частые вопросы

Можно ли из оборотного регистра получить остаток?
Нет. Вид «Обороты» не хранит остаток, только оборот за период. Если нужен остаток — регистр должен быть вида «Остатки».
Чем отличается КоличествоОборот от Количество?
Количество — имя ресурса в самом регистре. В виртуальной таблице оборотов к нему добавляется суффикс Оборот, поэтому в запросе поле называется КоличествоОборот — это сумма за период.
Что быстрее пишется — оборотный или остаточный регистр?
Оборотный. Он не ведёт таблицу итогов остатков и не пересчитывает её при каждом движении, поэтому проведение документов легче.
Зачем нужны агрегаты и когда их включать?
Агрегаты — предрассчитанные срезы оборотов, ускоряют тяжёлые отчёты за длинные периоды. Включайте точечно под конкретные отчёты: они занимают место и замедляют запись.
Можно ли поменять вид регистра с «Остатки» на «Обороты» на рабочей базе?
Технически да, но структура таблиц в СУБД разная, потребуется реструктуризация и есть риск потери данных. На боевой базе так лучше не делать — планируйте вид заранее.
Как получить обороты с разбивкой по месяцам?
Задайте третий параметр виртуальной таблицы Обороты — периодичность Месяц. В результат добавится поле Период с помесячной разбивкой оборота.