При работе с каталогами товаров часто возникает задача разделения сложной строки на составные части. Например, когда артикул, наименование и дополнительные характеристики (размер, комплектация) записаны в одну строку, и их нужно разнести по разным реквизитам справочника. Рассмотрим классическую ситуацию: у нас есть строка вида Артикул: 097. Комплект постельного белья "Фантазия"(1,5 спальный), которую нужно разбить по последней кавычке.
В данной статье мы проанализируем несколько способов решения этой задачи: от использования классических функций работы со строками до современных возможностей регулярных выражений в платформе 1С.
Начиная с современных версий платформы 8.3, функция СтрНайти стала значительно мощнее. Разберем самый эффективный и быстрый способ решения задачи без привлечения тяжелых механизмов регулярных выражений. Нам нужно найти позицию последней закрывающей кавычки или первой открывающей скобки после названия.
Проанализируем программный код, который позволяет найти нужный разделитель, двигаясь с конца строки:
ИсходнаяСтрока = "Артикул: 097. Комплект постельного белья (КПБ) из сатина (Д) ""Фантазия""(1,5 спальный (2 наволочки))";
Стр = СокрЛП(ИсходнаяСтрока);
// Ищем позицию открывающей скобки, которая идет сразу после кавычек
// НаправлениеПоиска.СКонца позволяет найти именно последнее вхождение
НомерРазделителя = СтрНайти(Стр, "(", НаправлениеПоиска.СКонца, , 1);
Если НомерРазделителя > 0 Тогда
// Первая часть: все до скобки (название с кавычкой)
Стр1 = СокрЛП(Сред(Стр, 1, НомерРазделителя - 1));
// Вторая часть: содержимое скобок без первой и последней скобки
// Убираем внешние скобки через функцию Сред
Стр2 = Сред(Стр, НомерРазделителя + 1);
Стр2 = Лев(Стр2, СтрДлина(Стр2) - 1); // Отрезаем последнюю ")"
Сообщить("Часть 1: " + Стр1);
Сообщить("Часть 2: " + Стр2);
КонецЕсли;
Преимущества этого метода: он работает максимально быстро и является кроссплатформенным (будет работать и на Windows, и на Linux серверах).
Если вы используете актуальную версию платформы (8.3.24 и выше), вам больше не нужны внешние компоненты. Теперь в 1С есть встроенный объект РегулярноеВыражение. Рассмотрим, как применить его для нашей задачи с использованием "групп захвата".
Выясним причину популярности регулярных выражений: они позволяют описать сложный шаблон поиска одной строкой. Разберем по шагам создание шаблона:
(.*") — Первая группа захвата. Точка и звездочка означают "любые символы", а кавычка в конце ограничивает захват последним найденным символом кавычки.\( — Экранированная открывающая скобка. Мы ищем ее буквально.(.*) — Вторая группа захвата. Забирает все содержимое внутри скобок.\) — Экранированная закрывающая скобка в конце строки.Пример реализации на встроенном объекте:
Шаблон = "(.*"")\((.*)\)";
РегВыр = Новый РегулярноеВыражение(Шаблон, Истина); // Истина - игнорировать регистр
Результат = РегВыр.НайтиСовпадения(ИсходнаяСтрока);
Если Результат.Количество() > 0 Тогда
Совпадение = Результат[0];
// Индекс 0 - это вся найденная строка,
// Индексы 1 и 2 - это наши группы в скобках
Стр1 = Совпадение.Группы[1].Значение;
Стр2 = Совпадение.Группы[2].Значение;
КонецЕсли;
Если ваша конфигурация работает на версии платформы ниже 8.3.24 и только под управлением Windows, можно использовать COM-объект. Это "традиционный" способ, который часто встречается в старых обработках. Проанализируем ситуацию: объект создается в операционной системе и вызывается из кода 1С.
Важный момент: при работе с этим объектом следует помнить о свойстве Global. Если оно установлено в Ложь, поиск прекратится после первого найденного совпадения.
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
// Шаблон: ищем текст до кавычки и текст в скобках
RegExp.Pattern = "(.*"")\((.*)\)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Если Matches.Count > 0 Тогда
Match = Matches.Item(0);
ПерваяЧасть = Match.SubMatches.Item(0);
ВтораяЧасть = Match.SubMatches.Item(1);
КонецЕсли;
Внимание: данный метод не рекомендуется использовать в современных системах, так как он привязывает ваш код к операционной системе Windows и работает медленнее встроенных функций.
Иногда формат строки строго фиксирован. Если мы точно знаем, что кавычка " является уникальным разделителем, мы можем воспользоваться функцией СтрРазделить. Посмотрим на пример:
// Разделяем строку по символу кавычки
МассивЧастей = СтрРазделить(ИсходнаяСтрока, """");
// Если в строке было две кавычки (вокруг названия "Фантазия"),
// то массив будет содержать части до, внутри и после кавычек.
Если МассивЧастей.Количество() >= 3 Тогда
// Собираем название обратно до последней кавычки
Стр1 = МассивЧастей[0] + """" + МассивЧастей[1] + """";
// Оставшаяся часть - это характеристики
Стр2 = СокрЛП(МассивЧастей[2]);
// Удаляем лишние скобки в начале и конце
Стр2 = СтрЗаменить(Стр2, "(", "");
Стр2 = СтрЗаменить(Стр2, ")", "");
КонецЕсли;
Рассмотрим подробнее, какой метод выбрать в зависимости от условий задачи:
VBScript.RegExp. В облачных сервисах 1С или на серверах под Linux этот код приведет к критической ошибке.Подводя итог, отметим: регулярные выражения — это мощный инструмент, но в 1С часто эффективнее использовать простые функции работы со строками, такие как Сред, Лев, Прав и СтрНайти. Это делает ваш код более читаемым для других разработчиков и упрощает его отладку.