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