В процессе разработки в среде 1С:Предприятие программисты часто сталкиваются с необходимостью нормализации текстовых кодов или номеров документов. Очень распространенная ситуация: информационная система хранит коды с лидирующими нулями (например, "0000010530" или "00027корр1"), а для выгрузки, интеграции или вывода на печать требуется получить чистый код без этих нулей. Рассмотрим подробнее все возможные способы решения этой задачи, проанализируем их плюсы и минусы, а также разберем по шагам наиболее эффективные алгоритмы.
Если мы абсолютно уверены, что наш код состоит исключительно из цифр и не содержит буквенных символов или префиксов, мы можем применить самое простое решение — приведение строки к числу. При преобразовании строки в число платформа 1С автоматически отбрасывает все лидирующие нули слева.
Однако здесь есть важный подводный камень. Если просто преобразовать строку в число, а затем обратно в строку, то для чисел больше 999 платформа по умолчанию вставит неразрывный пробел (группировку разрядов). Например, код "001003" превратится в число 1003, которое при обратном приведении в строку превратится в "1 003" (с неразрывным пробелом внутри).
Выясним, как этого избежать. Для этого мы обязательно должны использовать функцию Формат с параметром ЧГ=0 (исключение группировки разрядов). Разберем пример кода:
ИсходныйКод = "0000010530";
// Преобразуем в число и сразу форматируем без разделения разрядов
КодБезНулей = Формат(Число(ИсходныйКод), "ЧГ=0");
// Результат: "10530"
Преимущества метода: лаконичность, высокая скорость выполнения.
Недостатки метода: если в коде попадется хотя бы одна буква (например, "00027корр1"), система вызовет критическую ошибку выполнения (исключение преобразования типов).
Проанализируем очень изящный алгоритм, который позволяет удалить ведущие нули без использования циклов и без риска вызвать ошибку, даже если строка содержит буквы. Этот способ основан на комбинировании функций СтрЗаменить и СокрЛ (удаление пробелов слева).
Идея заключается в следующем: мы временно заменяем все нули в строке на пробелы, затем штатной функцией СокрЛ отсекаем все образовавшиеся пробелы слева, после чего возвращаем оставшиеся пробелы обратно в нули.
ТвойКод = "0000010530";
КодБезНулей = СтрЗаменить(СокрЛ(СтрЗаменить(ТвойКод, "0", " ")), " ", "0");
// Результат: "10530"
Давайте разберем по шагам, как это работает на примере строки "00010203":
СтрЗаменить(ТвойКод, "0", " ") заменяет все нули на пробелы. Строка принимает вид: " 1 2 3".СокрЛ удаляет только лидирующие пробелы слева. Строка принимает вид: "1 2 3" (обратите внимание, что внутренние пробелы остались нетронутыми).СтрЗаменить превращает все оставшиеся пробелы обратно в нули. Мы получаем результат: "10203".Важное предупреждение: этот трюк в исходном виде может повредить строки, в которых изначально содержались законные пробелы (например, код "000 120 40"). Если исходный код может содержать пробелы или неразрывные пробелы, алгоритм необходимо доработать, предварительно замаскировав существующие пробелы уникальными маркерами:
ИсходныйКод = "000102 03"; // Содержит оригинальный пробел в середине
// Шаг 1: Маскируем существующие пробелы и неразрывные пробелы уникальными символами
СтрокаМаскированная = СтрЗаменить(ИсходныйКод, " ", "###");
СтрокаМаскированная = СтрЗаменить(СтрокаМаскированная, Символы.НПП, "@@@");
// Шаг 2: Применяем наш трюк с заменой нулей
СтрокаБезНулей = СтрЗаменить(СокрЛ(СтрЗаменить(СтрокаМаскированная, "0", " ")), " ", "0");
// Шаг 3: Возвращаем оригинальные пробелы на свои места
Результат = СтрЗаменить(СтрокаБезНулей, "###", " ");
Результат = СтрЗаменить(Результат, "@@@", Символы.НПП);
// Результат: "102 03"
Для тех, кто предпочитает максимально понятный, прозрачный и легко отлаживаемый код, отлично подойдет классический цикл. Мы анализируем первый символ строки, и пока он равен нулю, отсекаем его с помощью функции Сред.
Посмотрим на пример такой реализации:
СтрокаКода = "0000027корр1";
Пока Лев(СтрокаКода, 1) = "0" Цикл
СтрокаКода = Сред(СтрокаКода, 2);
КонецЦикла;
// Результат: "27корр1"
Этот код абсолютно безопасен, легко читается и не зависит от наличия пробелов внутри строки. Единственным незначительным минусом является скорость работы на очень длинных строках с огромным количеством нулей из-за многократного пересоздания строк в памяти, однако для большинства прикладных задач в 1С эта разница в микросекундах будет неощутима.
Для разработчиков, ценящих современные стандарты и лаконичность, идеальным выбором станут регулярные выражения. Начиная с версии платформы 1С:Предприятие 8.3.23, в платформу была добавлена встроенная нативная поддержка регулярных выражений. Теперь эту задачу можно решить буквально в одну строчку кода на любой операционной системе (включая Linux-серверы):
ИсходныйКод = "00000987-А";
Результат = СтрЗаменитьПоРегулярномуВыражению(ИсходныйКод, "^0+", "");
// Результат: "987-А"
Давайте проанализируем шаблон регулярного выражения "^0+":
^ означает привязку к началу строки (поиск будет осуществляться строго слева).0 указывает на то, что мы ищем конкретно символ нуля.+ указывает на то, что совпадение может содержать один или более нулей подряд.Если же ваша информационная база работает на более старых версиях платформы (ниже 8.3.23) и только под управлением ОС Windows, вы можете использовать аналогичный подход через COM-объект:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^0+";
Результат = RegExp.Replace(ИсходныйКод, "");
Если вы ведете разработку в типовой конфигурации (например, 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей или 1С:Бухгалтерия), то в вашем распоряжении уже есть готовые инструменты из состава Библиотеки Стандартных Подсистем (БСП). Нам не нужно заново изобретать велосипед.
Например, общий модуль СтроковыеФункцииКлиентСервер содержит функцию удаления повторяющихся символов слева:
КодБезНулей = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ИсходныйКод, "0");
А если вашей задачей является подготовка номера документа для вывода в печатную форму, то лучшим решением будет использование специализированного метода, который не только уберет ведущие нули, но и корректно очистит префиксы организации и информационной базы:
Результат = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерОбъекта, Истина, Истина);
Мы подробно разобрали пять отличных способов избавления от ведущих нулей в коде. Выберите тот, который лучше всего подходит для вашей специфики:
Формат(Число(Код), "ЧГ=0").СтрЗаменитьПоРегулярномуВыражению.СтроковыеФункцииКлиентСервер и ПрефиксацияОбъектовКлиентСервер для соответствия стандартам разработки фирмы 1С.