Почему в 1С:Управление торговлей 11 не подставляется договор при загрузке банковской выписки?

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

При работе с программными продуктами на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11, ERP 2 или Комплексная автоматизация 2, бухгалтеры и операторы казначейства часто сталкиваются с ситуацией, когда при импорте выписок из клиент-банка документ Поступление безналичных денежных средств заполняется частично. Самая частая проблема — пустое поле Договор, даже если у контрагента всего один действующий договор. Рассмотрим подробно, почему так происходит, и разберем алгоритмы, которые система использует для автоматического сопоставления данных.

Анализируем настройки Казначейства и Соглашений

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

  1. Проверим функциональную опцию Договоры с клиентами в разделе НСИ и администрирование. Если ведение договоров включено, система всегда будет искать конкретный объект в справочнике ДоговорыКонтрагентов.
  2. Проанализируем настройки конкретного Соглашения. Если в соглашении с клиентом установлен флаг Требуется указание договора, то система будет обязана найти договор. Однако, если система не может однозначно определить соглашение (например, их несколько или не указано основное), она может "растеряться" и не подставить связанный с ним договор.
  3. Проверим статус договора. Проанализируем поле Статус в карточке договора. Если договор находится в состоянии Закрыт или На согласовании, алгоритм загрузки выписки проигнорирует его, считая недействительным для совершения новых платежей.

Разбираем алгоритм поиска по Назначению платежа

Выясним причину, по которой 1С игнорирует историю платежей. Основной приоритет для системы имеет текстовое поле Назначение платежа в файле загрузки (обычно это формат kl_to_1c.txt). Рассмотрим, как работает встроенный парсер текста:

Система ищет в тексте ключевые слова, такие как "договор", "дог.", "контракт", "№" или "от". Если в тексте указано "Оплата по договору №123", программа попытается найти договор, у которого номер точно совпадает со строкой "123". Обратим внимание на префиксы: если в базе договор записан как "УТ-000123", а клиент указал просто "123", сопоставление может не сработать без дополнительных настроек префиксации.

Также система анализирует упоминание счетов. Если в назначении указано "Счет №...", 1С сначала ищет документ Счет на оплату. Если счет найден, договор подтягивается автоматически из этого документа. Если же в тексте каша из цифр (сумма НДС, номер акта, номер накладной), алгоритм может ошибочно принять номер накладной за номер договора и, не найдя совпадений, оставить поле пустым. Для стандартизации формулировок при выставлении счетов можно использовать расширение для автозаполнения назначения платежа в заказе клиента.

Влияние варианта ведения взаиморасчетов

Посмотрим на настройки внутри самого договора. В 1С:УТ 11 существует несколько вариантов ведения взаиморасчетов, и это критически важно для автоматической подстановки:

Рассмотрим ситуацию: если у вас настроено ФИФО по договору, но в самом документе Поступление безналичных ДС не заполнено основание, система не сможет корректно отразить расчеты в управленческом учете. Бухгалтеру приходится вручную заполнять Основание платежа, чтобы "взбодрить" регистры накопления.

Технические нюансы: дубли, счета и ИНН

Проанализируем ситуацию с точки зрения данных. Алгоритм распознавания по аналогии (копирование из предыдущих платежей) работает на основе связки ИНН + КПП + Номер счета контрагента. Если клиент открыл новый расчетный счет и платит с него впервые, система не подставит договор автоматически, даже если этот клиент платит вам уже 10 лет. Она воспримет это как новую, неопределенную ситуацию.

Также стоит проверить наличие "невидимых" договоров. Например, если у контрагента есть один договор с типом С покупателем и один случайный договор с типом С поставщиком, система увидит два объекта и, согласно логике безопасности данных, очистит поле, чтобы исключить риск ошибочного отнесения денег на неверный вид деятельности.

Где копать программисту: программный код

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


// Пример логики поиска единственного договора
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ДоговорыКонтрагентов.Ссылка КАК Договор
               |ИЗ
               |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
               |ГДЕ
               |    ДоговорыКонтрагентов.Владелец = &Контрагент
               |    И ДоговорыКонтрагентов.Организация = &Организация
               |    И ДоговорыКонтрагентов.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДоговоровКонтрагентов.Действует)
               |    И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ";

Запрос.УстановитьПараметр("Контрагент", ПараметрыПоиска.Контрагент);
Запрос.УстановитьПараметр("Организация", ПараметрыПоиска.Организация);

Результат = Запрос.Выполнить().Выгрузить();

Если Результат.Количество() = 1 Тогда
    ОбъектЗагрузки.Договор = Результат[0].Договор;
Иначе
    // Если найдено 0 или более 1 договора, поле остается пустым для ручного выбора
    ОбъектЗагрузки.Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
КонецЕсли;

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

Рекомендации по исправлению

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

  1. Проверьте банковские счета: Убедитесь, что в карточке договора на вкладке "Расчетные счета" не указан конкретный счет, отличный от того, с которого пришел платеж. Если там пусто — это лучше для автоматики.
  2. Единственность договора: Убедитесь, что для данной пары Организация — Контрагент нет старых, забытых договоров в статусе "Действует".
  3. Настройка DirectBank: По возможности перейдите на технологию DirectBank. Она передает данные в формате XML с четко структурированными полями, что значительно повышает точность распознавания по сравнению с текстовыми файлами DOS/Windows кодировки.
  4. Шаблоны назначений: Попросите клиентов указывать номер договора в начале строки назначения платежа. Это значительно упрощает работу регулярных выражений внутри 1С.

Таким образом, отсутствие договора — это не всегда ошибка программы, часто это защитный механизм, предотвращающий некорректное распределение денежных средств в условиях неопределенности данных.

← На главную