В процессе разработки на платформе 1С программисты часто сталкиваются с необходимостью обработки строковых данных. Одной из типичных задач является удаление лидирующих (ведущих) нулей в строке. Это актуально при работе с артикулами товаров, номерами документов, кодами справочников или любыми другими данными, где нули в начале строки носят чисто технический характер и не несут смысловой нагрузки при выводе на печать или поиске.
В этой статье мы подробно разберем различные подходы к решению этой задачи: от классических циклов до использования современных функций платформы и механизмов Библиотеки стандартных подсистем (БСП). Мы проанализируем преимущества и недостатки каждого метода, чтобы вы могли выбрать наиболее подходящий для вашего случая.
Рассмотрим самый простой и универсальный способ, который работает практически на любой версии платформы. Логика заключается в том, чтобы проверять первый символ строки и, если он является нулем, отсекать его, пока строка не начнет начинаться с любого другого символа.
Разберем пример кода с использованием функций Лев и Прав:
Пока Лев(ВашаСтрока, 1) = "0" Цикл
ВашаСтрока = Прав(ВашаСтрока, СтрДлина(ВашаСтрока) - 1);
КонецЦикла;
В этом примере мы используем цикл Пока. Функция Лев(ВашаСтрока, 1) возвращает крайний левый символ. Если он равен "0", мы перезаписываем переменную ВашаСтрока, забирая все символы, кроме первого, с помощью функции Прав.
Проанализируем более современную вариацию этого метода, которая появилась в версии 8.3.10. Здесь используется функция СтрНачинаетсяС и Сред, что делает код более читабельным:
Пока СтрНачинаетсяС(Строка, "0") Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Функция Сред(Строка, 2) возвращает подстроку, начиная со второй позиции и до конца. Это избавляет нас от необходимости вычислять длину строки через СтрДлина.
Если ваша строка гарантированно содержит только цифры, мы можем применить «хитрый» метод — преобразование строки в число и обратно. Платформа при приведении к числу автоматически отбрасывает все нули слева.
Посмотрим на пример реализации:
// Простой вариант
Результат = Строка(Число(ВашаСтрока));
// Правильный вариант с исключением разделителей групп
Результат = Формат(Число(ВашаСтрока), "ЧГ=0");
Важные нюансы этого метода:
Строка(Число) в больших числах могут появиться неразрывные пробелы (разделители тысяч). Чтобы этого избежать, всегда используйте функцию Формат с параметром ЧГ=0.Число() вызовет ошибку выполнения.Число в 1С имеет свои ограничения.Если вы ведете разработку в современной конфигурации (например, БП 3.0, УТ 11, ERP 2), лучше всего использовать готовые функции из состава БСП. Это обеспечит надежность и соответствие стандартам разработки фирмы «1С».
Рассмотрим функцию из общего модуля СтроковыеФункцииКлиентСервер:
// Удаление нулей с помощью БСП
ОчищеннаяСтрока = СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеСимволы(ВашаСтрока, "0");
Также в БСП есть специализированные функции для работы с номерами объектов. Например, в модуле ПрефиксацияОбъектовКлиентСервер существует логика для удаления префиксов и лидирующих нулей из номеров документов:
// Пример логики очистки номера
НомерБезНулей = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерДокумента, Истина, Ложь);
Использование таких методов предпочтительно, так как они уже учитывают множество краевых ситуаций, протестированы и оптимизированы.
Существуют и более экзотические способы решения задачи. Выясним причину их появления: иногда нужно избежать циклов для повышения производительности при обработке огромных массивов данных.
Один из таких способов — использование функции СтрРазделить для поиска первой значащей цифры:
// Удаление лидирующих символов через поиск первой значащей цифры
Номер = "0000123045";
Части = СтрРазделить(Номер, "123456789", Истина);
Если Части.Количество() > 0 Тогда
ДлинаНулей = СтрДлина(Части[0]);
Результат = Сред(Номер, ДлинаНулей + 1);
КонецЕсли;
Этот метод основан на том, что СтрРазделить с разделителями в виде всех цифр, кроме нуля, вернет в первом элементе массива все лидирующие нули. Узнав их длину, мы можем обрезать исходную строку одним вызовом Сред.
Для продвинутых сценариев, когда нужно убрать нули в строке со сложной структурой, можно воспользоваться объектом VBScript.RegExp. Этот метод требует COM-объекта и работает только под Windows (на сервере или в толстом клиенте).
RegEx = Новый COMОбъект("VBScript.RegExp");
RegEx.Pattern = "^0+"; // Искать все нули в начале строки
RegEx.Global = Ложь;
Результат = RegEx.Replace(ВашаСтрока, "");
Паттерн ^0+ буквально означает: «найти последовательность из одного или более нулей, находящуюся в самом начале строки».
При реализации любого из вышеперечисленных методов важно проанализировать ситуацию, когда вся строка состоит из нулей (например, "000"). Что должно остаться в итоге? Пустая строка или один ноль?
Если вы используете цикл Пока, на выходе вы получите пустую строку. Если бизнес-логика требует сохранить хотя бы один ноль, добавьте проверку:
Если ПустаяСтрока(Результат) И ЗначениеЗаполнено(ИсходнаяСтрока) Тогда
Результат = "0";
КонецЕсли;
Мы рассмотрели пять различных подходов к удалению лидирующих нулей в 1С. Подведем краткий итог:
СтрНачинаетсяС и Сред.Формат(Число(...)).СтроковыеФункцииКлиентСервер (БСП).Выбор метода зависит от ваших конкретных условий, версии платформы и используемой конфигурации. Надеемся, что этот разбор поможет вам писать более чистый и эффективный код.