При разработке механизмов планирования денежных средств или кастомных отчетов в конфигурации «Управление торговлей 10.3» программисты часто сталкиваются с неожиданным поведением системы: документ Возврат товаров от покупателя при наличии указанной сделки (например, Заказ покупателя) не формирует движений в регистре накопления Расчеты с контрагентами. При этом в регистре Взаиморасчеты с контрагентами движения присутствуют. Разберем подробно, почему так происходит, как работает типовой код и как правильно учитывать возвраты в управленческом учете.
Проанализируем программный код, отвечающий за формирование движений. В модулях документов, использующих механизм расчетов, часто вызывается процедура или функция (например, ПодготовитьТаблицуПоРасчетам), в которой присутствует жесткий фильтр. Рассмотрим фрагмент кода, который вызывает вопросы у разработчиков:
Для Каждого СтрокаТаблицы Из ТаблицаПоРасчетам Цикл
// Условие определяет, должно ли быть движение по оперативному регистру расчетов
ДолжноБытьДвижениеПоРасчетам = НЕ ЗначениеЗаполнено(строкаТаблицы.Сделка)
ИЛИ (ТипЗнч(СтрокаТаблицы.Сделка) <> Тип("ДокументСсылка.ЗаказПокупателя")
И ТипЗнч(СтрокаТаблицы.Сделка) <> Тип("ДокументСсылка.ЗаказПоставщику"));
Если НЕ ДолжноБытьДвижениеПоРасчетам Тогда
УдаляемыеСтроки.Добавить(СтрокаТаблицы);
КонецЕсли;
КонецЦикла;
Как мы видим, система намеренно удаляет строки из таблицы движений, если в качестве сделки указан Заказ покупателя или Заказ поставщику. Это не ошибка программистов 1С, а заложенная методология. Выясним причину такого разделения.
Для понимания логики решения задачи необходимо четко разделять назначение двух ключевых регистров системы:
Возврат товаров от покупателя обязан делать здесь движения, так как фактический долг покупателя уменьшается (или возникает долг организации перед ним).Важный нюанс: В методологии УТ 10.3 Заказ покупателя — это намерение. Реализация товаров и услуг — выполнение. А Возврат рассматривается как сторнирующее событие для реализации, но не как «отрицательный заказ».
Рассмотрим ситуацию подробнее. Если бы возврат делал движения по аналитике Заказ покупателя в регистре Расчеты с контрагентами, это бы нарушило строгую цепочку «Заказ — Оплата — Отгрузка». В системе возникла бы ситуация, когда по заказу числится переплата или некорректный остаток к оплате, который не предусмотрен стандартным жизненным циклом заказа.
С точки зрения системы, возврат по заказу переводит задолженность (или аванс) в категорию общего долга по договору. Эти деньги «освобождаются» от привязки к конкретному заказу, чтобы их можно было легко перезачесть на другой заказ того же контрагента с помощью документа Корректировка долга.
Если перед нами стоит задача программно создать документ Планирование поступления денежных средств и нам нужно учитывать возвраты, проанализируем следующие варианты решения:
Поскольку регистр Взаиморасчеты с контрагентами всегда содержит актуальную информацию о сальдо, для планирования поступлений правильнее использовать именно его или комбинацию двух регистров. Рассмотрим алгоритм:
Расчеты с контрагентами (планируемые поступления по заказам).Взаиморасчеты с контрагентами.Проанализируем ситуацию, когда нужно видеть возвраты именно в контексте заказов. В этом случае в алгоритм сбора данных для планирования стоит добавить отдельный запрос к документам Возврат товаров от покупателя за период. Мы отбираем документы, где заполнена аналитика Сделка, и уменьшаем на эту сумму ожидаемое поступление по соответствующему заказу «на лету» в коде обработки.
Если бизнес-процесс требует, чтобы возврат «схлопывал» задолженность по конкретному заказу и это отражалось в стандартных отчетах по оплате заказов, необходимо использовать документ Корректировка долга с видом операции Взаимозачет. Рассмотрим шаги:
Возврат товаров от покупателя. Он уменьшает общий долг по договору (регистр Взаиморасчеты).Корректировку долга, где в качестве дебиторской задолженности указываем наш Заказ покупателя, а в качестве кредиторской — документ возврата (или аванс, возникший из-за возврата).Расчеты с контрагентами обновится, и сумма к оплате по заказу уменьшится.Не рекомендуется удалять проверку в типовом коде функции ПодготовитьТаблицуПоРасчетам. Это может привести к непредсказуемым последствиям в работе механизмов закрытия заказов и распределения платежей. Проанализируем риски: изменение этого условия заставит систему считать возврат полноценным платежом по заказу, что может «запутать» алгоритмы расчета авансов при последующих отгрузках.
Лучшим подходом будет адаптация вашего кода планирования под архитектуру УТ 10.3, учитывая, что информация о возвратах хранится в финансовых взаиморасчетах, а оперативные расчеты по заказам — это лишь одна из составляющих общего баланса с контрагентом.