Как заменить несколько различных символов и знаков в строке 1С на один нужный элемент

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

При работе с текстовыми данными в 1С программисты часто сталкиваются с задачей «очистки» строки. Например, при формировании имени файла из названия контрагента или подготовке URL-ссылки необходимо заменить все недопустимые знаки (пунктуацию, спецсимволы) на один стандартный символ, например, нижнее подчеркивание _. Использование множества последовательных вызовов функции СтрЗаменить делает код громоздким и трудночитаемым. В этой статье мы подробно разберем, как решить эту задачу элегантно и эффективно.

Метод 1: Использование функций СтрРазделить и СтрСоединить

Этот метод является наиболее современным и эффективным для платформы 1С:Предприятие, начиная с версии 8.3.10. Основная идея заключается в том, чтобы использовать строку «запрещенных» символов в качестве набора разделителей. Функция СтрРазделить разобьет исходный текст в массив, удалив все указанные знаки, а СтрСоединить соберет его обратно, вставив между фрагментами нужный нам символ замены.

Рассмотрим по шагам, как это реализовать:


// Исходная строка с лишними знаками
ИсходнаяСтрока = "Привет, мир! (тест; текста: №1)";

// Список символов, которые нужно заменить
Разделители = "!"№;%:?**(),.\"; 

// Символ, на который производим замену
Заменитель = "_";

// Выполняем преобразование
МассивЧастей = СтрРазделить(ИсходнаяСтрока, Разделители, Ложь);
Результат = СтрСоединить(МассивЧастей, Заменитель);

Важный нюанс: Третий параметр функции СтрРазделить (ВключатьПустые) определяет, нужно ли создавать пустые элементы в массиве, если два запрещенных символа стоят рядом. Если передать Ложь, то несколько знаков подряд (например, !!) будут заменены на один символ подчеркивания. Если передать Истина, то на месте каждого знака появится подчеркивание.

Метод 2: Циклический обход строки символов

Проанализируем классический подход, который подходит для более старых версий платформы или ситуаций, когда список заменяемых символов невелик. Вместо того чтобы писать 10 строк с СтрЗаменить, мы поместим все знаки в одну переменную и пройдем по ним в цикле.

Разберем пример кода:


МояСтрока = "Текст с (ошибками), знаками; и №...";
СимволыДляЗамены = "!"№;%:?*(),.\";
СимволЗамены = "_";

Для к = 1 По СтрДлина(СимволыДляЗамены) Цикл
    ТекСимвол = Сред(СимволыДляЗамены, к, 1);
    МояСтрока = СтрЗаменить(МояСтрока, ТекСимвол, СимволЗамены);
КонецЦикла;

Этот способ прост в понимании, однако стоит помнить о производительности. В 1С строки являются неизменяемыми объектами. Это значит, что при каждом вызове СтрЗаменить в памяти создается новая копия всей строки. Если ваша строка содержит десятки тысяч символов, такой цикл может работать медленно.

Метод 3: Использование регулярных выражений (VBScript.RegExp)

Выясним, как решить задачу наиболее профессионально, если мы работаем в среде Windows. Регулярные выражения позволяют не перечислять каждый символ вручную, а задать шаблон. Например, мы можем сказать системе: «замени всё, что не является буквой или цифрой».

Посмотрим на пример реализации через COM-объект:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр
RegExp.Global = Истина;     // Искать все вхождения

// Шаблон [^а-яА-Яa-zA-Z0-9] означает: всё, что НЕ буквы и НЕ цифры
RegExp.Pattern = "[^а-яА-Яa-zA-Z0-9]"; 

ИсходнаяСтрока = "Проверка! 123 @#$%";
Результат = RegExp.Replace(ИсходнаяСтрока, "_");

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

Метод 4: Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация разработана на базе современных типовых решений (УТ 11, БП 3.0, ERP), в ней наверняка есть модуль СтроковыеФункцииКлиентСервер. Проанализируем возможности этой библиотеки. В ней часто содержатся готовые инструменты для работы с именами файлов или очистки строк.

Например, если ваша задача — подготовить строку для сохранения файла на диске, воспользуйтесь следующим методом:


ИмяФайла = "Отчет/За!январь:2023.xlsx";
// Получаем системные недопустимые символы
ЗапрещенныеСимволы = ПолучитьНедопустимыеСимволыВИмениФайла();
// Используем связку методов для очистки
Результат = СтрСоединить(СтрРазделить(ИмяФайла, ЗапрещенныеСимволы, Ложь), "_");

Также в БСП есть полезная функция ЗаменитьНедопустимыеСимволыXML, которая помогает подготовить текст для передачи в формате XML, заменяя специфические знаки на их безопасные аналоги.

Метод 5: Фильтрация по кодам символов

Рассмотрим ситуацию, когда список запрещенных символов заранее неизвестен, и нам нужно оставить в строке только «белые» символы (буквы и цифры). В этом случае мы можем перебрать исходную строку и проверять код каждого знака через КодСимвола.


Функция ОчиститьСтроку(Знач ИсходнаяСтрока)
    Результат = "";
    Для к = 1 По СтрДлина(ИсходнаяСтрока) Цикл
        Символ = Сред(ИсходнаяСтрока, к, 1);
        Код = КодСимвола(Символ);
        
        // Коды цифр 48-57, латиницы 65-90, 97-122, кириллицы 1040-1103
        Если (Код >= 48 И Код <= 57) Или (Код >= 1040 И Код <= 1103) Тогда
            Результат = Результат + Символ;
        Иначе
            Результат = Результат + "_";
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Этот метод дает полный контроль над процессом, но требует внимательности при определении диапазонов кодов (не забудьте про букву «ё», у которой код выбивается из общего диапазона кириллицы).

Важные рекомендации по работе со спецсимволами

При реализации любого из перечисленных методов обратите внимание на следующие моменты:

  1. Двойные кавычки: В языке 1С двойная кавычка внутри строки экранируется еще одной кавычкой. Если вам нужно включить её в список разделителей, это будет выглядеть так: Символы = "!"";" (здесь "" превратится в одну кавычку внутри строки).
  2. Символы переноса строк: Если нужно удалять или заменять переносы строк, используйте системные константы Символы.ПС (Перевод Строки) или Символы.ВК (Возврат Каретки).
  3. Производительность на больших данных: Если вам нужно обработать текст размером в несколько мегабайт, забудьте про конкатенацию строк (Строка = Строка + НовыйСимвол). Вместо этого добавляйте символы в Массив, а в конце используйте СтрСоединить. Это ускорит работу в десятки раз.
  4. Транслитерация: Иногда просто заменить символы недостаточно. Если вы готовите строку для веб-ссылки, лучше использовать функцию транслитерации (например, СтроковыеФункцииКлиентСервер.Латинизировать), которая заменит «щ» на «sh», а не просто на подчеркивание.

Подводя итог, можно сказать: для большинства повседневных задач в 1С 8.3 лучшим выбором будет связка СтрРазделить + СтрСоединить. Она лаконична, не требует внешних библиотек и работает очень быстро.

← На главную