Как извлечь адреса и лицевые счета из текста письма в 1С?

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

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

Очистка письма от HTML-разметки

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

Разберем несколько способов получения простого текста:

  1. Использование Библиотеки стандартных подсистем (БСП). В типовых конфигурациях 1С уже есть готовые функции для очистки HTML. Мы можем использовать СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML() или Взаимодействия.ПолучитьОбычныйТекстИзHTML(). Они автоматически удаляют теги и возвращают готовый к анализу текст.
  2. Использование встроенных объектов DOM. Если конфигурация не типовая или БСП недоступна, применим связку объектов Построитель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", "г Москва улица ленина дом пять". Попытка разобрать такие фантазийные конструкции простыми функциями или строгими шаблонами обречена на провал.

Проанализируем доступные пути решения:

  1. Использование классификатора ФИАС/ГАР внутри 1С. В типовых конфигурациях (ERP, Бухгалтерия, Комплексная автоматизация) есть модули работы с контактной информацией. Они содержат алгоритмы нормализации, которые могут попытаться разобрать строку и найти соответствие в справочнике. Это неплохой вариант, если строка адреса написана относительно грамотно.
  2. Использование внешних API-сервисов (например, DaData). Это наиболее современный и точный подход. Сервисы-подсказки используют машинное обучение и огромные базы данных для нормализации "грязных" адресов. Из 1С мы просто отправляем HTTP-запрос со строкой, которую написал пользователь. В ответ сервис возвращает структурированный JSON: индекс, регион, город, улицу, дом, а также коды ФИАС. Сервис успешно справляется с опечатками, отсутствием запятых и перестановкой слов местами.

Организационные и административные меры

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

1. Внедрение строгих шаблонов. Можно настроить систему так, чтобы она принимала к обработке только те письма, которые содержат ключевые слова и скобки. Например: ЛС:[1234567890], АДРЕС:[г. Москва, ул. Мира 10]. Если регулярное выражение не находит такие блоки, пользователю автоматически отправляется ответ: "Ваше письмо не обработано. Пожалуйста, укажите данные в формате...".

2. Механизм подтверждений. Если 1С извлекла данные, но вероятность ошибки существует, система формирует ответное письмо: "Мы распознали ваш адрес как: [Нормализованный Адрес]. Если это верно, ответьте на это письмо словом ДА".

3. Использование форм обратной связи. Самый радикальный, но самый эффективный шаг — отказ от приема заявок в свободной форме на почту. Вместо этого клиентам предоставляется ссылка на Web-форму (или форму в личном кабинете), где поля "Лицевой счет", "Город", "Улица" жестко структурированы и имеют маски ввода. Затем эти данные передаются в 1С через HTTP-сервис напрямую, минуя этап текстового разбора писем.

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

← На главную