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