При загрузке банковских выписок часто возникает потребность автоматически сопоставлять платежи с нужными договорами. Ситуация усложняется, когда у контрагента несколько договоров (например, на разные виды продукции — «шоколад», «консервы»), а клиенты заполняют поле «Назначение платежа» в свободной форме. Стандартный поиск часто не справляется, если данные вводятся хаотично. Давайте разберем по шагам, как решить эту задачу различными способами: от простых встроенных функций до продвинутых алгоритмов.
Рассмотрим самый базовый подход, который подойдет, если список договоров для поиска не слишком велик. Суть алгоритма заключается в получении всех активных договоров контрагента и поиске их номеров или ключевых слов прямо в строке назначения платежа.
Найти. Какой нашелся — тот и подставляем.Если нам нужно искать конкретные паттерны, например, названия предметов договора, мы можем заранее сформировать массив искомых подстрок. Посмотрим на пример, как это можно реализовать алгоритмически:
Сначала мы задаем массив тегов, которые хотим найти:
ПостоянныйТегПоиска = "Предмет договора:";
мПодстроки = Новый Массив;
мПодстроки.Добавить(ПостоянныйТегПоиска + "шоколад");
мПодстроки.Добавить(ПостоянныйТегПоиска + "консервы");
Далее мы передаем этот массив в нашу функцию ПолучитьСсылкуДоговораПоНазначениюПлатежа. В теле функции мы программно генерируем текст запроса к таблице договоров. Мы создаем столько пакетов запросов, сколько у нас элементов в массиве. Проанализируем структуру такого запроса:
ВЫБРАТЬ Ссылка ИЗ ТаблицаДоговоров
ГДЕ НазначениеПлатежа ПОДОБНО "%Предмет договора:шоколад%"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка ИЗ ТаблицаДоговоров
ГДЕ НазначениеПлатежа ПОДОБНО "%Предмет договора:консервы%"
Этот метод работает быстро на уровне базы данных, однако требует точного совпадения подстроки.
Посмотрим на более надежный метод подготовки текста — токенизацию. В 1С можно разбить сырую строку назначения платежа на отдельные слова (токены), чтобы избежать проблем со слипшимся текстом.
НРег.СтрЗаменить, убираем все знаки препинания (запятые, точки, кавычки, скобки заменяем на пробелы).СтрРазделить разбиваем полученную строку по пробелам в массив слов.После этого мы просто обходим массив слов циклом и проверяем их на совпадение с нашими ключевыми тегами. Это исключает ошибки, когда слово «шоколад» написано слитно с запятой или скобкой.
Если номера договоров имеют сложный формат (буквы, цифры, дроби), обычного поиска может не хватить. Выясним причину: контрагент может написать «оплата по дог. №123/А от 12.05» или «договор 123/А от 12.05.2023». Для таких случаев применяют регулярные выражения.
В классической платформе 1С это реализуется через вызов COM-объекта VBScript.RegExp. Мы можем задать гибкий шаблон, который автоматически вычленит номер и дату, игнорируя лишний текст вокруг. В новой технологии 1С:Элемент для этого появилась встроенная поддержка "образцов" (аналог регулярок). Регулярки делают поиск максимально устойчивым к опечаткам в префиксах (дог, д-р, договор).
Проанализируем ситуацию, когда люди делают банальные опечатки в словах ("консрвы", "шаколад"). Строгий поиск или оператор ПОДОБНО здесь бессильны. В таких случаях программисты 1С реализуют алгоритмы нечеткого поиска, например, расчет расстояния Левенштейна. Алгоритм оценивает процент совпадения строк: если совпадение 85% и выше, договор считается найденным.
Также сегодня активно применяются современные подходы с использованием API нейросетей. Вместо программирования жестких правил, сырой текст платежки отправляется в ИИ с промптом: "Определи предмет сделки и номер договора". В ответ 1С получает готовый структурированный JSON с извлеченными данными.
Важно помнить: любые подобные доработки типовых конфигураций (например, алгоритма загрузки Клиент-Банка) следует выполнять методически правильно. Не нужно снимать конфигурацию с поддержки. Пишите код поиска договора в виде Расширения конфигурации. Создайте подписку на событие или перехватите процедуру загрузки, чтобы после стандартной отработки алгоритмов 1С применился ваш дополнительный поиск, который корректно заполнит поле «Договор» в документе.