При работе с программными продуктами на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11, ERP 2 или Комплексная автоматизация 2, бухгалтеры и операторы казначейства часто сталкиваются с ситуацией, когда при импорте выписок из клиент-банка документ Поступление безналичных денежных средств заполняется частично. Самая частая проблема — пустое поле Договор, даже если у контрагента всего один действующий договор. Рассмотрим подробно, почему так происходит, и разберем алгоритмы, которые система использует для автоматического сопоставления данных.
Прежде чем погружаться в программный код, нам необходимо проанализировать функциональные опции системы. В УТ 11 логика работы с договорами неразрывно связана с использованием Соглашений с клиентами. Разберем пошагово, какие настройки влияют на результат:
Договоры с клиентами в разделе НСИ и администрирование. Если ведение договоров включено, система всегда будет искать конкретный объект в справочнике ДоговорыКонтрагентов.Статус в карточке договора. Если договор находится в состоянии Закрыт или На согласовании, алгоритм загрузки выписки проигнорирует его, считая недействительным для совершения новых платежей.Выясним причину, по которой 1С игнорирует историю платежей. Основной приоритет для системы имеет текстовое поле Назначение платежа в файле загрузки (обычно это формат kl_to_1c.txt). Рассмотрим, как работает встроенный парсер текста:
Система ищет в тексте ключевые слова, такие как "договор", "дог.", "контракт", "№" или "от". Если в тексте указано "Оплата по договору №123", программа попытается найти договор, у которого номер точно совпадает со строкой "123". Обратим внимание на префиксы: если в базе договор записан как "УТ-000123", а клиент указал просто "123", сопоставление может не сработать без дополнительных настроек префиксации.
Также система анализирует упоминание счетов. Если в назначении указано "Счет №...", 1С сначала ищет документ Счет на оплату. Если счет найден, договор подтягивается автоматически из этого документа. Если же в тексте каша из цифр (сумма НДС, номер акта, номер накладной), алгоритм может ошибочно принять номер накладной за номер договора и, не найдя совпадений, оставить поле пустым. Для стандартизации формулировок при выставлении счетов можно использовать расширение для автозаполнения назначения платежа в заказе клиента.
Посмотрим на настройки внутри самого договора. В 1С:УТ 11 существует несколько вариантов ведения взаиморасчетов, и это критически важно для автоматической подстановки:
Объект расчетов и Договор пустыми, чтобы бухгалтер самостоятельно распределил аванс или оплату.Рассмотрим ситуацию: если у вас настроено ФИФО по договору, но в самом документе Поступление безналичных ДС не заполнено основание, система не сможет корректно отразить расчеты в управленческом учете. Бухгалтеру приходится вручную заполнять Основание платежа, чтобы "взбодрить" регистры накопления.
Проанализируем ситуацию с точки зрения данных. Алгоритм распознавания по аналогии (копирование из предыдущих платежей) работает на основе связки ИНН + КПП + Номер счета контрагента. Если клиент открыл новый расчетный счет и платит с него впервые, система не подставит договор автоматически, даже если этот клиент платит вам уже 10 лет. Она воспримет это как новую, неопределенную ситуацию.
Также стоит проверить наличие "невидимых" договоров. Например, если у контрагента есть один договор с типом С покупателем и один случайный договор с типом С поставщиком, система увидит два объекта и, согласно логике безопасности данных, очистит поле, чтобы исключить риск ошибочного отнесения денег на неверный вид деятельности.
Если стандартные настройки не помогают, нам придется "творчески покопаться" в коде. Основная логика поиска и подстановки данных при загрузке выписки сосредоточена в обработке КлиентБанк и общих модулях, связанных с расчетами. Рассмотрим пример упрощенной логики, которая может находиться в недрах общего модуля РаботаСДоговорамиКонтрагентов:
// Пример логики поиска единственного договора
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка КАК Договор
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &Контрагент
| И ДоговорыКонтрагентов.Организация = &Организация
| И ДоговорыКонтрагентов.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДоговоровКонтрагентов.Действует)
| И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Контрагент", ПараметрыПоиска.Контрагент);
Запрос.УстановитьПараметр("Организация", ПараметрыПоиска.Организация);
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 1 Тогда
ОбъектЗагрузки.Договор = Результат[0].Договор;
Иначе
// Если найдено 0 или более 1 договора, поле остается пустым для ручного выбора
ОбъектЗагрузки.Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
КонецЕсли;
Как мы видим, код намеренно ограничивает автоматизм, если ситуация не является однозначной. Для того чтобы "заставить" систему подставлять единственный договор более агрессивно, программисты часто прибегают к расширениям, переопределяя процедуру ЗаполнитьРеквизитыПоставок или аналогичные методы в модулях загрузки из клиент-банка. В качестве готового решения можно использовать алгоритм автоматического поиска и разнесения заказов при загрузке выписки.
Для решения проблемы рекомендуем выполнить следующие шаги:
Организация — Контрагент нет старых, забытых договоров в статусе "Действует".DirectBank. Она передает данные в формате XML с четко структурированными полями, что значительно повышает точность распознавания по сравнению с текстовыми файлами DOS/Windows кодировки.Таким образом, отсутствие договора — это не всегда ошибка программы, часто это защитный механизм, предотвращающий некорректное распределение денежных средств в условиях неопределенности данных.