Как автоматизировать распознавание назначения платежа в 1С:Бухгалтерия 3.0

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

Работа бухгалтера по разнесению банковских выписок часто превращается в рутинный процесс, особенно когда контрагенты указывают назначение платежа в свободной форме. В этой статье мы подробно разберем, как автоматизировать процесс сопоставления входящих денежных средств с документами реализации (счетами, УПД) в конфигурации 1С:Бухгалтерия 3.0 — для этого подойдёт автоматическое разнесение банковских выписок через анализ текста. Мы проанализируем различные подходы: от простых алгоритмов поиска подстрок до современных технологических решений на базе искусственного интеллекта.

Метод 1. Программный парсинг строки назначения платежа

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

Проанализируем типичную ситуацию: в строке может быть написано «Оплата по счету №123 от 01.01.2023» или «За товар по сч 123». Нам необходимо научить систему распознавать эти вариации. Для повышения эффективности поиска (до 70–80% успеха) рекомендуется использовать следующий подход:

  1. Приведем всю строку к верхнему регистру с помощью функции ВРег(), чтобы не зависеть от того, как клиент написал слово — «Счет», «счет» или «СЧЕТ».
  2. Определим список ключевых слов-маркеров: «СЧЕТ», «СЧ», «УПД», «ДОГ».
  3. После нахождения маркера выделим идущие за ним цифры.

Посмотрим на пример кода, который можно интегрировать в обработку загрузки выписки:


// Пример упрощенного поиска номера счета в назначении платежа
Функция НайтиНомерДокумента(ТекстНазначения)
    ТекстНазначения = ВРег(ТекстНазначения);
    КлючевыеСлова = Новый Массив;
    КлючевыеСлова.Добавить("СЧЕТ №");
    КлючевыеСлова.Добавить("СЧЕТ");
    КлючевыеСлова.Добавить("СЧ №");
    
    Для Каждого Ключ Из КлючевыеСлова Цикл
        Позиция = СтрНайти(ТекстНазначения, Ключ);
        Если Позиция > 0 Тогда
            // Извлекаем подстроку после ключевого слова
            ОстатокСтроки = Сред(ТекстНазначения, Позиция + СтрДлина(Ключ));
            // Очищаем от лишних символов и пробелов, оставляя только цифры
            Результат = "";
            Для СимволНомер = 1 По СтрДлина(ОстатокСтроки) Цикл
                Символ = Сред(ОстатокСтроки, СимволНомер, 1);
                Если СтрНайти("0123456789", Символ) > 0 Тогда
                    Результат = Результат + Символ;
                ИначеЕсли Результат <> "" Тогда
                    Прервать; // Номер закончился
                КонецЕсли;
            КонецЦикла;
            Возврат Результат;
        КонецЕсли;
    КонецЦикла;
    Возврат "";
КонецФункции

Метод 2. Использование регулярных выражений (RegEx)

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

Преимущество RegEx заключается в том, что один шаблон может описать десятки вариантов написания. Рассмотрим пример шаблона для поиска номера счета:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
// Шаблон ищет слово "счет" или "сч", затем возможный знак № или пробелы, и саму цифру
RegExp.Pattern = "(?:счет|сч)\s*(?:№|но|номер)?\s*(\d+)";

Matches = RegExp.Execute(ТекстНазначения);
Если Matches.Count > 0 Тогда
    НомерСчета = Matches.Item(0).SubMatches.Item(0);
    // Далее ищем СчетСсылка по номеру в базе
КонецЕсли;

Метод 3. Интеллектуальный «копеечный» метод

Выясним причину, по которой иногда программный поиск бессилен: клиент может просто написать «Оплата за услуги». В таких случаях помогает маркетингово-технический прием — маркировка копейками. Каждому выставленному счету присваивается уникальное количество копеек. Например:

При загрузке банковской выписки система в первую очередь ищет соответствие по точной сумме (включая копейки) в рамках конкретного контрагента — ускоряет процесс умная обработка заполнения реквизитов банковской выписки. Это позволяет добиться практически 100% автоматизации для массовых платежей, даже если назначение платежа не заполнено корректно.

Метод 4. Уникальный идентификатор платежа (УИП)

Рассмотрим использование стандартного механизма банковской системы — УИП (поле 22 в платежном поручении). Вы можете генерировать уникальный идентификатор для каждого счета и выводить его в печатной форме счета с инструкцией «Обязательно укажите этот код в поле Код (УИП)».

В 1С:Бухгалтерия при импорте выписки система автоматически проверяет поле КодИдентификатора. Если он совпадает с тем, что был присвоен документу в базе, разнесение произойдет мгновенно и без ошибок. Однако, как отмечалось в обсуждении, не все клиенты готовы дисциплинированно заполнять дополнительные поля.

Метод 5. Внедрение QR-кодов по ГОСТ

Проанализируем ситуацию, когда мы хотим минимизировать человеческий фактор со стороны клиента. Современный стандарт ГОСТ Р 56042-2014 позволяет размещать на счетах QR-код.

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

  1. Префикс документа (например, СЧ-).
  2. Полный номер документа с учетом лидирующих нулей.
  3. Дату документа.
  4. ИНН вашей организации для дополнительной проверки.

Метод 6. Алгоритмы нечеткого поиска (Расстояние Левенштейна)

Если контрагент допустил опечатку, например, «Оплата по счтету», стандартный поиск подстрок может не сработать. В таких случаях программисты 1С реализуют функцию расчета расстояния Левенштейна. Это алгоритм, который определяет количество правок (замен, удалений, вставок), необходимых для превращения одной строки в другую.

Если мы находим в строке слово, которое на 80% совпадает со словом «СЧЕТ», мы можем с высокой долей вероятности предположить, что это именно оно, и попытаться обработать следующие за ним символы как номер.

Метод 7. Использование DirectBank

Посмотрим на технологию DirectBank. В отличие от старого обмена через текстовые файлы txt, этот протокол позволяет получать данные напрямую с сервера банка через API — для этого подойдёт модуль автоматической загрузки и разноски платежей через API. Это не только ускоряет процесс, но и позволяет получать более чистые данные без искажений кодировки и с более длинными полями назначения платежа, которые иногда обрезаются в промежуточных файлах экспорта.

Рекомендации по реализации

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

Важно помнить, что любая автоматизация должна оставлять возможность контроля. Постройте интерфейс так, чтобы система подсвечивала цветом те строки, которые были разнесены автоматически «с сомнением», чтобы бухгалтер мог быстро проверить результат нажатием одной кнопки.

Подведем итог: универсального механизма, работающего на 100% «из коробки», не существует из-за творческого подхода бухгалтеров контрагентов к заполнению документов. Однако сочетание технических средств (RegEx, DirectBank) и организационных мер (QR-коды, УИП) позволяет автоматизировать обработку до 90-95% банковской выписки, значительно снижая нагрузку на финансовый отдел.

← На главную