Как использовать регулярные выражения, WebSocket и генерацию речи во встроенном языке 1С?

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

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

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

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

Долгое время разработчикам 1С приходилось прибегать к сторонним решениям для работы с регулярными выражениями. Мы использовали внешние компоненты, такие как VBScript.RegExp, .NET RegEx или даже JavaScript, что, безусловно, усложняло архитектуру наших решений и создавало дополнительные зависимости. Однако, начиная с версии платформы 8.3.23, встроенный язык 1С получил нативную поддержку регулярных выражений.

Эта реализация основана на диалекте ICU регулярных выражений, который по своей логике близок к языку Perl и при этом расширен для эффективной работы со строками Unicode. Это важный шаг, который позволяет нам отказаться от внешних зависимостей и упростить код.

Давайте посмотрим, какие функции стали нам доступны:

  1. СтрНайтиПоРегулярномуВыражению(Строка, РегулярноеВыражение, ПозицияНачалаПоиска): Эта функция предназначена для поиска в строке вхождений подстрок, которые соответствуют заданному регулярному выражению. Она возвращает объект типа РезультатПоискаПоРегулярномуВыражению. Этот объект содержит информацию о найденной подстроке, включая её начальную позицию и длину. Если совпадений не найдено, возвращается Неопределено.
  2. СтрЗаменитьПоРегулярномуВыражению(Строка, РегулярноеВыражение, СтрокаЗамены): Данная функция позволяет найти все вхождения подстрок, соответствующие регулярному выражению, и заменить их на указанную строку замены. Это мощный инструмент для массовых преобразований текста.
  3. СтрПодобнаПоРегулярномуВыражению(Строка, РегулярноеВыражение): Эта функция служит для проверки соответствия всей строки заданному регулярному выражению. Она возвращает булево значение: Истина, если строка полностью соответствует выражению, и Ложь в противном случае.

Ограничения текущей реализации регулярных выражений

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

Практические примеры использования регулярных выражений

Несмотря на упомянутые ограничения, встроенные регулярные выражения уже сейчас позволяют нам эффективно решать множество задач:

Давайте рассмотрим несколько примеров использования:

Пример 1: Проверка формата телефонного номера

Допустим, нам необходимо убедиться, что введенный телефонный номер соответствует формату +7 (XXX) XXX-XX-XX.


ТелефонныйНомер = "+7 (912) 345-67-89";
ШаблонТелефона = "^\\+7 \\(\\d{3}\\) \\d{3}-\\d{2}-\\d{2}$"; // Используем двойные обратные слеши для экранирования

Если СтрПодобнаПоРегулярномуВыражению(ТелефонныйНомер, ШаблонТелефона) Тогда
    Сообщить("Телефонный номер имеет корректный формат.");
Иначе
    Сообщить("Телефонный номер имеет некорректный формат.");
КонецЕсли;

Пример 2: Поиск всех email-адресов в тексте

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


Текст = "Мой email: user@example.com. Свяжитесь со мной или отправьте письмо на support@domain.ru.";
ШаблонEmail = "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b";
НачальнаяПозиция = 1;
Результаты = Новый Массив;

Пока Истина Цикл
    РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, ШаблонEmail, НачальнаяПозиция);
    Если РезультатПоиска = Неопределено Тогда
        Прервать;
    КонецЕсли;
    
    НайденнаяПодстрока = Сред(Текст, РезультатПоиска.Позиция, РезультатПоиска.Длина);
    Результаты.Добавить(НайденнаяПодстрока);
    
    НачальнаяПозиция = РезультатПоиска.Позиция + РезультатПоиска.Длина;
КонецЦикла;

Для Каждого EmailИзМассива Из Результаты Цикл
    Сообщить("Найден email: " + EmailИзМассива);
КонецЦикла;

Пример 3: Замена нескольких пробелов на один

Эта задача часто встречается при очистке текста. Мы заменим все последовательности из одного или более пробелов на одиночный пробел.


ИсходнаяСтрока = "  Это   строка  с   лишними    пробелами.   ";
ОчищеннаяСтрока = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, "\\s+", " ");
Сообщить("Исходная строка: """ + ИсходнаяСтрока + """");
Сообщить("Очищенная строка: """ + ОчищеннаяСтрока + """");

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

Механизм генерации речи: озвучиваем 1С

Очередным интересным нововведением, появившимся в платформе 1С:Предприятие начиная с версии 8.3.25, стал механизм генерации речи. Это открывает перед нами совершенно новые горизонты для создания интерактивных систем и повышения доступности приложений.

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

Платформа 1С использует облачный сервис "1С" для синтеза речи. Это означает, что для работы требуется доступ к интернету. Нам предоставляется возможность выбора голоса из обширной коллекции, доступной на сервере, что позволяет адаптировать звучание под конкретные нужды проекта. Продукт "1С:Синтез речи" выступает в качестве бэкенда для методов внутреннего языка 1С по генерации речи.

Сценарии применения генерации речи

Разберем, где мы можем использовать этот функционал:

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

Поддержка протокола WebSocket: новые горизонты интерактивности

Поддержка протокола WebSocket в платформе "1С:Предприятие" является еще одним значимым нововведением. Она появилась в версии 8.3.27, хотя ранее планировалась к выходу в версиях 8.3.25 и 8.3.26. Эта функциональность открывает нам путь к созданию высокоинтерактивных и реактивных решений без необходимости использования внешних компонентов.

Теперь мы можем создавать клиентские WebSocket-соединения непосредственно в толстом, тонком, веб-клиенте, а также на сервере. Это означает, что 1С может выступать как клиент для различных WebSocket-сервисов, устанавливая постоянное двунаправленное соединение.

Почему WebSocket важен для 1С?

Традиционные HTTP-запросы работают по принципу "запрос-ответ", что не всегда эффективно для сценариев, требующих обновления данных в реальном времени. WebSocket же устанавливает одно долгоживущее соединение, по которому обе стороны могут обмениваться сообщениями в любой момент. Это обеспечивает:

Сценарии применения WebSocket

Мы можем реализовать широкий спектр задач интеграции, включая:

В рамках функционала "Функции для технического специалиста" была добавлена новая функция "Управление WebSocket-клиентами", что упрощает работу с активными соединениями. Кроме того, 1C:Enterprise Development Tools (EDT) поддерживает отладку WebSocket-соединений начиная с версии 2024.2, что значительно облегчает разработку и тестирование.

На форуме высказывались предположения относительно программного интерфейса. Хотя точный API для встроенных WebSocket отличается от спекуляций, идея асинхронной работы с соединениями, как показано в сообщении 9, близка к современным подходам:


// Примерная концепция, не точный API 1С, но отражает ожидания
// Асинх Функция ПинайКовыряй(ПараметрыЗапроса)
// ВебГнездо = Новый HTTPЗапрос();
// ВебГнездо.Вид = ВидHTTPЗапроса.WebSocket;
// ВебГнездо.УстановитьТекстЗапроса(ПараметрыЗапроса);
// Возврат Ждать ВебГнездо.ВебСокетатьАсинх();
// КонецФункции

В реальности же, мы работаем с объектами, которые позволяют управлять соединением, отправлять и получать данные. Форумчане также делились опытом собственной реализации WebSocket-клиентов до появления встроенной поддержки, например, используя внешний компонент и генерацию внешних событий при входящих сообщениях. Это подчеркивает острую потребность в данном функционале и ценность его появления в платформе.

Другие важные улучшения

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

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

← На главную