Как настроить разбор входящих SMS-уведомлений банков и парсинг текста в 1С 8.3?

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Автоматизация загрузки поступивших платежей через банковские SMS-уведомления (пересланные на электронную почту) позволяет оперативно закрывать дебиторскую задолженность и создавать документы оплаты. Рассмотрим, как устроена обработка парсинга писем в 1С 8.3, разберем алгоритм раскодирования текста и научимся правильно извлекать из входящих сообщений ключевые параметры: сумму, дату и реквизиты контрагента.

Разбор алгоритма ручной перекодировки текста (UTF-8)

При получении писем по протоколу POP3/IMAP текстовая часть сообщений может приходить в виде байтовых последовательностей UTF-8 (URL-encoded или Raw Bytes). В старых обработках или самописных конфигурациях часто встречается посимвольный перебор кодов для восстановления кириллицы.

Проанализируем фрагмент кода, выполняющий побайтовый разбор строки:


Для Н = 1 По Длина Цикл
    Знак = Сред(Стр, Н, 1);
    Код = КодСимвола(Знак, 1);
    Если Код < 128 Тогда
        Итог = Итог + Знак;
    ИначеЕсли (Код >= 128) И (Код < 192) Тогда
        // Пропуск служебных байтов
    Иначе
        Н = Н + 1;
        Знак2 = Сред(Стр, Н, 1);
        Код2 = КодСимвола(Знак2, 1);
        Если Код = 208 Тогда
            Если Код2 = 129 Тогда 
                Итог = Итог + "Ё";
            Иначе 
                Итог = Итог + Символ(КодСимвола("А", 1) + Код2 - 144);
            КонецЕсли;                                                              
        ИначеЕсли Код = 209 Тогда
            Если Код2 = 145 Тогда 
                Итог = Итог + "ё";
            Иначе 
                Итог = Итог + Символ(КодСимвола("р", 1) + Код2 - 128);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Разберем по шагам, что происходит в данном блоке:

  1. Первый байт с кодом меньше 128 отвечает стандартной таблице ASCII (латинские буквы, цифры и основные знаки препинания). Он добавляется в итоговую строку Итог без изменений.
  2. В кодировке UTF-8 русские буквы кодируются двумя байтами. Первый префиксный байт для прописных и большинства строчных букв равен 208 (hex D0), а для оставшихся строчных — 209 (hex D1).
  3. Второй байт (Код2) определяет сдвиг символа относительно первой буквы алфавита. Например, при префиксе 208 и втором коде 129 получается заглавная буква "Ё". Для остальных букв смещение вычисляется математически через КодСимвола("А", 1) + Код2 - 144.

Важное замечание: Ручной разбор по байтам нестабилен при появлении специфических Unicode-символов. Для современной платформы 1С 8.3 рекомендуется заменять подобные циклы на штатные механизмы работы с двоичными данными:


// Современный аналог декодирования двоичных данных в UTF-8
ТекстПисьма = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеПисьма, КодировкаТекста.UTF8);

Выделение сумм, номеров карт и подстрок из сообщений

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

Для поиска суммы и очистки строки от лишних символов (разделителей тысяч, наименований валют) проанализируем базовые строковые функции 1С:


// Пример извлечения суммы между ключевыми маркерами
ПозНачала = СтрНайти(Итог, "Summa ") + 6;
ПозКонца = СтрНайти(Итог, " RUB");

Если ПозНачала > 6 И ПозКонца > 0 Тогда
    СтрСумма = Сред(Итог, ПозНачала, ПозКонца - ПозНачала);
    
    // Удаляем запятые и пробелы из формата "6,666.00"
    СтрСумма = СтрЗаменить(СтрСумма, ",", "");
    СтрСумма = СокрЛП(СтрСумма);
    
    ЧислоСумма = Число(СтрСумма);
КонецЕсли;

Рассмотрим основные функции платформы, используемые при анализе текста банковских SMS:

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

Алгоритм связывания платежа с контрагентом и создание документа

После успешного извлечения суммы и реквизитов отправителя в обработке выполняется поиск контрагента и создание документа Документы.Оплата. Выясним логику поиска карты оплаты в справочнике:


// Поиск маски карты в тексте сообщения
ПозицияМаски = СтрНайти(ТекстТела, "****");
Карта = "";
Если ПозицияМаски > 0 Тогда
    Карта = Сред(ТекстТела, ПозицияМаски - 4, 12);
    Карта = СокрЛП(СтрЗаменить(Карта, "****", "-"));
КонецЕсли;

// Поиск владельца карты в справочнике
СсылкаКарта = Справочники.КартыОплаты.НайтиПоНаименованию(Карта);

// Создание и проведение документа оплаты
ДокОплата = Документы.Оплата.СоздатьДокумент();
ДокОплата.УстановитьНовыйНомер();
ДокОплата.Дата = ТекущаяДата();
ДокОплата.Сумма = ЧислоСумма;

Если ЗначениеЗаполнено(СсылкаКарта) Тогда
    ДокОплата.Контрагент = СсылкаКарта.Владелец;
Иначе
    ДокОплата.Контрагент = Константы.НеизвестныйКонтрагент.Получить();
КонецЕсли;

ДокОплата.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

Альтернативные и более надежные архитектурные решения

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

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

  1. Использование регулярных выражений (RegEx): Подключение объекта VBScript.RegExp позволяет находить шаблоны сумм вида \d+[\.,]?\d* независимо от смещения текста в письме.
  2. Создание собственного HTTP-сервиса 1С (HTTPСервис): В базе 1С настраивается прием POST-запросов. На телефоне устанавливается мобильное приложение-переадресатор SMS, которое пересылает входящие банковские сообщения напрямую в 1С в формате JSON. Это исключает задержки электронной почты и сбои кодировок.
  3. Интеграция по DirectBank или банковскому API: Использование официальных программных интерфейсов банков полностью избавляет от необходимости разбирать SMS и гарантирует корректность загружаемых банковских выписок.
← На главную