При работе в 1С:ERP Управление предприятием 2.4 бухгалтеры часто сталкиваются с ситуацией, когда при загрузке банковских выписок через клиент-банк система автоматически подставляет в поле «Объект расчетов» конкретный заказ или документ поступления вместо основного договора. Это происходит даже в тех случаях, когда в договоре явно указана детализация расчетов «По договорам». В результате в оборотно-сальдовой ведомости (ОСВ) авансы могут не закрываться автоматически, так как оплата «висит» на заказе, а накладная — на договоре.
В этой статье мы подробно разберем, как работает внутренний алгоритм 1С:ERP, почему программа делает такой выбор и как можно повлиять на этот процесс, чтобы в документах всегда фигурировал договор.
Для начала разберем программную логику, которая заложена в типовое решение. Система 1С:ERP при загрузке выписок не просто «гадает», какой документ выбрать. Она следует строгому приоритету. Если вы хотите понять, где именно в конфигураторе скрыта эта логика, обратите внимание на следующие точки входа:
КлиентБанк, а именно метод ПодготовитьСтрокиВыписки. Именно здесь начинается первичная обработка входящих данных из текстового файла выписки.ВзаиморасчетыСервер, функция ПолучитьТекстЗапросаДокументыРасчетовСКлиентами. Здесь формируются запросы, определяющие, какие документы задолженности «подходят» под сумму платежа.Рассмотрим пример кода, который отвечает за поиск договора по банковским счетам:
// Поиск договора по банковским счетам организации и контрагента
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 2
| ДанныеДоговора.Ссылка КАК Ссылка,
| ДанныеДоговора.ТипДоговора КАК ТипДоговора,
| ДанныеДоговора.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДанныеДоговора
|ГДЕ
| ДанныеДоговора.БанковскийСчет = &БанковскийСчет
| И ДанныеДоговора.Контрагент = &Контрагент
| И ДанныеДоговора.БанковскийСчетКонтрагента = &БанковскийСчетКонтрагента
| И ДанныеДоговора.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДоговоровКонтрагентов.Действует)";
Проанализируем эту ситуацию: если у вас с контрагентом заключено несколько договоров, программа попытается найти тот, в котором указаны конкретные банковские счета (ваш и клиента). Если такой договор один — он будет подставлен. Если их несколько или ни одного подходящего по счетам, система перейдет к поиску по документам расчетов.
Когда система не находит однозначного договора, она прибегает к распределению суммы по имеющимся остаткам задолженности. Посмотрим на фрагмент кода, описывающий этот механизм:
Если ПроводитьДокументы И РаспределяемаяСумма > 0 Тогда
// Подбор объектов расчетов по остаткам
Для Каждого СтрокаТаблицы Из ТаблицаОстатковРасчетов Цикл
Если ЗначениеЗаполнено(СтрокаТаблицы.Заказ) Тогда
// Заполнение расшифровки платежа заказом
СтрокаРасшифровки = ДокументОбъект.РасшифровкаПлатежа.Добавить;
СуммаСтроки = Мин(РаспределяемаяСумма, СтрокаТаблицы.Сумма);
РаспределяемаяСумма = РаспределяемаяСумма - СтрокаТаблицы.Сумма;
// ... заполнение свойств ...
КонецЕсли;
КонецЦикла;
КонецЕсли;
Из этого следует важный вывод: программе проще найти конкретный заказ по сумме и взять из него условия, чем пытаться определить правильный договор из множества существующих. Если сумма платежа в точности совпадает с суммой заказа, алгоритм посчитает это «точным попаданием» и подставит заказ в объект расчетов.
Чтобы минимизировать подстановку заказов и накладных, мы рекомендуем выполнить следующие настройки:
НСИ и администрирование — Казначейство. Обратите внимание на настройки автоматического подбора. В ряде релизов ERP можно ограничить глубину поиска документов расчетов.Важно понимать разницу между тем, что мы видим в документе, и тем, как данные ложатся в регистры. Рассмотрим ситуацию подробнее:
Ситуация: В документе Поступление безналичных денежных средств в поле объект расчетов указан «Заказ», но в самом заказе стоит расчет «По договору».
В этом случае в проводках (Дт 51 — Кт 62) может не отображаться заказ, так как 1С:ERP сворачивает аналитику до договора при проведении, но только после выполнения регламентного задания по расчету взаиморасчетов. Если у вас включен режим «Оффлайн-расчетов», то реальную картину в ОСВ вы увидите только после запуска обработки «Задания к расчету взаиморасчетов» или закрытия месяца.
Если же вы обнаружили, что авансы не закрываются, это означает, что аналитика объекта расчетов в платеже и в документе реализации (поступления) различается. Для системы «Договор №1» и «Заказ №5» — это разные аналитические разрезы (разные «корзины»), даже если заказ относится к этому договору. Для исправления такой ситуации без изменения кода необходимо использовать документ Взаимозачет задолженности.
Выясним причину «безобразия», как выразился автор вопроса: это не ошибка программы, а работа встроенной системы приоритетов. Чтобы договор подставлялся автоматически: