Как удалить повторяющиеся символы из начала строки в 1С?

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

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

Метод 1: Циклический перебор (Классический подход)

Проанализируем простейшее решение, которое будет работать на любой версии платформы 1С. Суть метода заключается в последовательной проверке первого символа строки. Если символ совпадает с удаляемым, мы «отрезаем» его и повторяем проверку.

Для реализации воспользуемся функциями Лев и Сред. Разберем по шагам код:


// Допустим, СтрокаТабуретки = "****Табуретка 30*30 см"
УдаляемыйСимвол = "*";
Пока Лев(СтрокаТабуретки, 1) = УдаляемыйСимвол Цикл
    СтрокаТабуретки = Сред(СтрокаТабуретки, 2);
КонецЦикла;

Этот алгоритм надежен, так как он останавливается сразу, как только встретит первый символ, отличный от звездочки. Это гарантирует, что символы внутри строки (например, размеры «30*30») останутся нетронутыми.

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

Выясним причину, по которой стандартная функция СтрЗаменить не подходит для решения данной задачи. Если мы попробуем выполнить код СтрЗаменить(Строка, "*", ""), платформа удалит все вхождения символа во всей строке. В примере с товаром «****Табуретка 30*30» результат превратится в «Табуретка 3030», что является потерей данных.

Метод 2: Регулярные выражения (Платформа 8.3.24+)

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

Посмотрим на пример использования:


// Шаблон "^" означает начало строки, "\*" — экранирование спецсимвола, "+" — одно или более повторений
Результат = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, "^\*+", "");

Этот метод работает мгновенно и сразу обрабатывает любое количество идущих подряд символов в начале строки.

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

Если ваша конфигурация работает на версии платформы ниже 8.3.24, мы можем воспользоваться COM-объектом. Это стандартное решение для работы с регулярными выражениями в операционной системе Windows.


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^\*+"; // Ищем звездочки в начале строки
RegExp.IgnoreCase = Истина;
RegExp.Global = Ложь;
Результат = RegExp.Replace(ИсходнаяСтрока, "");

Метод 4: Оптимизированный поиск позиции (Алгоритмический подход)

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

Вместо постоянного изменения строки, мы сначала найдем позицию первого полезного символа:


ДлинаСтроки = СтрДлина(Строка);
Позиция = 1;
Пока Позиция <= ДлинаСтроки Цикл
    Если КодСимвола(Строка, Позиция) <> КодСимвола("*") Тогда
        Прервать;
    КонецЕсли;
    Позиция = Позиция + 1;
КонецЦикла;
Результат = Сред(Строка, Позиция);

В данном случае функция Сред вызывается всего один раз, что значительно экономит ресурсы памяти и процессора.

Ограничения стандартных функций СокрЛ и СокрП

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

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

← На главную