При разработке и сопровождении конфигураций на платформе 1С:Предприятие программисты регулярно сталкиваются с необходимостью обработки текстовой информации. Одной из типовых задач является очистка текста: удаление лишних слов, вырезание определенных подстрок, очистка от мусорных символов или знаков препинания. В этой статье мы подробно разберем, как решать эту задачу правильно, начиная от классических алгоритмов ручного разбора и заканчивая современными инструментами платформы.
Рассмотрим базовый подход, который работает на абсолютно любых версиях платформы 1С. Этот метод основан на поиске вхождения символов и последующем вырезании нужных частей строки с помощью функций Лев(), Прав(), Сред() и Найти() (или СтрНайти() в новых версиях).
Разберем пример пользовательских функций, которые помогают разбить строку по разделителям и выделить нужные фрагменты:
Функция ВыделитьСтрокуДоСимвола(_Строка, _Символ) Экспорт
_Поз = Найти(_Строка, _Символ);
Если _Поз <> 0 Тогда
Возврат Лев(_Строка, _Поз - 1);
КонецЕсли;
Возврат _Строка;
КонецФункции
Функция ВыделитьСтрокуПослеСимвола(_Строка, _Символ) Экспорт
_Поз = Найти(_Строка, _Символ);
Если _Поз <> 0 Тогда
Возврат Сред(_Строка, _Поз + 1);
КонецЕсли;
Возврат "";
КонецФункции
Функция ВыделитьСтрокуМеждуСимволами(_Строка, _Символ1, _Символ2) Экспорт
_Поз1 = Найти(_Строка, _Символ1);
_Поз2 = Найти(_Строка, _Символ2);
Если (_Поз1 <> 0) И (_Поз2 <> 0) И (_Поз1 < _Поз2) Тогда
Возврат Сред(_Строка, _Поз1 + 1, _Поз2 - _Поз1 - 1);
КонецЕсли;
Возврат "";
КонецФункции
Проанализируем ситуацию, когда нам нужно удалить конкретное слово из строки, зная его позицию. Посмотрим на следующий пример кода:
ИсходнаяСтрока = "один два три четыре";
Поз = СтрНайти(ИсходнаяСтрока, "три");
Если Поз > 0 Тогда
Часть1 = Лев(ИсходнаяСтрока, Поз - 1);
Часть2 = Сред(ИсходнаяСтрока, Поз + СтрДлина("три"));
ИтоговыйРезультат = СокрЛП(Часть1 + Часть2);
КонецЕсли;
// Результат: "один два четыре"
Важное замечание: Этот метод надежен и не требует современных версий платформы, однако он становится крайне громоздким, если нам нужно удалять слова по сложному шаблону или когда целевое слово встречается в строке многократно.
Начиная с версии платформы 8.3.6, разработчикам стали доступны высокопроизводительные функции СтрРазделить() и СтрСоединить(). Они позволяют мгновенно преобразовывать строки в массивы и обратно на уровне самой платформы, минуя медленные циклы на встроенном языке.
Рассмотрим алгоритм решения нашей задачи через работу с массивом слов:
Разберем по шагам практическую реализацию этого алгоритма:
ИсходныйТекст = "один два три четыре";
СловоДляУдаления = "три";
// Шаг 1: Разбиваем строку в массив по пробелам
МассивСлов = СтрРазделить(ИсходныйТекст, " ", Ложь);
// Шаг 2: Находим индекс ненужного слова
Индекс = МассивСлов.Найти(СловоДляУдаления);
Пока Индекс <> Неопределено Цикл
МассивСлов.Удалить(Индекс);
// Ищем повторные вхождения, если они могут быть
Индекс = МассивСлов.Найти(СловоДляУдаления);
КонецЦикла;
// Шаг 3: Собираем массив обратно в строку
Результат = СтрСоединить(МассивСлов, " ");
// Результат: "один два четыре"
Этот способ работает значительно быстрее ручного посимвольного перебора и отлично подходит для задач, когда нужно анализировать и фильтровать отдельные слова в предложениях.
Если вы работаете на современных версиях платформы 1С:Предприятие (начиная с 8.3.23), вам доступен самый мощный и гибкий инструмент для работы с текстом — встроенные регулярные выражения. С их помощью можно удалять не просто конкретные слова, а целые паттерны и шаблоны (например, любые слова, начинающиеся на определенную букву, или последовательности цифр).
Для удаления подстрок используется функция глобального контекста СтрЗаменитьПоРегулярномуВыражению(). Посмотрим на пример ее использования:
ИсходныйТекст = "один два три четыре";
// Шаблон \bтри\b находит слово "три" как отдельное слово, а \s* захватывает идущие за ним пробелы
ШаблонРегЭкс = "\bтри\b\s*";
Результат = СтрЗаменитьПоРегулярномуВыражению(ИсходныйТекст, ШаблонРегЭкс, "");
// Результат: "один два четыре"
Использование встроенных регулярных выражений позволяет сократить код до одной строки, обеспечивая при этом максимальную скорость выполнения на стороне сервера.
Если ваша рабочая база запущена на платформе версии ниже 8.3.23 или в конфигурации включен режим совместимости со старыми версиями, вы все равно можете использовать регулярные выражения. Для этого на Windows-серверах можно задействовать COM-объект операционной системы.
Проанализируем пример кода с использованием объекта VBScript.RegExp:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр букв
RegExp.Global = Истина; // Заменять все вхождения в строке
RegExp.Pattern = "\bтри\b\s*";
ИсходныйТекст = "один два три четыре";
Результат = RegExp.Replace(ИсходныйТекст, "");
// Результат: "один два четыре"
Важно помнить: Этот метод не будет работать на серверах под управлением операционной системы Linux. Если ваша система кроссплатформенная, лучше использовать метод с разбиением строки в массив.
В реальной разработке внутри крупных типовых конфигураций (таких как 1С:ERP, 1С:УТ, 1С:Бухгалтерия) уже есть готовые оптимизированные функции общего назначения. Писать собственные алгоритмы часто нет необходимости — достаточно обратиться к общему модулю СтроковыеФункцииКлиентСервер.
Например, для удаления лишних двойных или тройных пробелов, которые могут образоваться после ручного вырезания слов, можно использовать готовую функцию:
// Функция убирает повторяющиеся пробелы внутри строки и лишние пробелы по краям
ОчищенныйТекст = СтроковыеФункцииКлиентСервер.СократитьПробелы(ИсходныйТекст);
Если вам нужно разложить строку в массив на старых версиях платформ, где еще нет встроенной функции СтрРазделить(), БСП предоставляет надежный аналог:
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходныйТекст, " ");
Не забываем и про самый простой инструмент — стандартную функцию платформы СтрЗаменить(). Если перед вами стоит задача быстро убрать конкретное статическое слово из текста, и вы точно уверены, что оно не встретится внутри других слов как составная часть, используйте простую замену подстроки на пустую строку:
// Удаляем слово "три" вместе с пробелом перед ним
Результат = СтрЗаменить("один два три четыре", " три", "");
Подводя итог, выбор метода зависит от версии вашей платформы и сложности задачи. Для простых замен достаточно СтрЗаменить(). Для версий платформы 8.3.6 – 8.3.22 оптимальным выбором станет связка СтрРазделить() и СтрСоединить(). А для современных систем, начиная с 8.3.23, стандартом разработки является использование встроенных регулярных выражений.