При работе с большими базами данных номенклатуры часто возникает задача нормализации данных. Одной из типичных проблем является извлечение числовых характеристик, таких как длина, ширина или вес, которые «зашиты» непосредственно в текстовое наименование. Например, из строки «УП-17 краш. 6,0м» нам необходимо получить число 6.0 для записи в отдельный реквизит. Писать сложный алгоритм с перебором символов — задача трудоемкая и не всегда эффективная. В таких случаях на помощь приходят регулярные выражения (RegExp).
В этой статье мы подробно разберем, как составить правильный шаблон поиска, какие инструменты 1С использовать для реализации и на какие «подводные камни» стоит обратить внимание при обработке реальных данных из справочников.
Рассмотрим типичные примеры наименований, из которых нужно извлечь длину:
На первый взгляд, нам нужно найти последовательность цифр, разделенных запятой, после которых идет буква «м». Простейший вариант регулярного выражения, предложенный в обсуждении, выглядит так: \b\d+,\d+м\b.
Разберем, что означают эти символы:
\b — граница слова. Это позволяет избежать случайного срабатывания внутри артикулов или других сложных кодов.\d+ — поиск одной или более цифр., — поиск символа запятой как разделителя дробной части.м — поиск буквы «м» как единицы измерения.Однако на практике такой шаблон быстро «сломается», так как он не учитывает целые числа (например, «6м» вместо «6,0м») и возможные точки в качестве разделителей.
Для того чтобы наше решение было устойчивым, проанализируем ситуацию глубже и составим более гибкий паттерн. Нам необходимо учитывать, что в базе могут быть разные единицы измерения (метры, сантиметры, миллиметры) и разные форматы написания чисел.
Оптимальный вариант шаблона будет выглядеть следующим образом:
(\d+([.,]\d+)?)\s*(м|см|мм|дм|m)
Разберем по шагам, почему эта конструкция эффективнее:
6), так и дробное (6.0 или 6,0). Знак вопроса после вложенной скобки делает дробную часть необязательной.Начиная с версии платформы 1С 8.3.24, разработчики получили долгожданный встроенный объект РегулярноеВыражение. Это значительно упрощает код и повышает скорость работы по сравнению с использованием COM-объектов. Рассмотрим, как применить наше выражение в программном коде:
// Создаем объект регулярного выражения
Паттерн = "(\d+([.,]\d+)?)\s*(м|см|мм|дм|m)";
РегВыр = Новый РегулярноеВыражение(Паттерн, ПараметрыРегулярногоВыражения.Многострочный);
ТекстНаименования = "УП-17 краш. 6,0м";
Результат = РегВыр.Найти(ТекстНаименования);
Если Результат <> Неопределено Тогда
// Извлекаем найденное значение
НайденнаяСтрока = Результат.Значение;
Сообщить("Найдена длина: " + НайденнаяСтрока);
КонецЕсли;
В данном примере мы создаем объект, инициализируем его шаблоном и выполняем поиск в строке. Если совпадение найдено, мы можем работать с результатом как с отдельной строкой или группой захвата.
Если ваша конфигурация работает на более старой версии платформы, мы можем воспользоваться объектом 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) может иметь свои особенности, поэтому рекомендуется тестировать сложные паттерны на реальных данных.
При массовой обработке справочника «Номенклатура» мы неизбежно столкнемся с нестандартными ситуациями. Выясним основные причины ошибок и способы их решения:
\s может его не распознать. Рекомендуется предварительно нормализовать строку, заменяя Символ(160) на обычный пробел.Чтобы не тратить время на постоянный перезапуск кода в 1С при подборе шаблона, мы рекомендуем использовать специализированные инструменты:
В некоторых случаях, если структура наименования строго регламентирована (например, длина всегда идет в конце после последнего пробела), использование регулярных выражений может быть избыточным. В таких ситуациях можно использовать комбинацию функций СтрНайти, СтрЗаменить и СтрРазделить. Это работает быстрее на очень больших массивах данных (сотни тысяч записей), но требует гораздо более длинного и менее гибкого кода.
Подводя итог, можно сказать, что использование регулярных выражений в 1С — это современный и эффективный стандарт для извлечения данных. Правильно составленный шаблон позволит вам автоматизировать заполнение свойств номенклатуры и значительно сократить объем ручного труда при наведении порядка в базе данных.