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