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