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