Почему при программном создании договора в 1С:КА 2 не подставляется группа финансового учета в проводках?

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

При программном создании договоров контрагентов разработчики часто сталкиваются с неожиданным поведением: в реквизитах договора группа финансового учета (ГФУ) заполнена корректно (например, указан счет 76.05), однако при проведении документов проводки упорно ложатся на стандартный счет 60.01. Если же открыть этот договор интерактивно в пользовательском режиме, вручную перевыбрать ту же самую группу финансового учета и нажать кнопку записи, проводки начинают формироваться правильно. Разберем детально, с чем связано такое поведение и как корректно создавать договоры программно.

Выясним причину: архитектура онлайн-взаиморасчетов

Проанализируем внутреннее устройство типовых конфигураций «1С:Комплексная автоматизация 2» и «1С:ERP Управление предприятием». В современных версиях учет взаиморасчетов и их отражение в бухгалтерском учете строятся через служебный справочник ОбъектыРасчетов.

Механизм отражения документов в регламентированном учете устроен следующим образом:

  1. Система определяет бухгалтерские счета расчетов не напрямую из реквизитов справочника ДоговорыКонтрагентов, а через реквизит ГруппаФинансовогоУчета соответствующего элемента справочника ОбъектыРасчетов.
  2. Каждому договору (при детализации расчетов «По договорам») сопоставляется отдельный элемент справочника ОбъектыРасчетов, где в реквизите Объект хранится ссылка на договор.
  3. Если в сопоставленном элементе справочника ОбъектыРасчетов поле ГФУ не заполнено, система использует стандартные счета расчетов по умолчанию (для поставщика — 60.01 и 60.02 вместо заданного субсчета 76).

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

Почему ошибка возникает при программной записи?

Рассмотрим типичные сценарии, приводящие к расхождению данных:

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

Способ 1. Корректное штатное создание договора без отключения обработчиков

Разберем базовый вариант: если договор создается в рамках штатной логики конфигурации, крайне не рекомендуется использовать режим загрузки. Заполнение реквизитов необходимо выполнять до первой записи объекта.

Посмотрим на пример правильного заполнения и записи договора:


НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Заполнить(Неопределено);

НовыйДоговор.Наименование = "Договор поставки №123";
НовыйДоговор.Организация = ВыбраннаяОрганизация;
НовыйДоговор.Партнер = ВыбранныйПартнер;
НовыйДоговор.Контрагент = ВыбранныйКонтрагент;
НовыйДоговор.ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамКонтрагентов;
НовыйДоговор.ГруппаФинансовогоУчета = НужнаяГФУ; // Например, ГФУ со счетом 76.05

// Записываем БЕЗ ОбменДанными.Загрузка = Истина!
НовыйДоговор.Записать();

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

Способ 2. Программное обновление объекта расчетов

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

Разберем программный код для синхронизации объекта расчетов:


// Создание и запись договора в режиме загрузки
ДоговорОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
ДоговорОбъект.ОбменДанными.Загрузка = Истина;
// Заполнение реквизитов
ДоговорОбъект.Наименование = "Договор аренды №456";
ДоговорОбъект.Организация = ВыбраннаяОрганизация;
ДоговорОбъект.Партнер = ВыбранныйПартнер;
ДоговорОбъект.Контрагент = ВыбранныйКонтрагент;
ДоговорОбъект.ГруппаФинансовогоУчета = НужнаяГФУ;
ДоговорОбъект.Записать();

// Принудительное обновление объекта расчетов через типовой модуль
ОбъектыРасчетовСервер.ОбновитьОбъектРасчетов(ДоговорОбъект.Ссылка);

Процедура ОбновитьОбъектРасчетов модуля ОбъектыРасчетовСервер находит существующий элемент справочника ОбъектыРасчетов или создает новый, перенося в него актуальные реквизиты договора, включая ГруппаФинансовогоУчета.

Способ 3. Прямая перезапись элемента в справочнике «Объекты расчетов»

Если по какой-то причине вызов типовых экспортных процедур недоступен, проанализируем прямой поиск и запись объекта расчетов:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ОбъектыРасчетов.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.ОбъектыРасчетов КАК ОбъектыРасчетов
    |ГДЕ
    |    ОбъектыРасчетов.Объект = &Договор";

Запрос.УстановитьПараметр("Договор", ДоговорСсылка);
Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    
    ОбъектРасчетовОбъект = Выборка.Ссылка.ПолучитьОбъект();
    ОбъектРасчетовОбъект.ГруппаФинансовогоУчета = НужнаяГФУ;
    ОбъектРасчетовОбъект.Записать();
Иначе
    // Если объект расчетов еще не был создан
    ОбъектРасчетовОбъект = Справочники.ОбъектыРасчетов.СоздатьЭлемент();
    ОбъектРасчетовОбъект.Объект = ДоговорСсылка;
    ОбъектРасчетовОбъект.Партнер = ДоговорСсылка.Партнер;
    ОбъектРасчетовОбъект.Контрагент = ДоговорСсылка.Контрагент;
    ОбъектРасчетовОбъект.Организация = ДоговорСсылка.Организация;
    ОбъектРасчетовОбъект.ГруппаФинансовогоУчета = НужнаяГФУ;
    ОбъектРасчетовОбъект.Записать();
КонецЕсли;

Важные методические нюансы и переформирование проводок

Обратим внимание на особенности ведения взаиморасчетов, которые необходимо учитывать:

  1. Детализация расчетов в договоре: ГФУ из договора транслируется в проводки только тогда, когда в договоре установлен порядок расчетов «По договорам контрагентов». Если же выбран порядок «По заказам» или «По расчетным документам», объектом расчетов выступает не сам договор, а документ заказа или накладной. В таких случаях ГФУ должна наследоваться и перезаписываться непосредственно в первичных документах.
  2. Актуализация проводок: После того как вы программно синхронизировали группу финансового учета в объекте расчетов, проводки в уже проведенных документах автоматически не изменятся. Необходимо перепровести связанные документы либо запустить регламентную процедуру через рабочее место «Отражение документов в регл. учете» для переформирования проводок по исправленным объектам расчетов.
← На главную