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