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

Разработка и Конфигурация · 10 мин

Как удалить лидирующие нули в 1С

Как убрать лидирующие нули в 1С: функции, преобразование типов, готовые примеры кода для строк и номеров документов, типичные ошибки и проверка результата.

Лидирующие нули в 1С появляются там, где числовое значение хранится или выводится как строка фиксированной длины: номера документов («000000123»), коды элементов справочников, артикулы, штрихкоды. При обмене данными, печати, сравнении значений и выгрузке во внешние системы эти нули часто мешают — строки не совпадают, поиск не находит элементы, а отчёты выглядят нечитаемо.

Универсальной встроенной функции «убрать нули слева» в языке 1С нет, поэтому задача решается несколькими способами: преобразованием строки в число и обратно, циклом посимвольной обработки, функциями форматирования или штатными механизмами префиксации номеров. Выбор зависит от того, где именно возникли нули — в коде, в номере документа или в данных, полученных извне.

Важно понимать: удаление лидирующих нулей — не всегда правильное решение. Если нули являются частью формата (например, в штрихкодах EAN-13 или в номерах, по которым идёт сопоставление с контрагентами), их удаление сломает обмен данными. Ниже разобраны рабочие способы, их ограничения и ситуации, когда нули трогать нельзя.

Откуда берутся лидирующие нули в 1С

Основной источник — механизм нумерации объектов. Номер документа или код справочника хранится как строка фиксированной длины, и платформа дополняет его нулями слева до заданной длины. Это нужно для корректной лексикографической сортировки: строки «2» и «10» сравниваются «неправильно», а «0002» и «0010» — правильно.

Вторая причина — префиксация при обмене данными между базами. Номер вида «УТ00-000123» содержит и префикс, и нули-заполнители. Третья причина — загрузка данных из внешних источников: Excel, CSV, веб-сервисов, где коды и артикулы приходят уже с нулями.

Наконец, нули появляются при форматировании чисел функцией Формат() с указанием длины, например Формат(Значение, "ЧЦ=10; ЧВН=") — такой приём часто используют в печатных формах и выгрузках.

Способ 1. Преобразование строки в число и обратно

Самый короткий вариант, если строка гарантированно состоит только из цифр:

СтрокаБезНулей = Строка(Число("000000123"));

// Результат: "123"

Функция Число() отбрасывает все нули слева, а Строка() возвращает значение без них. Подходит для кодов справочников, артикулов-чисел, числовых частей номеров.

Ограничения способа существенные. Если в строке есть хотя бы одна нецифровая буква или символ («00А123», «УТ-000123»), функция Число() вызовет ошибку преобразования. Если строка длиннее, чем максимальная разрядность числа в 1С, возможна потеря точности. И если исходное значение — «0000», результатом будет «0», что не всегда ожидаемо.

bsl
Функция УбратьЛидирующиеНули(ЗначениеСтрокой)
	Попытка
		Возврат Строка(Число(ЗначениеСтрокой));
	Исключение
		Возврат ЗначениеСтрокой; // не число — вернём как есть
	КонецПопытки;
КонецФункции

Способ 2. Посимвольное удаление нулей циклом

Когда строка может содержать буквы или смешанный формат, надёжнее идти по символам слева и отсекать нули до первого значимого символа:

Функция УбратьЛидирующиеНули(Строка)

Пока СтрДлина(Строка) > 1 И Лев(Строка, 1) = "0" Цикл

Строка = Сред(Строка, 2);

КонецЦикла;

Возврат Строка;

КонецФункции

Условие СтрДлина(Строка) > 1 защищает от ситуации, когда строка состоит из одних нулей: «0000» превратится в «0», а не в пустую строку. Если пустая строка допустима, условие можно убрать.

Вариант с определением позиции первого ненулевого символа работает быстрее на длинных строках, так как не создаёт новую строку на каждой итерации:

Функция УбратьЛидирующиеНулиБыстро(Строка)

Позиция = 1;

Пока Позиция <= СтрДлина(Строка) И Сред(Строка, Позиция, 1) = "0" Цикл

Позиция = Позиция + 1;

КонецЦикла;

Возврат Сред(Строка, Позиция);

КонецФункции

Сравнение способов

Строка(Число(...))

Самый короткий код. Подходит только для чисто цифровых строк; на строках с буквами выдаёт ошибку.

Цикл с отсечением нулей

Универсален, работает с любыми строками. Требует аккуратной обработки строки из одних нулей.

Штатная префиксация

Для номеров документов при обмене. Не требует кода, но настраивается только в типовых подсистемах обмена.

