При разработке новых документов в платформе «1С:Предприятие» разработчики часто сталкиваются с ситуацией: процедура ОбработкаПроведения отрабатывает без видимых ошибок, отладчик подтверждает добавление строк в коллекцию Движения.Хозрасчетный, однако после закрытия документа проводки в регистре бухгалтерии так и не появляются. Проанализируем, почему возникает эта проблема и как правильно её исправить.
В платформе 1С работа с движениями документа строится через наборы записей. Когда мы добавляем новую запись через метод Добавить(), платформа формирует проводку в оперативной памяти. Однако чтобы эти данные попали в базу данных при завершении процедуры проведение, платформа должна знать, что данный набор записей необходимо сохранить.
Для этого у каждого набора записей в коллекции Движения существует булево свойство Записывать. Если перед формированием проводки или после завершения цикла не установить свойство Движения.Хозрасчетный.Записывать = Истина;, платформа проигнорирует сформированные записи и не сохранит их в регистре.
Рассмотри два основных способа решения данной задачи в коде модуля документа.
Способ 1. Установка флага для автоматической записи платформой (рекомендуемый)
По умолчанию в свойствах документа параметр «Запись движений» установлен в значение Записывать выбранные. В этом случае достаточно в начале или в конце процедуры ОбработкаПроведения установить свойство Записывать в значение Истина. Явный вызов метода Записать() делать не нужно — платформа сама запишет сформированный набор в транзакции проведения.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Указываем платформе, что набор записей регистра Хозрасчетный должен быть записан
Движения.Хозрасчетный.Записывать = Истина;
Для Каждого ТекСтрока Из ТекСтрокаРезервы Цикл
Движение = Движения.Хозрасчетный.Добавить();
Движение.Период = Дата;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("63.02");
Движение.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.02");
Движение.Сумма = ТекСтрока.Сумма;
// Заполнение субконто кредита
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = ТекСтрока.НаименованиеПоставщика;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры] = ТекСтрока.НомерДоговора;
КонецЦикла;
КонецПроцедуры
Способ 2. Явная запись набора движений
Если требуется принудительно записать проводки непосредственно в процессе выполнения кода (например, для последующего чтения этих движений в этой же процедуре), используется метод Записать(). Однако стоит учитывать важную особенность платформы: после явного вызова Записать() свойство Записывать автоматически сбрасывается в Ложь.
// Явная запись набора в базу данных
Движения.Хозрасчетный.Записывать = Истина;
Движения.Хозрасчетный.Записать();
Если свойство Записывать = Истина установлено, но проводки все равно не появляются, разберем другие возможные причины:
СчетДт и СчетКт). Если указан только один счет, запись может не сформироваться.НайтиПоКоду() не нашел счет в информационной базе, он возвращает пустую ссылку. Всегда проверяйте корректность кода счета и его наличие в плане счетов.Отказ принимает значение Истина, транзакция проведения откатывается, и любые записанные движения удаляются из базы.