Мы рассмотрим важнейшие нововведения в платформе 1С:Предприятие, которые существенно расширяют возможности разработчиков. Речь пойдет о долгожданной поддержке регулярных выражений, механизме генерации речи и реализации протокола WebSocket, а также о других полезных улучшениях.
Платформа 1С непрерывно развивается, и каждое новое обновление приносит функционал, который позволяет решать более сложные и разнообразные задачи. Давайте подробнее разберем, как эти нововведения можно применять в нашей повседневной работе и какие особенности следует учитывать при их использовании.
Долгое время разработчикам 1С приходилось прибегать к сторонним решениям для работы с регулярными выражениями. Мы использовали внешние компоненты, такие как VBScript.RegExp, .NET RegEx или даже JavaScript, что, безусловно, усложняло архитектуру наших решений и создавало дополнительные зависимости. Однако, начиная с версии платформы 8.3.23, встроенный язык 1С получил нативную поддержку регулярных выражений.
Эта реализация основана на диалекте ICU регулярных выражений, который по своей логике близок к языку Perl и при этом расширен для эффективной работы со строками Unicode. Это важный шаг, который позволяет нам отказаться от внешних зависимостей и упростить код.
Давайте посмотрим, какие функции стали нам доступны:
СтрНайтиПоРегулярномуВыражению(Строка, РегулярноеВыражение, ПозицияНачалаПоиска): Эта функция предназначена для поиска в строке вхождений подстрок, которые соответствуют заданному регулярному выражению. Она возвращает объект типа РезультатПоискаПоРегулярномуВыражению. Этот объект содержит информацию о найденной подстроке, включая её начальную позицию и длину. Если совпадений не найдено, возвращается Неопределено.СтрЗаменитьПоРегулярномуВыражению(Строка, РегулярноеВыражение, СтрокаЗамены): Данная функция позволяет найти все вхождения подстрок, соответствующие регулярному выражению, и заменить их на указанную строку замены. Это мощный инструмент для массовых преобразований текста.СтрПодобнаПоРегулярномуВыражению(Строка, РегулярноеВыражение): Эта функция служит для проверки соответствия всей строки заданному регулярному выражению. Она возвращает булево значение: Истина, если строка полностью соответствует выражению, и Ложь в противном случае.Несмотря на значимость появления встроенных регулярных выражений, мы должны быть осведомлены о некоторых ограничениях первой реализации, которые были отмечены и в обсуждении на форуме:
СтрНайтиПоРегулярномуВыражению() в цикле, каждый раз увеличивая начальную позицию поиска. Кроме того, используемый диалект не поддерживает именованные группы, что делает парсинг сложных структур менее удобным.СтрЗаменитьПоРегулярномуВыражению() мы не можем применять ссылки на найденные группы (например, $1, $2) в строке замены. Это является существенным ограничением по сравнению с другими реализациями, где такая функциональность значительно упрощает задачи преобразования строк на основе шаблонов.Несмотря на упомянутые ограничения, встроенные регулярные выражения уже сейчас позволяют нам эффективно решать множество задач:
Давайте рассмотрим несколько примеров использования:
Пример 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С:Предприятие начиная с версии 8.3.25, стал механизм генерации речи. Это открывает перед нами совершенно новые горизонты для создания интерактивных систем и повышения доступности приложений.
Этот механизм позволяет нам генерировать речь из заданного текста. Мы можем либо сразу воспроизвести ее, либо сохранить полученный аудиофайл в формате WAV. Важной особенностью является минимальная задержка при воспроизведении, что критично для интерактивных сценариев.
Платформа 1С использует облачный сервис "1С" для синтеза речи. Это означает, что для работы требуется доступ к интернету. Нам предоставляется возможность выбора голоса из обширной коллекции, доступной на сервере, что позволяет адаптировать звучание под конкретные нужды проекта. Продукт "1С:Синтез речи" выступает в качестве бэкенда для методов внутреннего языка 1С по генерации речи.
Разберем, где мы можем использовать этот функционал:
Представим, что мы можем получить от 1С не только текст, но и полноценный голосовой ответ. Как верно было замечено в одном из сообщений форума, если 1С уже умеет "слушать", то скоро научится и "отвечать". Этот механизм - один из шагов в данном направлении.
Поддержка протокола WebSocket в платформе "1С:Предприятие" является еще одним значимым нововведением. Она появилась в версии 8.3.27, хотя ранее планировалась к выходу в версиях 8.3.25 и 8.3.26. Эта функциональность открывает нам путь к созданию высокоинтерактивных и реактивных решений без необходимости использования внешних компонентов.
Теперь мы можем создавать клиентские WebSocket-соединения непосредственно в толстом, тонком, веб-клиенте, а также на сервере. Это означает, что 1С может выступать как клиент для различных WebSocket-сервисов, устанавливая постоянное двунаправленное соединение.
Традиционные HTTP-запросы работают по принципу "запрос-ответ", что не всегда эффективно для сценариев, требующих обновления данных в реальном времени. WebSocket же устанавливает одно долгоживущее соединение, по которому обе стороны могут обмениваться сообщениями в любой момент. Это обеспечивает:
Мы можем реализовать широкий спектр задач интеграции, включая:
В рамках функционала "Функции для технического специалиста" была добавлена новая функция "Управление WebSocket-клиентами", что упрощает работу с активными соединениями. Кроме того, 1C:Enterprise Development Tools (EDT) поддерживает отладку WebSocket-соединений начиная с версии 2024.2, что значительно облегчает разработку и тестирование.
На форуме высказывались предположения относительно программного интерфейса. Хотя точный API для встроенных WebSocket отличается от спекуляций, идея асинхронной работы с соединениями, как показано в сообщении 9, близка к современным подходам:
// Примерная концепция, не точный API 1С, но отражает ожидания
// Асинх Функция ПинайКовыряй(ПараметрыЗапроса)
// ВебГнездо = Новый HTTPЗапрос();
// ВебГнездо.Вид = ВидHTTPЗапроса.WebSocket;
// ВебГнездо.УстановитьТекстЗапроса(ПараметрыЗапроса);
// Возврат Ждать ВебГнездо.ВебСокетатьАсинх();
// КонецФункции
В реальности же, мы работаем с объектами, которые позволяют управлять соединением, отправлять и получать данные. Форумчане также делились опытом собственной реализации WebSocket-клиентов до появления встроенной поддержки, например, используя внешний компонент и генерацию внешних событий при входящих сообщениях. Это подчеркивает острую потребность в данном функционале и ценность его появления в платформе.
Помимо рассмотренных крупных нововведений, мы также отметим другие полезные функции, которые были упомянуты в обсуждении и появились в платформе:
В целом, платформа 1С:Предприятие продолжает активно развиваться, предоставляя нам, разработчикам, все более мощные и гибкие инструменты. Регулярные выражения, WebSocket и механизм генерации речи — это только часть того, что делает 1С современной и конкурентоспособной средой для разработки бизнес-приложений. Мы будем внимательно следить за дальнейшими обновлениями и использовать новые возможности для создания еще более эффективных и инновационных решений.