Почему оплата в УТ 11.4 ложится на предоплату при наличии долга и как найти код формирования движений

Программист Управленческий учет Торговля и дистрибуция
← На главную

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

Архитектура «Онлайн-взаиморасчетов»: где искать движения

Начиная с версии 11.4.6, в УТ реализован механизм так называемых онлайн-взаиморасчетов. Главная особенность здесь в том, что расчеты разделены на два уровня: оперативные и детализированные. Рассмотрим, как это работает по шагам.

  1. Регистр «Расчеты с клиентами» — здесь отражаются общие данные. Записи сюда формируются привычным способом через модуль проведения.
  2. Регистр «Расчеты с клиентами по документам» — именно здесь хранится детальная информация о том, является ли сумма долгом или предоплатой. Но записи в него делает не сам документ оплаты напрямую.
  3. Очередь распределения — в момент проведения документа оплаты система фиксирует необходимость пересчета в специальном служебном регистре сведений ОчередьРаспределенияРасчетов.

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

Как отладить формирование движений и поймать фоновое задание

Если система работает в режиме фонового распределения, точка останова в модуле набора записей регистра просто не сработает в вашем сеансе. Чтобы «победить» эту проблему, разберем методику настройки отладки.

Для того чтобы фоновое задание выполнилось в вашем основном потоке, необходимо запустить конфигурацию 1С с параметром /РежимОтладки. Это заставит систему выполнять задачи распределения взаиморасчетов синхронно, и вы сможете попасть внутрь кода распределения.

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


// Пример логики, скрытой в недрах системы
Если ПараметрыПроведения.Свойство("ВыполнитьРаспределениеРасчетов") Тогда
    РасчетыСКлиентамиУзелПроведения.ВыполнитьРаспределениеРасчетов(Ссылка);
КонецЕсли;

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

Основные причины, по которым оплата уходит на предоплату

Даже если технически код работает верно, методологические ошибки в данных могут приводить к тому, что оплата не «видит» долг. Рассмотрим самые частые ситуации.

1. Несовпадение «Объекта расчетов»

В УТ 11 ключевым разрезом учета является Объект расчетов. Это может быть договор, заказ или сама реализация. Разберем пример: если в документе РеализацияТоваровУслуг объектом расчетов выступает «Договор», а в платежном поручении вы вручную выбрали «Заказ», система воспримет это как две разные цепочки взаимоотношений. Для нее это будет долг по одному объекту и аванс по другому. Важно: всегда проверяйте, чтобы в обоих документах объект расчетов был идентичен.

2. Настройки детализации в договоре

Проанализируем настройки договора с клиентом. Если в договоре указана детализация «По заказам», а реализация проведена без заказа, система может не зачесть оплату автоматически, даже если вы укажете накладную в расшифровке платежа. Движок распределения будет строго следовать правилам, заданным в договоре.

3. Ошибка времени документа

Классическая ситуация в 1С: оплата и отгрузка созданы в одну и ту же секунду. Если ПоступлениеБезналичныхДС оказалось в последовательности по времени (хотя бы на миллисекунду) раньше, чем РеализацияТоваровУслуг, то на момент проведения оплаты долга еще не существовало. Система законно фиксирует предоплату. Попробуйте сместить время оплаты на 1-2 минуты позже реализации и перепровести документы.

4. Служебный регистр очереди распределения

Иногда распределение просто «зависает». Проверьте регистр сведений ОчередьРаспределенияРасчетов. Если в нем накопилось много записей по данному контрагенту, значит, фоновое задание не справляется или возникла ошибка. Пока очередь не будет обработана, движения в регистре «по документам» не обновятся и будут показывать неактуальную информацию (предоплату).

Как исправить ситуацию без программирования

Если вы убедились, что в коде ошибок нет, воспользуйтесь следующими инструментами:

Резюме: Чтобы «победить беду» с предоплатой, нужно не искать код в модуле документа, а проверить настройки Объекта расчетов и убедиться, что Очередь распределения расчетов пуста, а фоновые задания выполняются корректно. Использование /РежимОтладки поможет вам заглянуть внутрь движка распределения, если типовые средства диагностики не помогли.

← На главную