Разработка и Конфигурация · 11 мин
Как убрать ведущие нули в 1С: практические способы
Как убрать ведущие нули в 1С: функции СокрЛП и Формат, преобразование в число, запросы и обработка строк. Примеры кода, типичные ошибки и проверка результата.
Ведущие нули встречаются в 1С повсюду: в номерах документов, кодах справочников, артикулах, ИНН, штрихкодах и данных, загруженных из внешних файлов. Часто они мешают — например, при сравнении строк «000123» и «123», при поиске контрагента по ИНН или при выгрузке данных в систему, которая не ожидает нулей в начале. Задача убрать ведущие нули решается несколькими способами, и выбор зависит от того, где находятся данные: в переменной, в реквизите объекта или в результате запроса.
Важно сразу понимать одну вещь: встроенного оператора «убрать нули слева» во встроенном языке 1С нет. Поэтому используют обходные приёмы — преобразование в число и обратно, функцию Формат, посимвольный разбор строки или средства языка запросов. Каждый вариант имеет ограничения: например, преобразование в число потеряет нули, но сломается на строке с буквами, а ИНН физического лица вообще нельзя переводить в число без потерь на некоторых настройках.
Ниже разобраны рабочие способы с примерами кода, условиями выбора и типичными ошибками. Примеры применимы как к управляемым формам, так и к обычным, если не указано иное.
Когда нули нужно убирать, а когда — нет
Прежде чем писать код, определите природу данных. Ведущие нули бывают двух типов: случайные (результат выгрузки из Excel, склейки строк, импорта из другой учётной системы) и осмысленные (ИНН, КПП, штрихкоды, счета банков, коды ОКВЭД). Во втором случае нули — часть значения, и их удаление испортит данные: ИНН «0123456789» без первого нуля перестанет быть корректным ИНН.
Убирать нули безопасно, когда значение по смыслу является числом или порядковым номером: номер документа без префикса, количество, код номенклатуры чисто цифровой, артикул поставщика, который в чужой системе хранится как число. Если есть сомнения — сначала проверьте, где ещё используется это значение и не участвует ли оно в обменах.
Способ 1: преобразование в число и обратно
Самый короткий приём для гарантированно цифровых строк — привести значение к числу, а затем обратно к строке. Числовой тип не хранит ведущие нули, поэтому они исчезают автоматически.
СтрокаБезНулей = Формат(Число("00012345"), "ЧГ=0");
// Результат: "12345"
Параметр «ЧГ=0» в функции Формат отключает разделители групп разрядов, иначе для больших чисел вы получите строку вида «12 345» с пробелами. Это частая причина «странных» пробелов при выгрузке.
Ограничения способа существенные. Если в строке есть хотя бы одна буква («000А123»), функция Число() вызовет ошибку преобразования. Дробные значения с разделителем тоже обрабатываются по правилам чисел: строка «007,50» станет «7,5». Кроме того, очень длинные цифровые строки (больше 15–17 значащих цифр) могут потерять точность при приведении к числу, поэтому для ИНН и длинных кодов этот способ не подходит.
Способ 2: универсальная функция с посимвольным разбором
Когда строка может содержать буквы или её длина критична, надёжнее написать собственную функцию: идти по символам слева и отбрасывать нули, пока не встретится другой символ. Такой подход не трогает нули внутри и в конце строки и не зависит от длины значения.
Функция УбратьВедущиеНули(Знач Строка)
Пока СтрДлина(Строка) > 1 И Лев(Строка, 1) = "0" Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Возврат Строка;
КонецФункции
// УбратьВедущиеНули("000А102") → "А102"
// УбратьВедущиеНули("000") → "0"
// УбратьВедущиеНули("010203") → "10203"
Обратите внимание на условие «СтрДлина(Строка) > 1»: оно защищает от случая, когда строка состоит из одних нулей. Без этой проверки «000» превратится в пустую строку, что обычно нежелательно — значение «0» должно остаться нулём.
Если исходные данные могут содержать пробелы (типично для выгрузок из Excel), предварительно примените СокрЛП, иначе функция не найдёт нули — первым символом окажется пробел:
Строка = СокрЛП(Строка);
- 1Определите, может ли значение содержать буквы или быть длиннее 15 цифр
- 2Если только цифры и значение короткое — используйте Формат(Число(...))
- 3Если есть буквы или длина критична — напишите функцию с циклом по символам
- 4Предусмотрите случай строки из одних нулей
- 5Прогоните функцию на тестовых примерах: "000", "0А01", "100", пустая строка
Способ 3: убрать нули в запросе
Когда нужно обработать данные прямо в выборке — например, сопоставить номера документов из двух баз, — удобнее сделать это в запросе. В языке запросов 1С нет функции удаления ведущих нулей, но есть приведение типов и строковые функции.
Для чисто цифровых кодов работает приведение к числу:
ВЫБРАТЬ
ВЫРАЗИТЬ(Номенклатура.Код КАК ЧИСЛО(10, 0)) КАК КодЧислом
ИЗ
Справочник.Номенклатура КАК Номенклатура
У такого подхода два ограничения. Во-первых, если код содержит нецифровые символы, результатом будет NULL или ошибка в зависимости от СУБД. Во-вторых, приведение к числу в запросе может быть заметно медленнее на больших таблицах, особенно если оно используется в условии соединения — индексы по исходному полу перестают работать.
Альтернатива без приведения типов — конструкция ВЫБОР с последовательным сравнением начала строки и функцией ПОДСТРОКА. Она громоздкая, но безопасна для смешанных кодов:
ВЫБОР
КОГДА ПОДСТРОКА(Код, 1, 3) = "000"
ТОГДА ПОДСТРОКА(Код, 4, 20)
КОГДА ПОДСТРОКА(Код, 1, 2) = "00"
ТОГДА ПОДСТРОКА(Код, 3, 20)
КОГДА ПОДСТРОКА(Код, 1, 1) = "0"
ТОГДА ПОДСТРОКА(Код, 2, 20)
ИНАЧЕ Код
КОНЕЦ
На практике, если обработка сложная, часто рациональнее выгрузить результат запроса в таблицу значений и обработать его в цикле уже на встроенном языке — это проще сопровождать и отлаживать.
Обратная задача: добавить ведущие нули
Часто рядом с удалением нулей стоит обратная задача — дополнить значение нулями до нужной длины, например для формирования имени файла или кода фиксированного формата. Это делается той же функцией Формат:
КодСНулями = Формат(123, "ЧЦ=6; ЧВН=");
// Результат: "000123"
Параметр «ЧЦ» задаёт общую длину, а «ЧВН=» включает вывод ведущих нулей. Полезно уметь быстро переключаться между двумя форматами: одни внешние системы требуют код с нулями, другие — без, и обмен между ними сводится к двум вызовам Формат.
СтрокаБезНулей = Формат(Число(СокрЛП(КодСтрокой)), "ЧГ=0");Проверка результата и типичные ошибки
После внедрения обработки прогоните её на краевых случаях. Минимальный набор проверок: строка из одних нулей, пустая строка, строка с пробелами по краям, строка с буквами после нулей, значение без нулей вообще и очень длинное цифровое значение. Каждый из этих случаев способен сломать тот или иной способ.
Как проверить результат
Результат "0"
Пустая строка или ошибка
Результат "А15"
Ошибка преобразования к числу
"1234567" без пробелов
"1 234 567" — не отключён ЧГ
Значение не изменилось либо обработано строковым способом
Потеря точности при приведении к числу
Частые вопросы
Как убрать ведущие нули, не написав ни строчки кода?
Если речь об отчёте на СКД или динамическом списке, задайте формат поля в настройках: для числового представления кода укажите форматную строку без группировки разрядов. В печатных формах и макетах формат также задаётся в свойствах параметра. Для разовой обработки файла проще привести данные к нужному виду в Excel до загрузки в 1С.
Почему Формат(Число(Код)) возвращает строку с пробелами?
По умолчанию функция Формат группирует разряды числа и вставляет между группами неразрывные пробелы: «1 234 567». Добавьте параметр «ЧГ=0», чтобы отключить группировку, и пробелы исчезнут.
Можно ли убрать нули у номера документа навсегда, чтобы везде отображался короткий номер?
Отображение номера определяется механизмом нумерации конфигурации и настройками длины номера. Менять длину номера в типовой конфигурации не рекомендуется — это влияет на сортировку и обмены. Правильный путь — форматировать номер в момент вывода на экран или в печать, оставляя хранимое значение неизменным.
Что делать, если после удаления нулей появились дубли кодов?
Это признак того, что нули были значимыми: «00123» и «0123» — разные значения, которые совпали после обработки. Откатите изменения, проанализируйте состав дублей и либо сохраните исходные коды, либо введите дополнительный признак различения. В справочниках с включённым контролем уникальности кода такая запись просто не сохранится.
Работает ли способ с Число() для ИНН из 10 и 12 цифр?
Технически приведение выполнится, но делать этого не стоит: ИНН — код фиксированной длины, и ведущий нуль у него значимый. Кроме того, длинные цифровые строки при операциях с числами могут терять точность. ИНН, КПП, счета и БИК обрабатывайте только строковыми функциями, если это вообще требуется.
Как убрать нули сразу у всех элементов справочника?
Напишите внешнюю обработку: запросом выберите элементы, для каждого вычислите новый код строковой функцией и запишите объект в транзакции. Перед запуском сделайте копию базы, проверьте отсутствие дублей новых кодов и убедитесь, что код не участвует в обменах с внешними системами.
Что важно запомнить
Для коротких цифровых строк используйте Формат(Число(Значение), "ЧГ=0"), для смешанных и длинных — собственную функцию с циклом по символам. Номера документов и коды в базе не меняйте без необходимости: форматируйте при выводе. ИНН, счета и штрихкоды не трогайте — ведущие нули там часть значения.