Как программно пересчитать взаиморасчеты при создании документов в 1С:Комплексная автоматизация 2.5?

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

При переходе на современные версии конфигураций, такие как 1С:ERP Управление предприятием 2.5 или 1С:Комплексная автоматизация 2.5, разработчики часто сталкиваются с проблемой: при программном создании документов реализации (РТУ) или поступлений, данные в регистрах взаиморасчетов заполняются некорректно или не заполняются вовсе. В интерфейсе это выглядит как пустая гиперссылка "Декорация состояния расчетов", которая «оживает» только после ручного перевыбора договора. Разберем подробно, почему так происходит и как правильно решить эту задачу программно, особенно если код выполняется в контексте регламентного задания на сервере.

Анализ архитектуры взаиморасчетов версии 2.5

Проанализируем сначала причины такого поведения системы. В версии 2.5 была внедрена архитектура «Взаиморасчеты онлайн». В отличие от старых версий, где достаточно было заполнить реквизит Договор, в новой архитектуре логика распределения сумм по объектам расчетов стала многослойной. Система оперирует не просто ссылками на договоры, а специальными элементами справочника ОбъектыРасчетов.

Когда мы работаем с документом интерактивно, при выборе договора срабатывают экспортные процедуры в модуле формы, которые инициализируют скрытые параметры. При программном создании (через СоздатьДокумент()) эти обработчики формы не вызываются, поэтому нам необходимо самостоятельно обеспечить вызов серверных процедур из модулей объекта или общих модулей.

Шаг 1: Проверка ключевых реквизитов шапки

Рассмотрим ситуацию, описанную в обсуждении: автор обнаружил, что в коде принудительно устанавливался неверный порядок расчетов. Это критическая точка. Выясним, какие реквизиты должны быть заполнены в первую очередь:

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

Шаг 2: Работа со скрытой табличной частью Взаиморасчеты

Проанализируем структуру документа РеализацияТоваровУслуг. В нем существует скрытая табличная часть Взаиморасчеты. Именно она является источником данных для движений по регистрам накопления РасчетыСКлиентамиПоСрокам и РасчетыСКлиентами. Если эта таблица пуста, то даже при наличии заполненного договора в шапке, «Декорация состояния расчетов» не будет отображать корректную информацию.

При программном заполнении нам необходимо принудительно вызвать процедуры, которые «прочитают» данные договора и заполнят эту ТЧ. Посмотрим на пример того, как это должно выглядеть в коде:


// Установка договора и связанных параметров
НовыйДокумент.Договор = СсылкаНаДоговор;
НовыйДокумент.ПорядокРасчетов = СсылкаНаДоговор.ПорядокРасчетов;
НовыйДокумент.ГруппаФинансовогоУчета = СсылкаНаДоговор.ГруппаФинансовогоУчета;

// Важно вызвать процедуру заполнения объекта расчетов
НовыйДокумент.ЗаполнитьРеквизитыОбъектаРасчетов();

Шаг 3: Использование общих модулей для пересчета

Поскольку мы не можем обратиться к форме в регламентном задании, нам нужно использовать методы, доступные на сервере. В 1С:ERP/КА 2.5 для этих целей выделены специальные общие модули. Выясним, какие методы помогут нам программно эмулировать интерактивные действия пользователя:

Во-первых, стоит обратить внимание на модуль РасчетыСКлиентамиЗаполнение. Рассмотрим основные функции:

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


ДокОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// ... Заполнение товаров и контрагента ...

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

// Используем типовой механизм для инициализации расчетов
РасчетыСКлиентамиЗаполнение.ЗаполнитьОбъектРасчетов(ДокОбъект);
РасчетыСКлиентамиЗаполнение.ЗаполнитьВзаиморасчеты(ДокОбъект);

// Перед записью убеждаемся, что сумма по ТЧ Взаиморасчеты совпадает с суммой документа
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Шаг 4: Отладка через сравнение версий

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

  1. Включаем версионирование для документа "Реализация товаров и услуг".
  2. Создаем документ программно вашим кодом и записываем его. Это создаст первую версию.
  3. Открываем этот же документ в интерфейсе, вручную перевыбираем договор (чтобы всё рассчиталось правильно) и нажимаем "Записать". Это создаст вторую версию.
  4. Используем стандартный отчет "История изменений" и нажимаем кнопку "Сравнить".

Внимательно изучим результат сравнения. Как правило, вы увидите различия в табличной части Взаиморасчеты или в реквизите ОбъектРасчетов, который может иметь тип СправочникСсылка.ОбъектыРасчетов. Часто оказывается, что программно был заполнен договор, но не был инициализирован сам элемент справочника объектов расчетов, связанный с этим договором.

Рекомендации по заполнению ГФУ и Порядка расчетов

Важно помнить, что в 1С 8.3 Комплексная автоматизация 2.5 многие реквизиты зависят друг от друга. Проанализируем типичную ошибку: при переносе данных из версии 7.7 или 1С:Бухгалтерии программисты забывают, что ПорядокРасчетов в документе может отличаться от договора, но система ожидает их синхронизации для корректного проведения. Если вы создаете 200 000 накладных, любая ошибка в этом реквизите приведет к тому, что задолженность не распределится по срокам оплаты.

Всегда проверяйте соответствие:

НовыйДокумент.ПорядокРасчетов = НовыйДокумент.Договор.ПорядокРасчетов;

И обязательно заполняйте ГруппаФинансовогоУчета, так как именно она "сообщает" системе, является ли этот расчет расчетом с покупателем, поставщиком или прочим контрагентом. В современных конфигурациях без ГФУ проводки по счетам 60/62 могут просто не сформироваться, несмотря на успешное проведение документа по регистрам накопления.

Итоги

Для успешного программного создания документов с корректными взаиморасчетами в КА 2.5 необходимо:

Использование этих правил позволит избежать ручной обработки документов и обеспечит корректность управленческого и бухгалтерского учета при массовой загрузке данных.

← На главную