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