Как написать поиск договора по шаблону в назначении платежа 1С?

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

При загрузке банковских выписок часто возникает потребность автоматически сопоставлять платежи с нужными договорами. Ситуация усложняется, когда у контрагента несколько договоров (например, на разные виды продукции — «шоколад», «консервы»), а клиенты заполняют поле «Назначение платежа» в свободной форме. Стандартный поиск часто не справляется, если данные вводятся хаотично. Давайте разберем по шагам, как решить эту задачу различными способами: от простых встроенных функций до продвинутых алгоритмов.

Метод 1. Простой перебор и функция Найти

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

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

Метод 2. Поиск через массив подстрок и оператор ПОДОБНО

Если нам нужно искать конкретные паттерны, например, названия предметов договора, мы можем заранее сформировать массив искомых подстрок. Посмотрим на пример, как это можно реализовать алгоритмически:

Сначала мы задаем массив тегов, которые хотим найти:


ПостоянныйТегПоиска = "Предмет договора:";
мПодстроки = Новый Массив;
мПодстроки.Добавить(ПостоянныйТегПоиска + "шоколад");
мПодстроки.Добавить(ПостоянныйТегПоиска + "консервы");

Далее мы передаем этот массив в нашу функцию ПолучитьСсылкуДоговораПоНазначениюПлатежа. В теле функции мы программно генерируем текст запроса к таблице договоров. Мы создаем столько пакетов запросов, сколько у нас элементов в массиве. Проанализируем структуру такого запроса:


ВЫБРАТЬ Ссылка ИЗ ТаблицаДоговоров 
ГДЕ НазначениеПлатежа ПОДОБНО "%Предмет договора:шоколад%"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка ИЗ ТаблицаДоговоров 
ГДЕ НазначениеПлатежа ПОДОБНО "%Предмет договора:консервы%"

Этот метод работает быстро на уровне базы данных, однако требует точного совпадения подстроки.

Метод 3. Токенизация (разбиение строки на массив)

Посмотрим на более надежный метод подготовки текста — токенизацию. В 1С можно разбить сырую строку назначения платежа на отдельные слова (токены), чтобы избежать проблем со слипшимся текстом.

  1. Приводим строку назначения платежа к нижнему регистру с помощью функции НРег.
  2. Используя функцию СтрЗаменить, убираем все знаки препинания (запятые, точки, кавычки, скобки заменяем на пробелы).
  3. Функцией СтрРазделить разбиваем полученную строку по пробелам в массив слов.

После этого мы просто обходим массив слов циклом и проверяем их на совпадение с нашими ключевыми тегами. Это исключает ошибки, когда слово «шоколад» написано слитно с запятой или скобкой.

Метод 4. Регулярные выражения (RegExp)

Если номера договоров имеют сложный формат (буквы, цифры, дроби), обычного поиска может не хватить. Выясним причину: контрагент может написать «оплата по дог. №123/А от 12.05» или «договор 123/А от 12.05.2023». Для таких случаев применяют регулярные выражения.

В классической платформе 1С это реализуется через вызов COM-объекта VBScript.RegExp. Мы можем задать гибкий шаблон, который автоматически вычленит номер и дату, игнорируя лишний текст вокруг. В новой технологии 1С:Элемент для этого появилась встроенная поддержка "образцов" (аналог регулярок). Регулярки делают поиск максимально устойчивым к опечаткам в префиксах (дог, д-р, договор).

Метод 5. Нечеткий поиск и нейросети

Проанализируем ситуацию, когда люди делают банальные опечатки в словах ("консрвы", "шаколад"). Строгий поиск или оператор ПОДОБНО здесь бессильны. В таких случаях программисты 1С реализуют алгоритмы нечеткого поиска, например, расчет расстояния Левенштейна. Алгоритм оценивает процент совпадения строк: если совпадение 85% и выше, договор считается найденным.

Также сегодня активно применяются современные подходы с использованием API нейросетей. Вместо программирования жестких правил, сырой текст платежки отправляется в ИИ с промптом: "Определи предмет сделки и номер договора". В ответ 1С получает готовый структурированный JSON с извлеченными данными.

Правильная архитектура решения

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

← На главную