Как удалить несколько разных символов из строки в 1С: разбираем все способы

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

В процессе разработки в 1С часто возникает задача «очистить» строку от лишних символов: пробелов, тире, звездочек, точек или других знаков пунктуации. Начинающие разработчики часто пытаются передать массив нежелательных символов напрямую в функцию СтрЗаменить, ожидая, что платформа сама обработает список. Однако это приводит к ошибке или отсутствию результата, так как штатные функции 1С имеют свои строгие правила работы.

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

Почему СтрЗаменить не работает с массивом напрямую?

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

  1. Источник — строка, в которой производится замена.
  2. ПодстрокаПоиска — строка (именно строка!), которую нужно найти.
  3. ПодстрокаЗамены — строка, на которую мы заменяем найденное.

Когда мы пытаемся передать массив в качестве второго параметра, платформа 1С не может автоматически сопоставить коллекцию данных с ожидаемым строковым типом. В результате замена просто не происходит. Чтобы решить эту задачу, нам нужно организовать процесс перебора каждого символа из нашего списка.

Способ 1. Использование цикла для обхода массива

Это самый очевидный и понятный способ. Мы создаем коллекцию (массив) со всеми «плохими» символами и в цикле вызываем СтрЗаменить для каждого из них. Рассмотрим пример реализации:


МассивСимволов = Новый Массив;
МассивСимволов.Добавить(".");
МассивСимволов.Добавить("/");
МассивСимволов.Добавить("-");
МассивСимволов.Добавить("_");
МассивСимволов.Добавить("*");
МассивСимволов.Добавить(" ");

Текст = "Товар.123/45-6_АБ*В";

Для Каждого ТекущийСимвол Из МассивСимволов Цикл
    Текст = СтрЗаменить(Текст, ТекущийСимвол, "");
КонецЦикла;

// Результат: "Товар123456АБВ"

Преимущество этого метода: максимальная читаемость. Любой программист, который будет читать ваш код позже, сразу поймет, какие именно символы удаляются.

Способ 2. Перебор строки-шаблона (минимализм)

Если нам нужно удалить только одиночные символы, создавать массив может быть избыточно. Мы можем записать все ненужные знаки в одну строку и перебирать её посимвольно. Проанализируем, как это выглядит в коде:


СтрНежелательные = "./-_* ";
Текст = "Товар.123/45-6_АБ*В";

Для А = 1 ПО СтрДлина(СтрНежелательные) Цикл
    СимволДляУдаления = Сред(СтрНежелательные, А, 1);
    Текст = СтрЗаменить(Текст, СимволДляУдаления, "");
КонецЦикла;

Этот вариант короче, но у него есть ограничение: он подходит только для замены одиночных символов. Если вам нужно удалить из текста целые слова или сочетания знаков (например, " (ООО) " или " д. "), лучше использовать массив строк.

Способ 3. Использование регулярных выражений (RegExp)

Для продвинутых задач, когда нужно удалить, например, «все, кроме цифр» или «всю пунктуацию», циклы с СтрЗаменить становятся громоздкими. В 1С нет встроенного объекта для регулярных выражений, но мы можем воспользоваться COM-объектом VBScript.RegExp. Это гораздо эффективнее с точки зрения производительности при больших объемах данных.

Разберем пример удаления всех нецифровых символов из строки:


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

// Шаблон [^0-9] означает "все, что не является цифрой"
RegExp.Pattern = "[^0-9]";

Текст = "Счет № 45-001 от 12.01.2023";
Результат = RegExp.Replace(Текст, ""); 
// Результат: "4500112012023"

Важно: этот метод работает только на Windows-серверах и клиентах, так как использует технологию COM.

Способ 4. Современный метод СтрРазделить и СтрСоединить

Начиная с версии платформы 8.3.10, в арсенале разработчика появились мощные функции для работы со строками. Мы можем «разрезать» строку на части, используя массив символов как разделители, а затем «склеить» части обратно. Это работает очень быстро.


МассивСимволов = Новый Массив;
МассивСимволов.Добавить(".");
МассивСимволов.Добавить("-");

Текст = "Арт.123-ББ";

// Разбиваем строку на части, удаляя разделители
ЧастиСтроки = СтрРазделить(Текст, МассивСимволов, Ложь);

// Соединяем части без разделителей
ТекстОчищенный = СтрСоединить(ЧастиСтроки, "");
// Результат: "Арт123ББ"

Важный нюанс: порядок замены и длина строк

Проанализируем ситуацию: нам нужно заменить в тексте «1С:Предприятие 8.3» на «Программа», а «1С» на «Компания». Если мы сначала заменим «1С», то получим строку «Компания:Предприятие 8.3». Правило для «1С:Предприятие» уже не сработает, так как исходная подстрока изменилась.

Золотое правило: если вы заменяете подстроки разной длины, всегда начинайте с самых длинных. Перед выполнением цикла по массиву замен рекомендуется отсортировать этот массив по убыванию длины строк. Это гарантирует, что сначала будут обработаны сложные фразы, а затем — одиночные символы.

Использование функций БСП

Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), не изобретайте велосипед. В модуле СтроковыеФункцииКлиентСервер уже реализовано множество полезных инструментов. Рассмотрим функцию РазложитьСтрокуВМассивПодстрок или специализированные методы для очистки строк от нежелательных символов. Использование стандартных функций повышает надежность кода, так как они уже прошли тестирование на различных версиях платформы.

Подведем итоги

Мы выяснили, что для удаления группы символов в 1С нельзя просто передать массив в СтрЗаменить. Вместо этого мы:

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

← На главную