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

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

1С: как изменить проводки документа программно

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

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

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

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

Как устроены движения документа в 1С

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

Каждый набор записей жёстко привязан к регистратору — документу, который его сформировал. Удалить или изменить записи «в отрыве» от регистратора нельзя: набор всегда читается и пишется с отбором по конкретному документу. Это ключевое ограничение, которое определяет все приёмы работы.

Движения документа можно посмотреть интерактивно: откройте проведённый документ и используйте кнопку «Дт/Кт» (в типовых) или команду «Перейти → Движения по регистрам». Это первый шаг диагностики — прежде чем что-то менять кодом, нужно увидеть, какие записи реально сформированы.

Способ 1. Изменение движений через объект документа

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

ДокОбъект = ДокументСсылка.ПолучитьОбъект();

// Читаем набор записей бухгалтерского регистра

Проводки = ДокОбъект.Движения.Хозрасчетный;

Проводки.Прочитать();

// Добавляем свою проводку

НоваяПроводка = Проводки.Добавить();

НоваяПроводка.Период = ДокОбъект.Дата;

НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.02");

НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05");

НоваяПроводка.Сумма = 1000;

НоваяПроводка.Содержание = "Корректировка проводок программно";

// Записываем движения без перепроведения самого документа

Проводки.Записать();

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

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

Способ 2. Прямая работа с набором записей регистра

Набор записей можно создать и без объекта документа — через менеджер регистра. Это полезно, когда объект документа получать нежелательно (например, он большой, или документ вообще не должен перепроводиться) и когда правки делаются из внешней обработки.

НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);

НаборЗаписей.Прочитать();

Для Каждого Проводка Из НаборЗаписей Цикл

Если Проводка.СчетДт = СтарыйСчет Тогда

Проводка.СчетДт = НовыйСчет;

КонецЕсли;

КонецЦикла;

НаборЗаписей.Записать();

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

Для регистров накопления и сведений синтаксис идентичен, меняется только менеджер: РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей().

Типичные ошибки
01
Запись набора без отбора по регистратору — риск затереть движения всех документов регистра
02
Вызов Записать(Проведение) после ручной правки движений — обработчик проведения перезапишет изменения
03
Правка набора записей у документа с включённым контролем остатков без пересчёта итогов — расхождения в отчётах
04
Игнорирование признака Активность у записей — неактивные строки не попадают в отчёты, но остаются в базе

Допроведение и ручная корректировка в типовых конфигурациях

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

Для разовой правки в документе есть флаг «Ручная корректировка» (включается через меню «Ещё»). После его установки движения можно редактировать вручную прямо в форме, и платформа не будет перезаписывать их при проведении. Программно это соответствует установке реквизита РучнаяКорректировка = Истина у объекта документа.

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

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

Правка через Движения объекта

Подходит для разовых корректировок и внешних обработок; требует аккуратности, чтобы не вызвать перепроведение

Набор записей регистра напрямую

Быстрее для массовых обработок, не трогает сам документ; выше риск при ошибке в отборе

Ручная корректировка (типовые)

Самый безопасный для единичных случаев; не масштабируется и фиксирует движения — изменения типового алгоритма к ним не применятся

Подписка на событие / расширение

Правильный путь для постоянной доработки; требует навыков разработки и тестирования при обновлениях

Массовое изменение проводок обработкой

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

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

Учтите, что изменение движений прошлых периодов может потребовать пересчёта итогов и влияет на регламентированную отчётность. Если период закрыт и отчёты сданы, корректнее оформить исправление документом «Корректировка» или сторнирующими записями текущей датой, а не править прошлые проводки.

Порядок действий
  1. 1
    Сделайте резервную копию базы или разверните копию для теста
  2. 2
    Откройте проблемный документ и посмотрите его текущие движения (кнопка Дт/Кт)
  3. 3
    Напишите код правки набора записей и протестируйте на одном документе в копии
  4. 4
    Сверьте результат с ожидаемым: движения документа, оборотно-сальдовая ведомость, отчёты по регистрам
  5. 5
    Только после успешной проверки запускайте обработку в рабочей базе, желательно порциями

Проверка результата и откат изменений

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

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

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

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

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

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

Записи соответствуют задуманным, признак Активность включён

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

Записей нет, они неактивны или содержат старые значения

Оборотно-сальдовая ведомость
Норма

Обороты по счетам изменились на ожидаемую сумму, сальдо корректное

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

Появились «красные» остатки или суммы удвоились

Отчёты по регистрам накопления
Норма

Остатки неотрицательные, итоги сходятся с прежними данными за вычетом правки

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

Отрицательные остатки, расхождения с контрольными отчётами

Ограничения и частые проблемы

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

При работе в клиент-серверном варианте массовые обработки выполняйте на сервере (в серверной процедуре общего модуля или через фоновое задание), иначе получите проблемы с производительностью и контекстом. Также помните про права: у пользователя, от имени которого выполняется обработка, должны быть права на изменение регистра и чтение документов.

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

Итог

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

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

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

Можно ли изменить проводки документа, не перепроводя его?

Да. Для этого записывают не сам документ, а набор записей регистра: ДокОбъект.Движения.Хозрасчетный.Записать() или набор, созданный через менеджер регистра. Признак проведённости документа при этом не меняется, обработчик проведения не вызывается.

Почему после моей правки проводки снова стали старыми?

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

Как полностью удалить все проводки документа, оставив его проведённым?

Создайте набор записей регистра, установите отбор по регистратору и вызовите Записать() без чтения и добавления строк — пустой набор заместит существующие записи. Повторите для каждого регистра, по которому документ делал движения. Учтите, что проведённый документ без движений вызовет вопросы при аудите — обычно корректнее отменить проведение.

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

Синтаксис тот же, меняется менеджер: РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей(). Отличия в содержании записей: у регистра накопления есть вид движения (Приход/Расход), измерения и ресурсы вместо счетов Дт/Кт, а у записи нужно заполнить поле ВидДвижения и Период.

Безопасно ли править проводки закрытого периода?

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

Как добавить субконто к проводке программно?

Через коллекцию СубконтоДт или СубконтоКт записи: Проводка.СубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура, НоменклатураСсылка). Вид субконто должен быть назначен счёту в плане счетов, иначе значение не сохранится или не будет учитываться в отчётах.