Автоматизация загрузки поступивших платежей через банковские SMS-уведомления (пересланные на электронную почту) позволяет оперативно закрывать дебиторскую задолженность и создавать документы оплаты. Рассмотрим, как устроена обработка парсинга писем в 1С 8.3, разберем алгоритм раскодирования текста и научимся правильно извлекать из входящих сообщений ключевые параметры: сумму, дату и реквизиты контрагента.
При получении писем по протоколу 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);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Разберем по шагам, что происходит в данном блоке:
128 отвечает стандартной таблице ASCII (латинские буквы, цифры и основные знаки препинания). Он добавляется в итоговую строку Итог без изменений.208 (hex D0), а для оставшихся строчных — 209 (hex D1).Код2) определяет сдвиг символа относительно первой буквы алфавита. Например, при префиксе 208 и втором коде 129 получается заглавная буква "Ё". Для остальных букв смещение вычисляется математически через КодСимвола("А", 1) + Код2 - 144.Важное замечание: Ручной разбор по байтам нестабилен при появлении специфических Unicode-символов. Для современной платформы 1С 8.3 рекомендуется заменять подобные циклы на штатные механизмы работы с двоичными данными:
// Современный аналог декодирования двоичных данных в UTF-8
ТекстПисьма = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеПисьма, КодировкаТекста.UTF8);
Разные банки используют индивидуальные шаблоны текстовых уведомлений. Сравнив форматы сообщений Сбербанка и Тинькофф, рассмотрим правила выделения данных:
Сбербанк Онлайн. Иван Иванович И. перевел(а) Вам 5555.00 RUB.Vhodyaschiy platezh. Summa 6,666.00 RUB. Otpravitel Individualnyi predprinimatel...Для поиска суммы и очистки строки от лишних символов (разделителей тысяч, наименований валют) проанализируем базовые строковые функции 1С:
// Пример извлечения суммы между ключевыми маркерами
ПозНачала = СтрНайти(Итог, "Summa ") + 6;
ПозКонца = СтрНайти(Итог, " RUB");
Если ПозНачала > 6 И ПозКонца > 0 Тогда
СтрСумма = Сред(Итог, ПозНачала, ПозКонца - ПозНачала);
// Удаляем запятые и пробелы из формата "6,666.00"
СтрСумма = СтрЗаменить(СтрСумма, ",", "");
СтрСумма = СокрЛП(СтрСумма);
ЧислоСумма = Число(СтрСумма);
КонецЕсли;
Рассмотрим основные функции платформы, используемые при анализе текста банковских SMS:
СтрНайти(Источник, ПодстрокаПоиска) — возвращает индекс первого символа найденного вхождения. Позволяет привязаться к ключевым словам (например, "перевел(а)", "Summa", "зачисление").Сред(Строка, ЧислоСмещения, КоличествоСимволов) — считывает указанную часть текста.СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) — удаляет разделители групп разрядов (пробелы, запятые), превращая текстовое представление суммы в числовой формат 1С.После успешного извлечения суммы и реквизитов отправителя в обработке выполняется поиск контрагента и создание документа Документы.Оплата. Выясним логику поиска карты оплаты в справочнике:
// Поиск маски карты в тексте сообщения
ПозицияМаски = СтрНайти(ТекстТела, "****");
Карта = "";
Если ПозицияМаски > 0 Тогда
Карта = Сред(ТекстТела, ПозицияМаски - 4, 12);
Карта = СокрЛП(СтрЗаменить(Карта, "****", "-"));
КонецЕсли;
// Поиск владельца карты в справочнике
СсылкаКарта = Справочники.КартыОплаты.НайтиПоНаименованию(Карта);
// Создание и проведение документа оплаты
ДокОплата = Документы.Оплата.СоздатьДокумент();
ДокОплата.УстановитьНовыйНомер();
ДокОплата.Дата = ТекущаяДата();
ДокОплата.Сумма = ЧислоСумма;
Если ЗначениеЗаполнено(СсылкаКарта) Тогда
ДокОплата.Контрагент = СсылкаКарта.Владелец;
Иначе
ДокОплата.Контрагент = Константы.НеизвестныйКонтрагент.Получить();
КонецЕсли;
ДокОплата.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Парсинг текстов SMS через пересланные электронные письма имеет ряд существенных недостатков: изменение банком текста уведомления ломает алгоритмы жесткого поиска по индексам строк.
Для повышения надежности автоматического приема платежей рекомендуем рассмотреть следующие подходы:
VBScript.RegExp позволяет находить шаблоны сумм вида \d+[\.,]?\d* независимо от смещения текста в письме.HTTPСервис): В базе 1С настраивается прием POST-запросов. На телефоне устанавливается мобильное приложение-переадресатор SMS, которое пересылает входящие банковские сообщения напрямую в 1С в формате JSON. Это исключает задержки электронной почты и сбои кодировок.