Работа с текстовыми данными и XML-файлами — одна из повседневных задач разработчика 1С. Иногда возникает необходимость быстро изменить или обнулить значения определенных атрибутов во всем файле, не прибегая к тяжеловесному объектному чтению XML. В таких случаях на помощь приходят регулярные выражения. В этой статье мы разберем, как правильно составить паттерн для поиска числовых значений и как применить его в коде 1С, учитывая особенности платформы.
Представим ситуацию: нам необходимо найти в тексте все вхождения атрибута ВыплОПСДог, значением которого является число (целое или дробное). Например, ВыплОПСДог="0" или ВыплОПСДог="8120.33". Основная сложность для начинающих заключается в правильном экранировании кавычек и описании структуры числа.
Рассмотрим первый рабочий вариант паттерна, который был предложен в ходе обсуждения. Для поиска конструкций, где после названия атрибута идет число в кавычках, мы можем использовать следующую структуру:
// Пример использования в коде 1С
Результат = СтрНайтиВсеПоРегулярномуВыражению(Текст, "ВыплОПСДог=""\d+\.*\d+""", Истина, Истина);
Здесь \d+ означает одну или более цифр, а \.* — возможную точку (разделитель дробной части). Однако этот паттерн не универсален. Проанализируем ситуацию: если число будет целым (например, "0"), то условие \d+ после точки может не выполниться, и такое значение будет пропущено.
Для того чтобы регулярное выражение корректно находило и целые, и дробные числа, нам нужно использовать более гибкую конструкцию. Разберем по шагам создание универсального паттерна: \d+(?:\.\d+)?.
\d+ — находим одну или несколько цифр (целая часть).(?:...) — создаем незахватывающую группу для дробной части. Это ускоряет поиск, так как 1С не тратит память на хранение этой подстроки как отдельной переменной.\.\d+ — ищем точку и следующие за ней цифры.? — квантификатор, который делает всю группу (точку и дробную часть) необязательной.В контексте кода 1С, с учетом необходимости удваивать кавычки внутри строки, итоговое выражение для поиска атрибута будет выглядеть так:
Паттерн = "ВыплОПСДог=""(\d+(?:\.\d+)?)""";
// Используем встроенную функцию платформы 8.3.23+
МассивРезультатов = СтрНайтиВсеПоРегулярномуВыражению(Текст, Паттерн);
Если наша задача не просто найти, а "обнулить" все найденные показатели (например, превратить любое число в "0"), эффективнее всего использовать функцию замены. Для этого важно сохранить структуру XML-тега, изменив только содержимое кавычек.
Воспользуемся группами захвата. Разделим наше выражение на три части: имя атрибута с открывающей кавычкой, само число и закрывающую кавычку. Посмотрим на пример реализации:
ТекстДляОбработки = "Данные ВыплОПСДог=""8120.33"" и еще ВыплОПСДог=""100""";
ПаттернДляЗамены = "(ВыплОПСДог="")([^""]*)("")";
// $1 — первая группа (имя), 0 — новое значение, $3 — третья группа (кавычка)
Результат = СтрЗаменитьПоРегулярномуВыражению(ТекстДляОбработки, ПаттернДляЗамены, "$10$3");
Важный момент: использование конструкции ([^""]*) позволяет захватить любой текст внутри кавычек, что делает решение универсальным, если формат данных вдруг изменится.
Начиная с версии платформы 8.3.23, разработчикам стали доступны встроенные функции СтрНайтиВсеПоРегулярномуВыражению и СтрЗаменитьПоРегулярномуВыражению. Они базируются на библиотеке ICU, которая имеет свои особенности по сравнению с привычными веб-инструментами (такими как Regex101):
\w в 1С по умолчанию включает символы кириллицы. В онлайн-тестерах для этого часто требуется включать специальный флаг Unicode.""). Обратный слэш \ используется только для служебных символов самого регулярного выражения.ВыплОПСДог=".*", выражение может захватить текст от первой кавычки первого атрибута до последней кавычки в самом конце строки, если там встретится еще один атрибут. Чтобы этого избежать, всегда ограничивайте область поиска цифрами (\d+) или используйте ленивый квантификатор (.*?).Проанализируем риски использования регулярных выражений при работе с XML. Несмотря на их удобство и высокую скорость (особенно при модификации динамических списков или огромных текстовых массивов), регулярки могут "сломаться" при изменении структуры файла. Если в XML появятся лишние пробелы, переносы строк или изменится регистр букв в названии атрибута, паттерн может перестать работать.
Для гарантированной корректности в сложных проектах рекомендуется комбинировать подходы:
ЧтениеXML и ЗаписьXML.\b. Например: \bВыплОПСДог=""\d+"" гарантирует, что мы не изменим похожий атрибут типа ПремиальнаяВыплОПСДог.Для отладки паттернов рекомендуем использовать специализированные сайты, но всегда делайте финальную проверку в "Консоли кода" 1С, так как поведение движка на Windows-клиенте и Linux-сервере может иметь минимальные отличия в обработке символов переноса строки (\r\n против \n).