Как программно добавить проводки к существующему документу в 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 7.7 нередко возникает задача программного добавления дополнительных бухгалтерских проводок к уже проведенному документу. Разберем механизм работы с объектом Операция, посмотрим на пример программного кода, а также проанализируем нюансы и ограничения такого подхода.

Особенности архитектуры операций в платформе 1С 7.7

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

  1. Связь «один к одному». В платформе 1С 7.7 операция жестко привязана к документу. Нельзя создать отдельную независимую операцию и прикрепить ее вторым набором проводок к документу, у которого уже существует операция.
  2. Свойство ведения бухучета. Если у вида документа в метаданных выключена опция ведения бухгалтерского учета, поиск операции методом НайтиОперацию() вернет нулевой результат, и записать проводки не удастся.
  3. Риск потери данных при перепроведении. Любое штатное перепроведение документа (в интерактивном режиме или при групповом перепроведении) полностью очищает существующую операцию и формирует проводки заново по алгоритму, прописанному в процедуре ОбработкаПроведения модуля документа. Все добавленные извне проводки будут безвозвратно удалены.

Программное добавление проводок через объект «Операция»

Рассмотрим базовый способ прямого изменения операции документа. Для этого создадим объект Операция, спозиционируем его на нужном документе и добавим новую проводку.

Посмотрим на пример программного кода:


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

Разберем ключевые моменты представленного алгоритма:

  1. Поиск операции. Метод Опр.НайтиОперацию() принимает ссылку на документ через метод ТекущийДокумент(). Метод возвращает 1, если операция успешно найдена, и 0, если у документа нет операции.
  2. Заполнение субконто. Метод Субконто(НомерСубконто, Значение) принимает порядковый номер субконто счета и передаваемый объект аналитики.
  3. Активность проводок. Метод Опр.ВключитьПроводки(1) гарантирует, что добавленная проводка станет активной и сразу повлияет на бухгалтерские итоги.
  4. Сохранение изменений. Метод Опр.Записать() фиксирует изменения в базе данных.

Учет количественных и валютных показателей

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


// Для количественного учета
Опр.Количество = КоличествоТовара;

// Для валютного учета
Опр.Валюта = ВалютаРасчетов;
Опр.ВалСумма = СуммаВВалюте;

Рекомендуемые архитектурные решения

Поскольку прямое добавление проводок к документу несет в себе риск их потери при перепроведении, рассмотрим более надежные альтернативные варианты реализации:

  1. Модификация модуля проведения документа. Добавим в процедуру ОбработкаПроведения проверку специального условия или дополнительного реквизита документа, на основании которого нужные проводки будут формироваться штатным образом.
  2. Использование флага ручной корректировки. Добавим в реквизиты шапки документа признак РучнаяКорректировка. В процедуре ОбработкаПроведения пропишем условие: если признак активен, типовой алгоритм очистки и формирования проводок пропускается, сохраняя пользовательские движения.
  3. Формирование отдельного документа «Операция» (бухгалтерская справка). Вместо вмешательства в движения первичного документа создадим независимый типовой документ Операция, указав в его содержании ссылку на исходный первичный документ. Это исключит риски повреждения данных при пересчете итогов.
← На главную