В процессе регулярного обмена с банком при загрузке входящих банковских выписок многие разработчики сталкиваются с ситуацией, когда типовой механизм сопоставления контрагентов ведет себя некорректно из-за проверки КПП. Например, банк передает пустой КПП, заполняет его нулями или указывает реквизиты филиала, в то время как в информационной базе контрагент заведен с реквизитами головной организации. В старых редакциях конфигурации задача решалась простой правкой текста запроса в обработке Клиент-Банк, однако в современных версиях «1С:Бухгалтерии предприятия 3.0» архитектура механизма кардинально изменилась. Разберем по шагам, где именно выполняется поиск участников операций, почему отладчик не останавливается на точках останова и как программно исключить КПП из алгоритма сопоставления.
Проанализируем современную архитектуру загрузки выписки. Код сопоставления больше не находится внутри формы или модуля объекта обработки КлиентБанк. Вся обработка разделена на специализированные общие модули:
ЗагрузкаВыпискиПоБанковскомуСчету — выполняет чтение текстового файла выгрузки банка, организует вызов фонового процесса анализа и управляет заполнением распознанных данных.ИдентификацияУчастниковБанковскихОпераций — формирует структуры ключевых идентификаторов (ИНН, КПП, банковский счет, БИК) и выполняет пакетные запросы к информационной базе для поиска элементов справочников Контрагенты и БанковскиеСчета.Поиск и предварительное распознавание контрагентов происходят непосредственно в момент выбора файла выписки еще до фактического создания документов. При этом система формирует таблицу идентификаторов, пытаясь последовательно найти совпадения по связкам реквизитов.
Очень частая проблема, с которой сталкиваются разработчики при попытке проследовать алгоритм по шагам: точка останова установлена в процедуре общего модуля, но выполнение программы в нее не попадает. Выясним причину такого поведения платформы.
Чтение и сопоставление данных выписки вынесены в длительную операцию, которая запускается в фоновом задании на стороне сервера 1С:Предприятия. Если среда разработки не подключена к отладке фоновых процессов, точки останова будут игнорироваться.
Выполним правильную настройку подключения отладчика:
-debug (для протокола TCP/IP) или настроена отладка по протоколу HTTP.После включения отладки фоновых заданий платформа гарантированно остановится на точке останова в методе ЗаполнитьИдентификаторыУчастниковОперацийПоДаннымИзБанка общего модуля ЗагрузкаВыпискиПоБанковскомуСчету.
Рассмотрим подробнее, в каком месте формируются исходные данные для идентификации. Основным методом подготовки параметров сопоставления является процедура:
ЗагрузкаВыпискиПоБанковскомуСчету.ЗаполнитьИдентификаторыУчастниковОперацийПоДаннымИзБанка
В этот метод передается таблица загруженных из банковского файла операций. Для каждой строки генерируется набор поисковых признаков, куда стандартно включается КПП контрагента (плательщика или получателя). Чтобы исключить влияние КПП на результат распознавания, мы можем реализовать доработку конфигурации без снятия с поддержки — с помощью расширения.
Разберем вариант модификации логики через расширение конфигурации. Наиболее безопасным подходом является перехват обработки таблицы данных перед отправкой на поиск либо постобработка нераспознанных строк.
Посмотрим на пример переопределения метода с помощью аннотации &Вместо или &ИзменениеИКонтроль в модуле ЗагрузкаВыпискиПоБанковскомуСчету:
&Вместо("ЗаполнитьИдентификаторыУчастниковОперацийПоДаннымИзБанка")
Процедура Расш1_ЗаполнитьИдентификаторыУчастниковОперацийПоДаннымИзБанка(ТаблицаОпераций, ПараметрыЗагрузки)
// Вызываем оригинальный метод типовой конфигурации
ПродолжитьВызов(ТаблицаОпераций, ПараметрыЗагрузки);
// Обходим подготовленные операции и очищаем КПП участников,
// чтобы поиск выполнялся только по связке ИНН и расчетного счета
Для Каждого СтрокаОперации Из ТаблицаОпераций Цикл
Если ЗначениеЗаполнено(СтрокаОперации.ИННПлательщика) Тогда
СтрокаОперации.КПППлательщика = "";
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаОперации.ИННПолучателя) Тогда
СтрокаОперации.КПППолучателя = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если требуется скорректировать уже сформированные структуры идентификаторов, обратим внимание на модуль ИдентификацияУчастниковБанковскихОпераций. При формировании критериев поиска система заполняет структуру полей. Исключив из структуры реквизит КПП, мы заставим запросы сопоставления игнорировать этот параметр.
Проанализируем последствия полного отключения контроля КПП: