Как убрать лидирующие нули в строке 1С

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

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

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

Метод 1. Использование цикла и строковых функций

Рассмотрим самый простой и универсальный способ, который работает практически на любой версии платформы. Логика заключается в том, чтобы проверять первый символ строки и, если он является нулем, отсекать его, пока строка не начнет начинаться с любого другого символа.

Разберем пример кода с использованием функций Лев и Прав:


Пока Лев(ВашаСтрока, 1) = "0" Цикл 
    ВашаСтрока = Прав(ВашаСтрока, СтрДлина(ВашаСтрока) - 1); 
КонецЦикла;

В этом примере мы используем цикл Пока. Функция Лев(ВашаСтрока, 1) возвращает крайний левый символ. Если он равен "0", мы перезаписываем переменную ВашаСтрока, забирая все символы, кроме первого, с помощью функции Прав.

Проанализируем более современную вариацию этого метода, которая появилась в версии 8.3.10. Здесь используется функция СтрНачинаетсяС и Сред, что делает код более читабельным:


Пока СтрНачинаетсяС(Строка, "0") Цикл 
    Строка = Сред(Строка, 2); 
КонецЦикла;

Функция Сред(Строка, 2) возвращает подстроку, начиная со второй позиции и до конца. Это избавляет нас от необходимости вычислять длину строки через СтрДлина.

Метод 2. Математическое преобразование типов

Если ваша строка гарантированно содержит только цифры, мы можем применить «хитрый» метод — преобразование строки в число и обратно. Платформа при приведении к числу автоматически отбрасывает все нули слева.

Посмотрим на пример реализации:


// Простой вариант
Результат = Строка(Число(ВашаСтрока));

// Правильный вариант с исключением разделителей групп
Результат = Формат(Число(ВашаСтрока), "ЧГ=0");

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

  1. Разделители групп: При обычном преобразовании Строка(Число) в больших числах могут появиться неразрывные пробелы (разделители тысяч). Чтобы этого избежать, всегда используйте функцию Формат с параметром ЧГ=0.
  2. Нецифровые символы: Если в строке встретятся буквы или спецсимволы, функция Число() вызовет ошибку выполнения.
  3. Длина числа: Если число очень длинное, может произойти потеря точности или округление, так как тип Число в 1С имеет свои ограничения.

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

Если вы ведете разработку в современной конфигурации (например, БП 3.0, УТ 11, ERP 2), лучше всего использовать готовые функции из состава БСП. Это обеспечит надежность и соответствие стандартам разработки фирмы «1С».

Рассмотрим функцию из общего модуля СтроковыеФункцииКлиентСервер:


// Удаление нулей с помощью БСП
ОчищеннаяСтрока = СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеСимволы(ВашаСтрока, "0");

Также в БСП есть специализированные функции для работы с номерами объектов. Например, в модуле ПрефиксацияОбъектовКлиентСервер существует логика для удаления префиксов и лидирующих нулей из номеров документов:


// Пример логики очистки номера
НомерБезНулей = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерДокумента, Истина, Ложь);

Использование таких методов предпочтительно, так как они уже учитывают множество краевых ситуаций, протестированы и оптимизированы.

Метод 4. Нестандартные строковые манипуляции

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

Один из таких способов — использование функции СтрРазделить для поиска первой значащей цифры:


// Удаление лидирующих символов через поиск первой значащей цифры
Номер = "0000123045";
Части = СтрРазделить(Номер, "123456789", Истина);
Если Части.Количество() > 0 Тогда
    ДлинаНулей = СтрДлина(Части[0]);
    Результат = Сред(Номер, ДлинаНулей + 1);
КонецЕсли;

Этот метод основан на том, что СтрРазделить с разделителями в виде всех цифр, кроме нуля, вернет в первом элементе массива все лидирующие нули. Узнав их длину, мы можем обрезать исходную строку одним вызовом Сред.

Метод 5. Регулярные выражения (RegExp)

Для продвинутых сценариев, когда нужно убрать нули в строке со сложной структурой, можно воспользоваться объектом VBScript.RegExp. Этот метод требует COM-объекта и работает только под Windows (на сервере или в толстом клиенте).


RegEx = Новый COMОбъект("VBScript.RegExp");
RegEx.Pattern = "^0+"; // Искать все нули в начале строки
RegEx.Global = Ложь;
Результат = RegEx.Replace(ВашаСтрока, "");

Паттерн ^0+ буквально означает: «найти последовательность из одного или более нулей, находящуюся в самом начале строки».

Обработка случая «Только нули»

При реализации любого из вышеперечисленных методов важно проанализировать ситуацию, когда вся строка состоит из нулей (например, "000"). Что должно остаться в итоге? Пустая строка или один ноль?

Если вы используете цикл Пока, на выходе вы получите пустую строку. Если бизнес-логика требует сохранить хотя бы один ноль, добавьте проверку:


Если ПустаяСтрока(Результат) И ЗначениеЗаполнено(ИсходнаяСтрока) Тогда
    Результат = "0";
КонецЕсли;

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

Мы рассмотрели пять различных подходов к удалению лидирующих нулей в 1С. Подведем краткий итог:

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

← На главную