К статье
Практический материал

Разработка и Конфигурация · 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. 1
    Определите, может ли значение содержать буквы или быть длиннее 15 цифр
  2. 2
    Если только цифры и значение короткое — используйте Формат(Число(...))
  3. 3
    Если есть буквы или длина критична — напишите функцию с циклом по символам
  4. 4
    Предусмотрите случай строки из одних нулей
  5. 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"

Параметр «ЧЦ» задаёт общую длину, а «ЧВН=» включает вывод ведущих нулей. Полезно уметь быстро переключаться между двумя форматами: одни внешние системы требуют код с нулями, другие — без, и обмен между ними сводится к двум вызовам Формат.

1c
СтрокаБезНулей = Формат(Число(СокрЛП(КодСтрокой)), "ЧГ=0");

Проверка результата и типичные ошибки

После внедрения обработки прогоните её на краевых случаях. Минимальный набор проверок: строка из одних нулей, пустая строка, строка с пробелами по краям, строка с буквами после нулей, значение без нулей вообще и очень длинное цифровое значение. Каждый из этих случаев способен сломать тот или иной способ.

Контрольные точки

Как проверить результат

Строка "000"
Норма

Результат "0"

Тревожный признак

Пустая строка или ошибка

Строка "000А15"
Норма

Результат "А15"

Тревожный признак

Ошибка преобразования к числу

Число 1234567 через Формат
Норма

"1234567" без пробелов

Тревожный признак

"1 234 567" — не отключён ЧГ

Длинный ИНН из 12 цифр
Норма

Значение не изменилось либо обработано строковым способом

Тревожный признак

Потеря точности при приведении к числу

Типичные ошибки
01
Применение Число() к строкам с буквами — обработка падает с ошибкой преобразования
02
Забытый параметр ЧГ=0 — в результате появляются неразрывные пробелы между разрядами
03
Удаление всех нулей без проверки длины — строка "000" превращается в пустую
04
Изменение номеров документов в базе вместо форматирования при выводе — ломается сортировка и нумерация
05
Удаление нулей из ИНН и счетов — ошибки при сверках и отправке отчётности

Частые вопросы

Как убрать ведущие нули, не написав ни строчки кода?

Если речь об отчёте на СКД или динамическом списке, задайте формат поля в настройках: для числового представления кода укажите форматную строку без группировки разрядов. В печатных формах и макетах формат также задаётся в свойствах параметра. Для разовой обработки файла проще привести данные к нужному виду в Excel до загрузки в 1С.

Почему Формат(Число(Код)) возвращает строку с пробелами?

По умолчанию функция Формат группирует разряды числа и вставляет между группами неразрывные пробелы: «1 234 567». Добавьте параметр «ЧГ=0», чтобы отключить группировку, и пробелы исчезнут.

Можно ли убрать нули у номера документа навсегда, чтобы везде отображался короткий номер?

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

Что делать, если после удаления нулей появились дубли кодов?

Это признак того, что нули были значимыми: «00123» и «0123» — разные значения, которые совпали после обработки. Откатите изменения, проанализируйте состав дублей и либо сохраните исходные коды, либо введите дополнительный признак различения. В справочниках с включённым контролем уникальности кода такая запись просто не сохранится.

Работает ли способ с Число() для ИНН из 10 и 12 цифр?

Технически приведение выполнится, но делать этого не стоит: ИНН — код фиксированной длины, и ведущий нуль у него значимый. Кроме того, длинные цифровые строки при операциях с числами могут терять точность. ИНН, КПП, счета и БИК обрабатывайте только строковыми функциями, если это вообще требуется.

Как убрать нули сразу у всех элементов справочника?

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

Итог

Что важно запомнить

Для коротких цифровых строк используйте Формат(Число(Значение), "ЧГ=0"), для смешанных и длинных — собственную функцию с циклом по символам. Номера документов и коды в базе не меняйте без необходимости: форматируйте при выводе. ИНН, счета и штрихкоды не трогайте — ведущие нули там часть значения.