Как работает распознавание договора при загрузке банковской выписки в 1С:Бухгалтерия 3.0 и как его настроить?

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

При регулярной загрузке банковских выписок в программе «1С:Бухгалтерия предприятия 3.0» пользователи часто сталкиваются с ситуацией, когда программа автоматически выбирает не тот договор или случайным образом подставляет один из имеющихся договоров контрагента. Разберем, как именно устроен типовой алгоритм сопоставления договоров, почему назначение платежа может игнорироваться и как корректно доработать механизм распознавания под свои задачи.

Как работает типовой алгоритм поиска договора при загрузке выписки

В стандартном формате обмена с банком («Клиент-банк») отсутствует отдельное поле для передачи реквизитов договора. Вся сопутствующая информация передается единым неформализованным текстом в реквизите «Назначение платежа». В типовой конфигурации подстановка договора происходит по следующей цепочке приоритетов:

  1. Поиск по документу «Счет на оплату»: программа анализирует текстовую строку назначения платежа регулярными выражениями исключительно для поиска номера и даты счета на оплату покупателю или счета от поставщика. Если счет найден, договор заполняется из этого счета.
  2. Проверка основного договора: если счет не определен, программа обращается к справочнику ДоговорыКонтрагентов и проверяет наличие договора, помеченного как основной (с учетом валюты расчетов и вида операции).
  3. Единственный подходящий договор: если признак основного договора не установлен, но у найденного контрагента заведен ровно один договор нужного вида (например, «С покупателем»), выбирается именно он.
  4. Случайная подстановка (первый по выборке): если у контрагента заведено несколько действующих договоров одного вида и ни один из них не назначен основным, система автоматически выбирает первый попавшийся элемент из базы данных. Типовой механизм не выполняет полнотекстовый поиск номера договора по назначению платежа.
  5. Автоматическое создание: если у контрагента нет ни одного подходящего договора и в настройках загрузки выписки включена соответствующая опция, система автоматически создает элемент с наименованием «Основной договор».

Таким образом, если контрагент найден и у него есть хотя бы один договор подходящего вида, ситуация «Договор не заполнен» в типовом поведении не возникнет — программа обязательно подставит какой-либо договор, даже если в назначении платежа указан совершенно другой номер.

Проблема ложных срабатываний и случайного выбора

Автоматическая подстановка первого попавшегося договора часто приводит к пересортице по счетам расчетов (60, 62, 76) и искажению актов сверки. При этом прямая попытка искать совпадение номера договора методом проверки вхождения подстроки может вызвать ряд побочных эффектов:

  1. Короткие номера: если номер договора состоит из одной или двух цифр (например, «1», «5», «12»), обычный поиск подстроки будет ошибочно срабатывать на датах, суммах НДС, номерах платежных поручений и КПП.
  2. Разнообразие формулировок: плательщики указывают реквизиты в произвольной форме («по дог. №», «согласно договору», «дог-р от...», без указания номера вовсе).

Доработка механизма распознавания через расширение конфигурации

Чтобы избежать неверной автоматической подстановки, оптимально реализовать алгоритм сопоставления в расширении конфигурации. Для этого перехватывается процедура постобработки загруженных строк выписки.

Разберем логику правильного сопоставления по шагам:

  1. Проверяем, был ли определен счет на оплату. Если счет найден, оставляем договор из счета.
  2. Если счет не найден, нормализуем строку назначения платежа (удаляем лишние знаки препинания, переводим в нижний регистр).
  3. С помощью регулярных выражений выделяем из текста предполагаемый номер договора.
  4. Ищем точное совпадение номера среди действующих договоров данного контрагента.
  5. Применяем правило безопасного отказа: если соответствие не найдено или найдено несколько подходящих договоров, принудительно очищаем реквизит ДоговорКонтрагента (устанавливаем значение Справочники.ДоговорыКонтрагентов.ПустаяСсылка()).

Посмотрим на пример реализации функции поиска договора по назначению платежа:


&НаСервере
Функция НайтиДоговорПоНазначениюПлатежа(Контрагент, Организация, ВидДоговора, НазначениеПлатежа)
    
    Если Не ЗначениеЗаполнено(Контрагент) Или ПустаяСтрока(НазначениеПлатежа) Тогда
        Возврат Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    КонецЕсли;
    
    // Получаем все действующие договоры контрагента нужного вида
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Договоры.Ссылка КАК Ссылка,
        |	Договоры.Номер КАК Номер
        |ИЗ
        |	Справочник.ДоговорыКонтрагентов КАК Договоры
        |ГДЕ
        |	Договоры.Владелец = &Контрагент
        |	И Договоры.Организация = &Организация
        |	И Договоры.ВидДоговора = &ВидДоговора
        |	И НЕ Договоры.ПометкаУдаления";
        
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("ВидДоговора", ВидДоговора);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    НайденныйДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    КоличествоСовпадений = 0;
    
    Пока Выборка.Следующий() Цикл
        НомерДоговора = СокрЛП(Выборка.Номер);
        
        // Исключаем пустые и слишком короткие номера для предотвращения ложных срабатываний
        Если СтрДлина(НомерДоговора) < 3 Тогда
            Продолжить;
        КонецЕсли;
        
        // Проверяем вхождение номера договора в строку назначения платежа
        Если СтрНайти(ВРег(НазначениеПлатежа), ВРег(НомерДоговора)) > 0 Тогда
            НайденныйДоговор = Выборка.Ссылка;
            КоличествоСовпадений = КоличествоСовпадений + 1;
        КонецЕсли;
    КонецЦикла;
    
    // Если найдено ровно одно соответствие - возвращаем договор, иначе пустую ссылку
    Если КоличествоСовпадений = 1 Тогда
        Возврат НайденныйДоговор;
    Иначе
        Возврат Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    КонецЕсли;
    
КонецФункции

Преимущества очистки договора при отсутствии совпадений

Когда при отсутствии точного совпадения реквизит ДоговорКонтрагента принудительно очищается, документ банковской выписки не может быть проведен автоматически. В форме банковских выписок такая строка подсвечивается маркером ошибки.

Это исключает человеческий фактор: бухгалтер сразу видит незаполненный документ и вручную выбирает корректный договор, что предотвращает появление скрытых ошибок в учете и пересортицы на счетах взаиморасчетов.

Организационные способы минимизации ошибок

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

  1. Выставление счетов: мотивировать покупателей указывать в назначении платежа номер счета (например, «Оплата по счету № 123 от 10.05.2024»). Этот реквизит типовая конфигурация считывает корректно.
  2. Актуализация основного договора: если с контрагентом ведется работа преимущественно по одному долгосрочному соглашению, необходимо открыть карточку контрагента и явно назначить нужный договор основным.
  3. Отключение автопроведения: в форме загрузки банковской выписки снять флаг автоматического проведения документов после загрузки, чтобы перед проведением выполнять визуальный контроль заполненных реквизитов.
← На главную