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

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

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

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

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

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

Виды регистров накопления и когда какой выбирать

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

Критерий выбора простой: если бизнес-вопрос звучит как «сколько чего-то есть сейчас / было на дату» — нужен регистр остатков. Если вопрос — «сколько всего произошло за период» — достаточно оборотного регистра, который работает быстрее и занимает меньше места, потому что платформе не нужно поддерживать для него таблицу итогов остатков.

Частая проектная ошибка — создавать регистр остатков «на всякий случай» там, где остаток никогда не запрашивается. Это увеличивает объём базы и замедляет проведение документов. Обратная ошибка — пытаться вычислять остатки из оборотного регистра суммированием с начала времён: такие запросы деградируют по мере роста данных.

Сравнение видов регистров

Остатки

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

Обороты

Подходит для продаж, начислений, статистики. Легче и быстрее, но не умеет отвечать на вопрос «сколько осталось».

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

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

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

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

Формирование движений при проведении документа

Записи в регистр создаются в обработчике проведения документа. В простейшем случае используется конструктор движений: он генерирует код, обходящий табличную часть документа и формирующий строки набора записей. Для документа «Приходная накладная» по регистру «ТоварыНаСкладах» типичный код выглядит так:

Для Каждого ТекСтрокаТовары Из Товары Цикл

Движение = Движения.ТоварыНаСкладах.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;

Движение.Склад = Склад;

Движение.Количество = ТекСтрокаТовары.Количество;

КонецЦикла;

Движения.ТоварыНаСкладах.Записывать = Истина;

Ключевые моменты: свойство Записывать = Истина обязательно, иначе набор записей не запишется; вид движения (Приход/Расход) задаётся только для регистров остатков; период движения обычно равен дате документа. Для документов расхода вид движения меняется на ВидДвиженияНакопления.Расход, а логика остаётся той же.

В реальных конфигурациях движения часто формируются не циклом по табличной части, а запросом: запрос выбирает данные документа (иногда с соединениями к остаткам для контроля), а результат выгружается в набор записей методом Загрузить(). Такой подход быстрее на больших документах и позволяет сразу получить данные для контроля остатков.

Добавление движений по регистру в документ
  1. 1
    Откройте модуль объекта документа, процедуру ОбработкаПроведения
  2. 2
    Запустите конструктор движений и выберите регистр и вид движения
  3. 3
    Проверьте сгенерированный код: заполнение измерений, ресурсов, периода
  4. 4
    Убедитесь, что установлено Движения.<ИмяРегистра>.Записывать = Истина
  5. 5
    Проведите тестовый документ и откройте его движения кнопкой «Перейти → Движения»
  6. 6
    Сверьте результат с отчётом по регистру за период документа

Чтение данных: виртуальные таблицы и запросы

Напрямую таблицу регистра читают редко — в ней лежат сырые движения. Для отчётов используются виртуальные таблицы, которые платформа строит на основе итогов. У регистра остатков их три: Остатки (остаток на момент времени), Обороты (приход, расход, оборот за период) и ОстаткиИОбороты (начальный остаток, движения, конечный остаток). У оборотного регистра доступна только таблица Обороты.

Типичный запрос остатков на дату:

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.Склад,

Остатки.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки

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

Ещё одна деталь — поле остатка называется <ИмяРесурса>Остаток, а в таблице ОстаткиИОбороты добавляются НачальныйОстаток и КонечныйОстаток. Если запрос возвращает пустой результат, первым делом проверьте, рассчитаны ли итоги на нужный период и не устарели ли они.

Контроль остатков и отрицательные остатки

Классическая задача — не дать списать больше товара, чем есть на складе. Контроль выполняется в обработке проведения: запросом к виртуальной таблице Остатков на момент документа получают текущие остатки по списываемым позициям и сравнивают с количеством в документе. При нехватке выводят сообщение и устанавливают Отказ = Истина.

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

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

Итоги, пересчёт и восстановление последовательностей

Платформа хранит заранее рассчитанные итоги по месяцам, чтобы виртуальные таблицы работали быстро. Если итоги рассчитаны не на актуальный период, запросы остатков начинают суммировать движения «вживую» и резко тормозят. Управление итогами выполняется в режиме 1С:Предприятие через «Администрирование → Обслуживание → Управление итогами» или программно методами УстановитьМинимальныйИМаксимальныйПериодРассчитанныхИтогов и ПересчитатьИтоги менеджера регистра.

Признак проблемы с итогами: отчёт по остаткам, который раньше открывался секунды, теперь выполняется минутами, при этом состав данных не изменился. Решение — открыть управление итогами и проверить, до какого периода они рассчитаны; при необходимости выполнить полный пересчёт. В файловых базах после сбоев (отключение питания при проведении) итоги могут расходиться с движениями — тогда помогает тестирование и исправление с пересчётом итогов.

Если документы перепроводились задним числом, нарушается хронологическая логика остатков. В конфигурациях с механизмом последовательностей граница последовательности показывает, до какого момента данные корректны; восстановление выполняется через «Операции → Проведение документов → Восстановление последовательностей». Это безопасная штатная операция, но на больших объёмах она занимает заметное время.

Контрольные точки

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

Отчёт по остаткам на дату
Норма

Открывается быстро, остатки неотрицательные и сходятся с данными документов

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

Долгое формирование, отрицательные остатки, расхождение с первичкой

Движения документа
Норма

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

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

Пустой набор движений или дубли строк

Период рассчитанных итогов
Норма

Итоги рассчитаны на актуальный период

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

Расчёт итогов отстаёт на месяцы

Типичные ошибки и ограничения

Самые частые проблемы при работе с регистрами накопления собраны ниже — их стоит проверять в первую очередь при странном поведении отчётов.

Типичные ошибки
01
Забыто Движения.<Регистр>.Записывать = Истина — документ проводится без ошибок, но движений нет
02
Отбор в запросе в секции ГДЕ вместо параметров виртуальной таблицы — запрос сканирует все итоги и тормозит
03
Излишние измерения — раздутая таблица итогов, медленное проведение и пересчёт
04
Ручная правка записей регистра — расхождения с документами после первого же перепроведения
05
Контроль остатков по неверному моменту времени — ложные сообщения о нехватке или пропуск минуса
06
Проведение документов задним числом без восстановления последовательности — некорректные остатки в прошлых периодах

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

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

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

Чем регистр накопления отличается от регистра сведений?

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

Почему в отчёте пусто, хотя документы проведены?

Проверьте по цепочке: есть ли движения у конкретного документа (кнопка «Перейти → Движения»), установлено ли в коде Записывать = Истина, рассчитаны ли итоги на период отчёта, не отсекает ли параметры виртуальной таблицы слишком жёсткий отбор. Чаще всего причина — отсутствие записей в наборе движений.

Можно ли удалить движения документа, не отменяя проведение?

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

Как получить остатки на конец каждого дня за месяц?

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

Что делать, если остатки в отчёте не сходятся с картотекой документов?

Сначала сформируйте отчёт с детализацией до регистратора и найдите период расхождения. Затем проверьте: не проводились ли документы задним числом (восстановите последовательность), не правились ли записи регистра вручную, актуальны ли итоги. В файловой базе после аварийного завершения выполните тестирование и исправление с пересчётом итогов.

Когда нужен собственный регистр, а когда хватит типового?

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

Итог

Что важно запомнить

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