Проблема удаления ведущих (лидирующих) нулей в строковых переменных — одна из классических задач в разработке на платформе 1С. Это часто требуется при обработке номеров документов, артикулов или кодов номенклатуры, когда для поиска или вывода на печать нужно избавиться от технического дополнения нулями. Разберем по шагам наиболее популярные и эффективные способы решения этой задачи, учитывая производительность и типы данных.
Самый быстрый и лаконичный способ — это временное преобразование строки в число с последующим форматированием обратно в строку. Этот метод идеально подходит, если вы уверены, что в строке содержатся только цифры. Проанализируем ситуацию: функция Число() отсекает нули автоматически, а Формат() позволяет вернуть результат в строковом виде без разделителей групп.
// Допустим, Значение = "00000123"
Результат = Формат(Число(Значение), "ЧГ=0");
// Результат станет "123"
Важные нюансы этого метода:
Число() вызовет ошибку.Число.Если строка может содержать не только цифры или вам нужно гарантированно работать только со строковым типом, рассмотрим подробнее алгоритм с циклом. Мы будем проверять первый символ строки и, если это "0", отсекать его.
Пока Лев(Значение, 1) = "0" Цикл
Значение = Сред(Значение, 2);
КонецЦикла;
Однако выясним причину, почему этот код может быть медленным на очень длинных строках: при каждой итерации 1С создает в памяти новую копию строки. Для оптимизации лучше найти позицию первого ненулевого символа и выполнить обрезку один раз:
Для к = 1 По СтрДлина(Значение) Цикл
Если Сред(Значение, к, 1) <> "0" Тогда
Значение = Сред(Значение, к);
Прервать;
КонецЕсли;
КонецЦикла;
Этот вариант работает быстрее, так как функция Сред() вызывается для модификации строки только один раз после завершения поиска. Для комплексной обработки строк также можно использовать набор готовых методов работы со строками на 1С.
В современных конфигурациях (таких как УТ 11, БП 3.0, ERP) уже есть готовые функции, которые прошли проверку временем и нагрузками. Посмотрим на пример использования функций из БСП. Нам поможет общий модуль ОбщегоНазначенияКлиентСервер или аналогичный в зависимости от версии вашей библиотеки.
// Использование стандартной функции БСП
Результат = ОбщегоНазначенияКлиентСервер.УдалитьПовторяющиесяСимволыСлева(Значение, "0");
Это «правильный» способ с точки зрения профессиональной разработки, так как он делает код более читаемым и стандартизированным.
Существует остроумный способ удаления лидирующих нулей без циклов, использующий особенность функции СокрЛ(), которая удаляет пробелы слева. Разберем по шагам этот метод:
СокрЛ().
ИсходнаяСтрока = "0000078009000";
// 1. " 78 9 "
// 2. "78 9 "
// 3. "78009000"
Результат = СтрЗаменить(СокрЛ(СтрЗаменить(ИсходнаяСтрока, "0", " ")), " ", "0");
Внимание: этот метод корректен только в том случае, если в исходной строке изначально нет пробелов. Если они там есть, структура строки будет нарушена.
Иногда лидирующие нули нужно убрать прямо в запросе, например, при формировании отчета на СКД. Поскольку в языке запросов 1С нет полноценных циклов, используется конструкция ВЫБОР или комбинация СТРЗАМЕНИТЬ. Проанализируем пример реализации "трюка с пробелами" прямо в тексте запроса:
ВЫБРАТЬ
СТРЗАМЕНИТЬ(СОКРЛ(СТРЗАМЕНИТЬ(Таблица.Номер, "0", " ")), " ", "0") КАК НомерБезНулей
ИЗ
Справочник.Номенклатура КАК Таблица
Один из самых современных и быстрых способов — использование функции СтрРазделить(). Она позволяет мгновенно вычислить длину «нулевого хвоста» слева, если в строке есть хотя бы один символ, отличный от нуля.
// Отрезаем всё, что совпадает с длиной массива пустых строк до первой цифры
Номер = "0000012345";
Результат = Сред(Номер, СтрДлина(СтрРазделить(Номер, "123456789")[0]) + 1);
Здесь мы используем цифры 1–9 как разделители. Первый элемент полученного массива — это и есть последовательность лидирующих нулей. Узнав его длину, мы просто забираем остаток строки. Для сопоставления и очистки строк по шаблонам можно использовать подсистему регулярных выражений для 1С.
Подведем итоги нашего анализа:
Формат(Число(Стр), "ЧГ=0").СтрРазделить.УдалитьПовторяющиесяСимволыСлева).Помните о «крайнем случае»: если ваша строка состоит только из нулей ("000"), большинство функций обрезки вернут пустую строку. Если бизнес-логика требует в таком случае возвращать "0", обязательно добавьте проверку: Результат = ?(Результат = "", "0", Результат);.