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