Как программно создать движения в регистре бухгалтерии: запись напрямую или создание документа "Операция"?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Рассмотрим ситуацию, с которой часто сталкиваются начинающие разработчики 1С при автоматизации учетных задач: как более правильно и корректно создать движения в регистре бухгалтерии программным путем? Записывать ли данные напрямую через движения или же программно создавать документ-регистратор, например, операцию?

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

Способ 1. Программное создание документа "Операция" и привязка к нему движений

Этот способ является наиболее очевидным и часто используется на практике. Мы создаем типовой документ ОперацияБух (или используем сторно, корректировку регистров) и привязываем движения непосредственно к нему. Посмотрим на пример реализации в коде:


Операция = Документы.ОперацияБух.СоздатьДокумент();
// Здесь необходимо добавить код заполнения реквизитов шапки документа Операция (Дата, Организация и т.д.)

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

// Записываем сам документ-регистратор
Операция.Записать(РежимЗаписиДокумента.Запись);

// Указываем платформе, что движения необходимо записать в базу
Операция.Движения.Хозрасчетный.Записывать = Истина;
Операция.Движения.Хозрасчетный.Записать();

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

Важное замечание: В типовых конфигурациях у документа ОперацияБух есть реквизит "Сумма операции". При программном добавлении проводок через свойство Движения, сумма в шапке документа автоматически не пересчитывается. Ее необходимо вычислять и записывать в реквизит документа программно. Также помните, что на этот документ могут быть назначены различные типовые подписки на события.

Способ 2. Запись в регистр через Набор Записей (RecordSet)

Рассмотрим более производительный способ программной записи — использование объекта "Набор записей". Этот метод позволяет записывать движения, имея только ссылку на уже существующий документ-регистратор, без необходимости загружать в оперативную память весь объект документа с помощью метода ПолучитьОбъект.

Разберем по шагам, как это работает. Для работы с регистром используется метод СоздатьНаборЗаписей. При работе с набором записей критически важно устанавливать отбор по регистратору, иначе система попытается перезаписать весь регистр, что приведет к ошибке.


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

// Добавляем новую проводку
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Регистратор = СсылкаНаНашДокумент;
НоваяЗапись.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
// Заполнение остальных полей...
НоваяЗапись.Активность = Истина;

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

Этот способ незаменим при массовой обработке данных, так как он значительно экономит оперативную память и время выполнения кода.

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

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

  1. Управление активностью записей. В регистре бухгалтерии есть стандартный реквизит Активность. Если запись создается программно напрямую, этот флаг по умолчанию может не установиться. Неактивные записи сохранятся в базе, но не будут участвовать в формировании итогов (сальдо и оборотов). Обязательно устанавливайте его в значение Истина, если хотите, чтобы проводка влияла на учет.
  2. Пересчет итогов. Платформа хранит итоги в специальных таблицах. При массовой записи проводок "задним числом" система начинает автоматически пересчитывать итоги с момента записи по текущую дату. Это вызывает блокировки. При масштабных изменениях рекомендуется временно отключать итоги с помощью функции УстановитьИспользованиеИтогов.
  3. Транзакционность. Запись в регистр бухгалтерии напрямую требует явного контроля целостности данных. Если вы обрабатываете несколько документов, оборачивайте код в конструкции НачатьТранзакцию и ЗафиксироватьТранзакцию.
  4. Очистка (удаление) движений. Если необходимо программно отменить проводки по документу (сымитировать отмену проведения), нужно создать набор записей, установить отбор по регистратору, не добавлять в него никаких строк и вызвать метод Записать. Это полностью очистит все проводки документа в данном регистре.

Проанализируем ситуацию в сложных конфигурациях (например, ERP или Комплексная автоматизация). Там использование прямой записи проводок или программных документов "Операция" может нарушить концепцию учета, так как бухгалтерские проводки в них должны строго формироваться на основании оперативного учета (регистров накопления). Прямая запись может привести к расхождению управленческого баланса и регламентированной отчетности. Если в результате подобных доработок или миграции данных требуется проверить идентичность проводок, этот процесс можно ускорить с помощью автоматического сравнения бухгалтерских и налоговых проводок между базами 1С.

Таким образом, выбор между созданием документа "Операция" и прямой записью зависит от контекста. Для разовых ручных корректировок или прозрачности для пользователя лучше создавать "Операцию". Для высокопроизводительных обработок или при наличии уже существующего документа-регистратора оптимальнее использовать прямую запись через набор записей.

← На главную