Почему Возврат товаров от покупателя в УТ 10.3 не делает движений по регистру Расчеты с контрагентами?

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

При разработке механизмов планирования денежных средств или кастомных отчетов в конфигурации «Управление торговлей 10.3» программисты часто сталкиваются с неожиданным поведением системы: документ Возврат товаров от покупателя при наличии указанной сделки (например, Заказ покупателя) не формирует движений в регистре накопления Расчеты с контрагентами. При этом в регистре Взаиморасчеты с контрагентами движения присутствуют. Разберем подробно, почему так происходит, как работает типовой код и как правильно учитывать возвраты в управленческом учете.

Анализ типового кода и причины поведения системы

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


Для Каждого СтрокаТаблицы Из ТаблицаПоРасчетам Цикл
    // Условие определяет, должно ли быть движение по оперативному регистру расчетов
    ДолжноБытьДвижениеПоРасчетам = НЕ ЗначениеЗаполнено(строкаТаблицы.Сделка) 
        ИЛИ (ТипЗнч(СтрокаТаблицы.Сделка) <> Тип("ДокументСсылка.ЗаказПокупателя") 
        И ТипЗнч(СтрокаТаблицы.Сделка) <> Тип("ДокументСсылка.ЗаказПоставщику"));

    Если НЕ ДолжноБытьДвижениеПоРасчетам Тогда
        УдаляемыеСтроки.Добавить(СтрокаТаблицы);
    КонецЕсли;
КонецЦикла;

Как мы видим, система намеренно удаляет строки из таблицы движений, если в качестве сделки указан Заказ покупателя или Заказ поставщику. Это не ошибка программистов 1С, а заложенная методология. Выясним причину такого разделения.

Различие между регистрами Взаиморасчеты и Расчеты

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

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

Важный нюанс: В методологии УТ 10.3 Заказ покупателя — это намерение. Реализация товаров и услуг — выполнение. А Возврат рассматривается как сторнирующее событие для реализации, но не как «отрицательный заказ».

Почему Возврат игнорирует Заказы в регистре Расчеты?

Рассмотрим ситуацию подробнее. Если бы возврат делал движения по аналитике Заказ покупателя в регистре Расчеты с контрагентами, это бы нарушило строгую цепочку «Заказ — Оплата — Отгрузка». В системе возникла бы ситуация, когда по заказу числится переплата или некорректный остаток к оплате, который не предусмотрен стандартным жизненным циклом заказа.

С точки зрения системы, возврат по заказу переводит задолженность (или аванс) в категорию общего долга по договору. Эти деньги «освобождаются» от привязки к конкретному заказу, чтобы их можно было легко перезачесть на другой заказ того же контрагента с помощью документа Корректировка долга.

Как решить проблему при планировании денежных средств

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

Вариант 1: Использование данных регистра Взаиморасчеты

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

  1. Получаем остатки по Расчеты с контрагентами (планируемые поступления по заказам).
  2. Вычитаем из них кредиторскую задолженность перед клиентом из регистра Взаиморасчеты с контрагентами.
  3. Таким образом, мы получим чистую сумму, которую клиент действительно должен доплатить, с учетом всех возвратов.

Вариант 2: Прямой запрос по документам возврата

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

Вариант 3: Использование Корректировки долга

Если бизнес-процесс требует, чтобы возврат «схлопывал» задолженность по конкретному заказу и это отражалось в стандартных отчетах по оплате заказов, необходимо использовать документ Корректировка долга с видом операции Взаимозачет. Рассмотрим шаги:

  1. Проводим Возврат товаров от покупателя. Он уменьшает общий долг по договору (регистр Взаиморасчеты).
  2. Создаем Корректировку долга, где в качестве дебиторской задолженности указываем наш Заказ покупателя, а в качестве кредиторской — документ возврата (или аванс, возникший из-за возврата).
  3. После проведения корректировки, регистр Расчеты с контрагентами обновится, и сумма к оплате по заказу уменьшится.

Рекомендации для разработчиков

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

Лучшим подходом будет адаптация вашего кода планирования под архитектуру УТ 10.3, учитывая, что информация о возвратах хранится в финансовых взаиморасчетах, а оперативные расчеты по заказам — это лишь одна из составляющих общего баланса с контрагентом.

← На главную