Часто возникает задача автоматической обработки входящей электронной почты, когда из неструктурированного текста письма необходимо извлечь конкретные данные: номера лицевых счетов (ЛС), адреса, контактные телефоны и другую информацию. Ситуация усложняется тем, что письма могут содержать HTML-разметку, а пользователи пишут данные в свободном формате. Рассмотрим подробнее, как мы можем решить эту задачу встроенными средствами платформы 1С и внешними инструментами.
Многие почтовые клиенты отправляют письма в формате HTML. Прежде чем искать в тексте лицевые счета или адреса, проанализируем ситуацию: нам необходимо отсечь все теги, стили и скрипты, чтобы получить чистый неформатированный текст. Писать для этого ручной посимвольный перебор не нужно.
Разберем несколько способов получения простого текста:
СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML() или Взаимодействия.ПолучитьОбычныйТекстИзHTML(). Они автоматически удаляют теги и возвращают готовый к анализу текст.ПостроительDOM и ЧтениеHTML. Посмотрим на пример кода:
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(ТекстПисьмаВФорматеHTML);
Построитель = Новый ПостроительDOM;
ДокументHTML = Построитель.Прочитать(Чтение);
ЧистыйТекст = ДокументHTML.Тело.ТекстовоеСодержимое;
Теперь в переменной ЧистыйТекст мы имеем строку, готовую для дальнейшего парсинга.
Лицевой счет обычно представляет собой последовательность цифр определенной длины (например, 10 или 20 символов). В обсуждениях часто предлагают использовать посимвольный перебор: считывать каждый символ, проверять, является ли он числом, и накапливать результат в строковой переменной. Если длина совпадает с форматом ЛС — сохраняем.
Однако посимвольный перебор в 1С работает достаточно медленно и делает код громоздким. Выясним альтернативу: стандартом для разбора текста являются регулярные выражения (RegEx).
В современных версиях платформы 1С (начиная с 8.3.23) регулярные выражения поддерживаются "из коробки". Разберем по шагам, как извлечь 10-значный лицевой счет с помощью новой функции СтрНайтиПоРегулярномуВыражению:
// Шаблон \b\d{10}\b означает поиск ровно 10 цифр, ограниченных границами слова
ШаблонЛС = "\b\d{10}\b";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ЧистыйТекст, ШаблонЛС);
Для Каждого Вхождение Из РезультатПоиска Цикл
Сообщить("Найден лицевой счет: " + Вхождение.Значение);
КонецЦикла;
Если мы работаем на старых версиях платформы (до 8.3.23) под управлением ОС Windows, регулярные выражения можно использовать через COM-объект VBScript.RegExp. Посмотрим на пример:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр
RegExp.Global = Истина; // Искать все вхождения, а не только первое
RegExp.Pattern = "\b\d{10}\b";
Совпадения = RegExp.Execute(ЧистыйТекст);
Для Индекс = 0 По Совпадения.Count - 1 Цикл
Сообщить("Найден ЛС: " + Совпадения.Item(Индекс).Value);
КонецЦикла;
В отличие от лицевого счета, адрес не имеет жесткой математической структуры. Пользователи могут написать: "г. Москва ул Ленина д 5", "Мск, Ленина 5", "г Москва улица ленина дом пять". Попытка разобрать такие фантазийные конструкции простыми функциями или строгими шаблонами обречена на провал.
Проанализируем доступные пути решения:
Как бы ни были хороши алгоритмы искусственного интеллекта и регулярные выражения, 100% точности при разборе свободного текста добиться невозможно. Разберем организационные способы решения проблемы, которые предлагают опытные разработчики:
1. Внедрение строгих шаблонов. Можно настроить систему так, чтобы она принимала к обработке только те письма, которые содержат ключевые слова и скобки. Например: ЛС:[1234567890], АДРЕС:[г. Москва, ул. Мира 10]. Если регулярное выражение не находит такие блоки, пользователю автоматически отправляется ответ: "Ваше письмо не обработано. Пожалуйста, укажите данные в формате...".
2. Механизм подтверждений. Если 1С извлекла данные, но вероятность ошибки существует, система формирует ответное письмо: "Мы распознали ваш адрес как: [Нормализованный Адрес]. Если это верно, ответьте на это письмо словом ДА".
3. Использование форм обратной связи. Самый радикальный, но самый эффективный шаг — отказ от приема заявок в свободной форме на почту. Вместо этого клиентам предоставляется ссылка на Web-форму (или форму в личном кабинете), где поля "Лицевой счет", "Город", "Улица" жестко структурированы и имеют маски ввода. Затем эти данные передаются в 1С через HTTP-сервис напрямую, минуя этап текстового разбора писем.
Применяя комбинацию очистки HTML, встроенных регулярных выражений для поиска точных идентификаторов и внешних сервисов для нормализации сложных текстовых конструкций, мы можем значительно автоматизировать обработку входящей корреспонденции в 1С.