Рассмотрим ситуацию, с которой часто сталкиваются начинающие разработчики 1С при автоматизации учетных задач: как более правильно и корректно создать движения в регистре бухгалтерии программным путем? Записывать ли данные напрямую через движения или же программно создавать документ-регистратор, например, операцию?
Разберем этот вопрос детально. В платформе 1С:Предприятие для регистра бухгалтерии (как и для регистра накопления) обязательно нужен регистратор. Регистратор — это ссылка на документ, которым проводка была создана. Поэтому создать "висящую в воздухе" запись без документа невозможно. Проанализируем два основных корректных способа решения этой задачи.
Этот способ является наиболее очевидным и часто используется на практике. Мы создаем типовой документ ОперацияБух (или используем сторно, корректировку регистров) и привязываем движения непосредственно к нему. Посмотрим на пример реализации в коде:
Операция = Документы.ОперацияБух.СоздатьДокумент();
// Здесь необходимо добавить код заполнения реквизитов шапки документа Операция (Дата, Организация и т.д.)
РегЗапись = Операция.Движения.Хозрасчетный.Добавить();
// Здесь заполняем саму проводку: СчетДт, СчетКт, Период, Сумма, Субконто
// Записываем сам документ-регистратор
Операция.Записать(РежимЗаписиДокумента.Запись);
// Указываем платформе, что движения необходимо записать в базу
Операция.Движения.Хозрасчетный.Записывать = Истина;
Операция.Движения.Хозрасчетный.Записать();
При использовании этого метода платформа сама управляет транзакцией и блокировками в момент вызова метода Записать, что делает подход более безопасным для начинающего программиста. Если необходимо отменить такую проводку, достаточно просто отменить проведение или пометить на удаление созданный документ операции.
Важное замечание: В типовых конфигурациях у документа ОперацияБух есть реквизит "Сумма операции". При программном добавлении проводок через свойство Движения, сумма в шапке документа автоматически не пересчитывается. Ее необходимо вычислять и записывать в реквизит документа программно. Также помните, что на этот документ могут быть назначены различные типовые подписки на события.
Рассмотрим более производительный способ программной записи — использование объекта "Набор записей". Этот метод позволяет записывать движения, имея только ссылку на уже существующий документ-регистратор, без необходимости загружать в оперативную память весь объект документа с помощью метода ПолучитьОбъект.
Разберем по шагам, как это работает. Для работы с регистром используется метод СоздатьНаборЗаписей. При работе с набором записей критически важно устанавливать отбор по регистратору, иначе система попытается перезаписать весь регистр, что приведет к ошибке.
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаНашДокумент);
// Добавляем новую проводку
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Регистратор = СсылкаНаНашДокумент;
НоваяЗапись.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
// Заполнение остальных полей...
НоваяЗапись.Активность = Истина;
НаборЗаписей.Записать();
Этот способ незаменим при массовой обработке данных, так как он значительно экономит оперативную память и время выполнения кода.
При программном формировании движений выясним несколько скрытых нюансов, которые могут повлиять на корректность учета и производительность системы:
Активность. Если запись создается программно напрямую, этот флаг по умолчанию может не установиться. Неактивные записи сохранятся в базе, но не будут участвовать в формировании итогов (сальдо и оборотов). Обязательно устанавливайте его в значение Истина, если хотите, чтобы проводка влияла на учет.УстановитьИспользованиеИтогов.НачатьТранзакцию и ЗафиксироватьТранзакцию.Записать. Это полностью очистит все проводки документа в данном регистре.Проанализируем ситуацию в сложных конфигурациях (например, ERP или Комплексная автоматизация). Там использование прямой записи проводок или программных документов "Операция" может нарушить концепцию учета, так как бухгалтерские проводки в них должны строго формироваться на основании оперативного учета (регистров накопления). Прямая запись может привести к расхождению управленческого баланса и регламентированной отчетности. Если в результате подобных доработок или миграции данных требуется проверить идентичность проводок, этот процесс можно ускорить с помощью автоматического сравнения бухгалтерских и налоговых проводок между базами 1С.
Таким образом, выбор между созданием документа "Операция" и прямой записью зависит от контекста. Для разовых ручных корректировок или прозрачности для пользователя лучше создавать "Операцию". Для высокопроизводительных обработок или при наличии уже существующего документа-регистратора оптимальнее использовать прямую запись через набор записей.