Способ 3. Настройка префиксации для номеров документов

Если задача — убрать нули из номеров документов при печати или обмене, не всегда нужен код. В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) есть механизм префиксации, который умеет автоматически удалять лидирующие нули и префиксы информационной базы при выводе номера.

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

Если требуется своё поведение, типовые функции можно использовать как образец: они обычно отсекают префикс до разделителя, затем удаляют нули слева от числовой части.

Удаление нулей в запросах и при поиске

Частая практическая задача — найти элемент справочника или документ по номеру, введённому без нулей, когда в базе номер хранится с нулями. Здесь два подхода.

Первый — не удалять нули, а дополнить введённое значение до нужной длины перед поиском. Это надёжнее, потому что не требует обхода и преобразования всех записей:

ДлинаНомера = Метаданные.Документы.РеализацияТоваровУслуг.ДлинаНомера;

НомерДляПоиска = Формат(Число(ВведенныйНомер), "ЧЦ=" + ДлинаНомера + "; ЧВН=; ЧГ=");

Второй — искать по окончанию строки через ПОДОБНО в запросе. Способ рабочий, но медленный на больших таблицах, так как индекс при таком сравнении не используется. Применяйте его только для разовых операций или небольших объёмов данных.

Маршрут решения

Как выбрать действие

Строка состоит только из цифрИспользуйте Строка(Число(Строка)) — это одна строка кода
В строке могут быть буквы или дефисыПрименяйте посимвольное удаление нулей циклом
Нули в номере документа при печати или обменеПроверьте штатные функции префиксации конфигурации
Нужно найти объект по номеру без нулейДополните введённое значение нулями до длины номера, а не очищайте базу

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

После применения любого способа проверьте граничные случаи: строка из одних нулей, пустая строка, строка с пробелами по краям, строка с буквами после нулей. Пробелы предварительно убирайте функцией СокрЛП(), иначе « 000123» не будет распознано как число.

Типичные ошибки
01
Применение Число() к строке с буквами — получение ошибки преобразования и остановка обработки
02
Удаление нулей из штрихкодов EAN-13 — код перестаёт соответствовать формату и не сканируется
03
Изменение сохранённого номера документа в базе вместо форматирования при выводе — сбой нумерации и конфликты при обмене
04
Цикл без проверки длины строки — строка «0000» превращается в пустую, что ломает дальнейшую логику
05
Поиск по ПОДОБНО без ограничений на больших таблицах — заметное замедление запросов
Контрольные точки

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

Строка «000123»
Норма

Получено «123»

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

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

Строка «0000»
Норма

Получено «0»

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

Пустая строка там, где она недопустима

Строка «00А45»
Норма

Получено «А45» или исходное значение по логике задачи

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

Необработанное исключение

Печатная форма документа
Норма

Номер выводится без нулей и префикса

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

Номер в базе изменён, а не только отформатирован

Когда нули удалять нельзя

Штрихкоды (EAN-8, EAN-13, коды маркировки) — нули слева являются значащей частью кода, их удаление делает код невалидным. Артикулы и коды, по которым идёт сопоставление с данными поставщиков и контрагентов, — удаление нулей разорвёт соответствие при следующей загрузке.

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

FAQ

Можно ли убрать лидирующие нули прямо в запросе 1С?

В языке запросов нет функции удаления символов слева, поэтому полноценно убрать нули в запросе нельзя. Обычно поступают наоборот: параметр поиска дополняют нулями до нужной длины перед передачей в запрос, а сами данные в базе не меняют.

Что вернёт преобразование, если строка состоит только из нулей?

Число("0000") вернёт 0, а Строка(Число("0000")) — строку «0». Если в вашей логике пустая строка или сохранение исходного вида важнее, добавьте отдельную проверку этого случая перед преобразованием.

Как убрать нули вместе с префиксом вида «УТ00-000123»?

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

Почему после удаления нулей перестал находиться элемент справочника?

Потому что сравнение строк в 1С точное: «123» и «000123» — разные значения. Если код в базе хранится с нулями, ищите по исходному формату: дополните введённое значение нулями до длины кода, указанной в метаданных справочника.

Влияет ли удаление нулей на сортировку номеров?

Да. Строки без нулей сортируются лексикографически: «10» окажется раньше «2». Если порядок важен, сортируйте по числовому представлению или храните номера с нулями и форматируйте их только при выводе.

Итог

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

Для чисто цифровых строк используйте Строка(Число(Строка)), для смешанных — цикл отсечения нулей слева, для номеров документов — штатную префиксацию. Удаляйте нули только при выводе, не меняя хранимые номера, коды и штрихкоды.