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

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

При работе с большими базами данных номенклатуры часто возникает задача нормализации данных. Одной из типичных проблем является извлечение числовых характеристик, таких как длина, ширина или вес, которые «зашиты» непосредственно в текстовое наименование. Например, из строки «УП-17 краш. 6,0м» нам необходимо получить число 6.0 для записи в отдельный реквизит. Писать сложный алгоритм с перебором символов — задача трудоемкая и не всегда эффективная. В таких случаях на помощь приходят регулярные выражения (RegExp).

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

Постановка задачи и базовые шаблоны

Рассмотрим типичные примеры наименований, из которых нужно извлечь длину:

  1. У-1 до 1,00м (Штакетник)
  2. МУП 6,0м (Н-60, Н-75)
  3. УП-17 краш. 6,0м

На первый взгляд, нам нужно найти последовательность цифр, разделенных запятой, после которых идет буква «м». Простейший вариант регулярного выражения, предложенный в обсуждении, выглядит так: \b\d+,\d+м\b.

Разберем, что означают эти символы:

Однако на практике такой шаблон быстро «сломается», так как он не учитывает целые числа (например, «6м» вместо «6,0м») и возможные точки в качестве разделителей.

Универсальное регулярное выражение для поиска длины

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

Оптимальный вариант шаблона будет выглядеть следующим образом:

(\d+([.,]\d+)?)\s*(м|см|мм|дм|m)

Разберем по шагам, почему эта конструкция эффективнее:

  1. (\d+([.,]\d+)?) — эта группа ищет число. Она найдет как целое число (6), так и дробное (6.0 или 6,0). Знак вопроса после вложенной скобки делает дробную часть необязательной.
  2. \s* — этот символ означает «ноль или более пробелов». Часто пользователи ставят пробел между числом и единицей измерения (например, «6.0 м»), и этот метасимвол позволяет корректно обработать такие случаи.
  3. (м|см|мм|дм|m) — группа выбора единиц измерения. Обратите внимание, что мы добавили латинскую «m», так как при быстром вводе данных операторы часто путают раскладку клавиатуры.

Реализация в 1С через встроенный объект РегулярноеВыражение

Начиная с версии платформы 1С 8.3.24, разработчики получили долгожданный встроенный объект РегулярноеВыражение. Это значительно упрощает код и повышает скорость работы по сравнению с использованием COM-объектов. Рассмотрим, как применить наше выражение в программном коде:


// Создаем объект регулярного выражения
Паттерн = "(\d+([.,]\d+)?)\s*(м|см|мм|дм|m)";
РегВыр = Новый РегулярноеВыражение(Паттерн, ПараметрыРегулярногоВыражения.Многострочный);

ТекстНаименования = "УП-17 краш. 6,0м";
Результат = РегВыр.Найти(ТекстНаименования);

Если Результат <> Неопределено Тогда
    // Извлекаем найденное значение
    НайденнаяСтрока = Результат.Значение;
    Сообщить("Найдена длина: " + НайденнаяСтрока);
КонецЕсли;

В данном примере мы создаем объект, инициализируем его шаблоном и выполняем поиск в строке. Если совпадение найдено, мы можем работать с результатом как с отдельной строкой или группой захвата.

Работа в старых версиях платформы через VBScript.RegExp

Если ваша конфигурация работает на более старой версии платформы, мы можем воспользоваться объектом VBScript.RegExp через механизм COM-соединения. Проанализируем пример кода для этого случая:


РегВыр = Новый COMОбъект("VBScript.RegExp");
РегВыр.IgnoreCase = Истина; // Игнорировать регистр
РегВыр.Global = Истина;     // Искать все вхождения
РегВыр.Pattern = "(\d+([.,]\d+)?)\s*(м|см|мм|дм)";

ТекстДляПоиска = "МУП 6,0м (Н-60, Н-75, Н-114)";
Matches = РегВыр.Execute(ТекстДляПоиска);

Для Каждого Match Из Matches Цикл
    Сообщить("Найдено совпадение: " + Match.Value);
КонецЦикла;

Важно помнить, что при использовании VBScript.RegExp работа с кириллицей и границами слов (\b) может иметь свои особенности, поэтому рекомендуется тестировать сложные паттерны на реальных данных.

Проблема «грязных» данных и технические нюансы

При массовой обработке справочника «Номенклатура» мы неизбежно столкнемся с нестандартными ситуациями. Выясним основные причины ошибок и способы их решения:

Инструменты для отладки

Чтобы не тратить время на постоянный перезапуск кода в 1С при подборе шаблона, мы рекомендуем использовать специализированные инструменты:

  1. Консоль регулярных выражений: В составе популярных «Инструментов разработчика» для 1С есть специальная консоль. Она позволяет вставить список наименований из справочника и в реальном времени видеть, какие строки попадают под ваш паттерн.
  2. Онлайн-тестеры: Сервисы вроде Regex101 позволяют визуализировать работу каждой части выражения и понять, где именно происходит сбой.

Альтернативные подходы

В некоторых случаях, если структура наименования строго регламентирована (например, длина всегда идет в конце после последнего пробела), использование регулярных выражений может быть избыточным. В таких ситуациях можно использовать комбинацию функций СтрНайти, СтрЗаменить и СтрРазделить. Это работает быстрее на очень больших массивах данных (сотни тысяч записей), но требует гораздо более длинного и менее гибкого кода.

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

← На главную