Как найти и изменить значения атрибутов в XML с помощью регулярных выражений в 1С

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

Работа с текстовыми данными и XML-файлами — одна из повседневных задач разработчика 1С. Иногда возникает необходимость быстро изменить или обнулить значения определенных атрибутов во всем файле, не прибегая к тяжеловесному объектному чтению XML. В таких случаях на помощь приходят регулярные выражения. В этой статье мы разберем, как правильно составить паттерн для поиска числовых значений и как применить его в коде 1С, учитывая особенности платформы.

Постановка задачи и базовый поиск

Представим ситуацию: нам необходимо найти в тексте все вхождения атрибута ВыплОПСДог, значением которого является число (целое или дробное). Например, ВыплОПСДог="0" или ВыплОПСДог="8120.33". Основная сложность для начинающих заключается в правильном экранировании кавычек и описании структуры числа.

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


// Пример использования в коде 1С
Результат = СтрНайтиВсеПоРегулярномуВыражению(Текст, "ВыплОПСДог=""\d+\.*\d+""", Истина, Истина);

Здесь \d+ означает одну или более цифр, а \.* — возможную точку (разделитель дробной части). Однако этот паттерн не универсален. Проанализируем ситуацию: если число будет целым (например, "0"), то условие \d+ после точки может не выполниться, и такое значение будет пропущено.

Оптимальный паттерн для работы с числами

Для того чтобы регулярное выражение корректно находило и целые, и дробные числа, нам нужно использовать более гибкую конструкцию. Разберем по шагам создание универсального паттерна: \d+(?:\.\d+)?.

  1. \d+ — находим одну или несколько цифр (целая часть).
  2. (?:...) — создаем незахватывающую группу для дробной части. Это ускоряет поиск, так как 1С не тратит память на хранение этой подстроки как отдельной переменной.
  3. \.\d+ — ищем точку и следующие за ней цифры.
  4. ? — квантификатор, который делает всю группу (точку и дробную часть) необязательной.

В контексте кода 1С, с учетом необходимости удваивать кавычки внутри строки, итоговое выражение для поиска атрибута будет выглядеть так:


Паттерн = "ВыплОПСДог=""(\d+(?:\.\d+)?)""";
// Используем встроенную функцию платформы 8.3.23+
МассивРезультатов = СтрНайтиВсеПоРегулярномуВыражению(Текст, Паттерн);

Массовое изменение (обнуление) значений

Если наша задача не просто найти, а "обнулить" все найденные показатели (например, превратить любое число в "0"), эффективнее всего использовать функцию замены. Для этого важно сохранить структуру XML-тега, изменив только содержимое кавычек.

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


ТекстДляОбработки = "Данные ВыплОПСДог=""8120.33"" и еще ВыплОПСДог=""100""";
ПаттернДляЗамены = "(ВыплОПСДог="")([^""]*)("")";
// $1 — первая группа (имя), 0 — новое значение, $3 — третья группа (кавычка)
Результат = СтрЗаменитьПоРегулярномуВыражению(ТекстДляОбработки, ПаттернДляЗамены, "$10$3");

Важный момент: использование конструкции ([^""]*) позволяет захватить любой текст внутри кавычек, что делает решение универсальным, если формат данных вдруг изменится.

Специфика работы регулярных выражений в 1С

Начиная с версии платформы 8.3.23, разработчикам стали доступны встроенные функции СтрНайтиВсеПоРегулярномуВыражению и СтрЗаменитьПоРегулярномуВыражению. Они базируются на библиотеке ICU, которая имеет свои особенности по сравнению с привычными веб-инструментами (такими как Regex101):

Рекомендации по отладке и безопасности

Проанализируем риски использования регулярных выражений при работе с XML. Несмотря на их удобство и высокую скорость (особенно при модификации динамических списков или огромных текстовых массивов), регулярки могут "сломаться" при изменении структуры файла. Если в XML появятся лишние пробелы, переносы строк или изменится регистр букв в названии атрибута, паттерн может перестать работать.

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

  1. Для быстрой правки простых файлов — регулярные выражения.
  2. Для работы со сложной иерархией — объекты ЧтениеXML и ЗаписьXML.
  3. Для поиска точных вхождений — использование границ слова \b. Например: \bВыплОПСДог=""\d+"" гарантирует, что мы не изменим похожий атрибут типа ПремиальнаяВыплОПСДог.

Для отладки паттернов рекомендуем использовать специализированные сайты, но всегда делайте финальную проверку в "Консоли кода" 1С, так как поведение движка на Windows-клиенте и Linux-сервере может иметь минимальные отличия в обработке символов переноса строки (\r\n против \n).

← На главную