Как эффективно убрать лидирующие нули в строке 1С: обзор лучших методов

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

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

Способ 1: Использование функций преобразования и форматирования

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


// Допустим, Значение = "00000123"
Результат = Формат(Число(Значение), "ЧГ=0");
// Результат станет "123"

Важные нюансы этого метода:

  1. Если в строке есть префиксы (например, "А000123"), функция Число() вызовет ошибку.
  2. Для очень длинных строк (более 15–20 символов) может произойти потеря точности или округление из-за особенностей хранения типа Число.
  3. Если исходная строка — "000", результатом будет "0".

Способ 2: Классический цикл с обрезкой строки

Если строка может содержать не только цифры или вам нужно гарантированно работать только со строковым типом, рассмотрим подробнее алгоритм с циклом. Мы будем проверять первый символ строки и, если это "0", отсекать его.


Пока Лев(Значение, 1) = "0" Цикл
    Значение = Сред(Значение, 2);
КонецЦикла;

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


Для к = 1 По СтрДлина(Значение) Цикл
    Если Сред(Значение, к, 1) <> "0" Тогда
        Значение = Сред(Значение, к);
        Прервать;
    КонецЕсли;
КонецЦикла;

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

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

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


// Использование стандартной функции БСП
Результат = ОбщегоНазначенияКлиентСервер.УдалитьПовторяющиесяСимволыСлева(Значение, "0");

Это «правильный» способ с точки зрения профессиональной разработки, так как он делает код более читаемым и стандартизированным.

Способ 4: Манипуляции со строковыми функциями (Трюк с СтрЗаменить)

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

  1. Заменяем все нули на пробелы.
  2. Удаляем лидирующие пробелы функцией СокрЛ().
  3. Заменяем оставшиеся пробелы обратно на нули.

ИсходнаяСтрока = "0000078009000";
// 1. "     78  9   "
// 2. "78  9   "
// 3. "78009000"
Результат = СтрЗаменить(СокрЛ(СтрЗаменить(ИсходнаяСтрока, "0", " ")), " ", "0");

Внимание: этот метод корректен только в том случае, если в исходной строке изначально нет пробелов. Если они там есть, структура строки будет нарушена.

Способ 5: Удаление нулей и префикса в запросе

Иногда лидирующие нули нужно убрать прямо в запросе, например, при формировании отчета на СКД. Поскольку в языке запросов 1С нет полноценных циклов, используется конструкция ВЫБОР или комбинация СТРЗАМЕНИТЬ. Проанализируем пример реализации "трюка с пробелами" прямо в тексте запроса:


ВЫБРАТЬ
    СТРЗАМЕНИТЬ(СОКРЛ(СТРЗАМЕНИТЬ(Таблица.Номер, "0", " ")), " ", "0") КАК НомерБезНулей
ИЗ
    Справочник.Номенклатура КАК Таблица

Способ 6: Элегантный метод через СтрРазделить (для платформы 8.3.10+)

Один из самых современных и быстрых способов — использование функции СтрРазделить(). Она позволяет мгновенно вычислить длину «нулевого хвоста» слева, если в строке есть хотя бы один символ, отличный от нуля.


// Отрезаем всё, что совпадает с длиной массива пустых строк до первой цифры
Номер = "0000012345";
Результат = Сред(Номер, СтрДлина(СтрРазделить(Номер, "123456789")[0]) + 1);

Здесь мы используем цифры 1–9 как разделители. Первый элемент полученного массива — это и есть последовательность лидирующих нулей. Узнав его длину, мы просто забираем остаток строки. Для сопоставления и очистки строк по шаблонам можно использовать подсистему регулярных выражений для 1С.

Какой метод выбрать?

Подведем итоги нашего анализа:

Помните о «крайнем случае»: если ваша строка состоит только из нулей ("000"), большинство функций обрезки вернут пустую строку. Если бизнес-логика требует в таком случае возвращать "0", обязательно добавьте проверку: Результат = ?(Результат = "", "0", Результат);.

← На главную