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

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

Регистры накопления в 1С: пошаговое руководство по созданию

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

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

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

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

Что такое регистр накопления и когда он нужен

Регистр накопления хранит числовые показатели в разрезе заданных аналитик (измерений) и изменяется только записями документов-регистраторов. Каждая запись называется движением и содержит период, вид движения (приход или расход), значения измерений и величину изменения ресурса. Итоговое значение показателя платформа вычисляет автоматически как сумму движений.

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

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

Выбор вида регистра: Остатки или Обороты

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

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

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

Сравнение вариантов

Регистр «Остатки»

Подходит для складских остатков, долгов, денег. Хранит итоги на даты, требует видов движения Приход/Расход. Тяжелее по ресурсам.

Регистр «Обороты»

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

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

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

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

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

Создание регистра в конфигураторе: пошагово

Откройте конфигурацию в конфигураторе, в дереве объектов найдите ветку «Регистры накопления» и добавьте новый объект. Задайте имя (например, «ТоварыНаСкладах») и синоним. На закладке «Основные» выберите вид регистра — «Остатки» или «Обороты».

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

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

Написание движений документа

Движения формируются в процедуре ОбработкаПроведения модуля объекта документа. Стандартный подход — заполнить таблицу движений и записать её. Минимальный пример для приходной накладной:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

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

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

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

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

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

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

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

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

КонецЦикла;

КонецПроцедуры

Для расходного документа вид движения меняется на Расход. Если требуется контроль отрицательных остатков (нельзя списать больше, чем есть), перед записью движений выполняется запрос к виртуальной таблице Остатки с учётом движений текущего документа, и при нехватке устанавливается Отказ = Истина с сообщением пользователю.

Свойство «Записывать = Истина» обязательно: без него набор движений не будет сохранён, даже если вы его заполнили. Очистка набора перед заполнением защищает от дублирования движений при повторном проведении в некоторых сценариях.

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

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

Пример запроса остатков на дату с отбором по складу:

ВЫБРАТЬ

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

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

ИЗ

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

Параметры виртуальной таблицы (период, условие отбора) передавайте именно в скобках виртуальной таблицы, а не в секции ГДЕ — отбор внутри виртуальной таблицы выполняется по итогам и работает на порядки быстрее. Период для остатков обычно передают как границу, исключающую движения самого документа при контроле.

bsl
Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад)"); Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса()); Запрос.УстановитьПараметр("Склад", Склад); Результат = Запрос.Выполнить().Выгрузить();

Проверка результата и типичные ошибки

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

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

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

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

В списке регистра есть записи с верным периодом, видом движения и измерениями

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

Записей нет или период пустой — проверьте Записывать = Истина и заполнение Движение.Период

Остатки по виртуальной таблице
Норма

Остаток равен сумме приходов минус сумма расходов

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

Остаток удвоен или не совпадает — возможны дубли движений или неочищенный набор

Отчёт по регистру
Норма

Итоги в отчёте совпадают с запросом к виртуальной таблице

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

Расхождения — проверьте отборы, периодичность и роли ресурсов в СКД

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

Ограничения и альтернативы

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

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

Итог

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

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

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

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

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

Можно ли добавить измерение в существующий регистр без потери данных?

Добавление нового измерения обычно проходит без потери старых движений — у существующих записей оно будет пустым. Удаление измерения или изменение его типа приведёт к потере данных в этом поле. Любую реструктуризацию делайте сначала на копии базы и проверяйте итоги после обновления.

Почему документ проводится, а движений в регистре нет?

Три типовые причины: не установлено Движения.ИмяРегистра.Записывать = Истина; документ не отмечен как регистратор на закладке «Регистраторы» регистра; в процедуре ОбработкаПроведения возникает исключение до записи движений, и транзакция откатывается. Проверьте также, что процедура написана в модуле объекта, а не в модуле формы.

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

Передайте в виртуальную таблицу Остатки момент времени документа: Новый Граница(МоментВремени, ВидГраницы.Исключая) или просто МоментВремени документа. Тогда движения самого документа не попадут в остаток, и контроль при перепроведении не будет учитывать его собственные старые записи дважды.

Что быстрее: запрос к ОстаткиИОбороты или два отдельных запроса?

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

Нужен ли индекс по измерениям регистра вручную?

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