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

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

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

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

Лидирующие нули в 1С появляются везде, где платформа хранит номера и коды фиксированной длины: «00000000123» у документа, «0000042» у элемента справочника. Для внутреннего хранения это удобно — сортировка и поиск работают корректно, но при выгрузке в Excel, обмене с сайтом или печати документов нули мешают и выглядят непрофессионально.

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

Откуда берутся лидирующие нули и когда их нельзя трогать

Платформа 1С хранит номера документов и коды справочников как строки фиксированной длины (обычно 11 символов для документов, 9 для справочников в типовых конфигурациях). Пустые позиции слева заполняются нулями автоматически — это обеспечивает правильную лексикографическую сортировку и уникальность в пределах периода нумерации.

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

Универсальная функция на встроенном языке

Самый надёжный способ — цикл, который срезает нули слева по одному символу. Он работает с любыми строками, включая номера с буквенными префиксами вида «00БП-000123» (в этом случае цикл остановится на первой букве, что корректно для большинства задач).

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

Строка = СокрЛП(Строка);

Пока СтрДлина(Строка) > 1 И СтрНачинаетсяС(Строка, "0") Цикл

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

КонецЦикла;

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

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

Обратите внимание на условие СтрДлина(Строка) > 1: оно защищает от ситуации, когда значение состоит из одних нулей («000000000»). Без этой проверки функция вернёт пустую строку, а корректный результат — «0». Вызов выглядит так: НомерДляПечати = УбратьЛидирующиеНули(Документ.Номер).

Такую функцию принято размещать в общем модуле (например, «РаботаСоСтроками» или «ОбщегоНазначения» в самописных конфигурациях), чтобы не дублировать код по всей системе. В типовых конфигурациях на БСП уже есть похожие механизмы — проверьте модуль СтроковыеФункцииКлиентСервер перед тем, как писать своё.

Порядок действий
  1. 1
    Скопируйте функцию УбратьЛидирующиеНули в общий модуль с признаком «Сервер» (и «Клиент», если нужен вызов с клиента)
  2. 2
    В месте вывода номера замените прямое обращение к реквизиту на вызов функции
  3. 3
    Проверьте граничные случаи: номер «000000001», номер «000000000», номер с префиксом «00АБ-00123»
  4. 4
    Убедитесь, что исходный номер объекта в базе не изменился

Удаление нулей через преобразование в число

Если значение гарантированно состоит только из цифр, задача решается в одну строку через приведение к числу и обратное форматирование. Функция Число() отбрасывает лидирующие нули автоматически, а Формат() с параметром «ЧГ=» убирает группировку разрядов, чтобы «123456» не превратилось в «123 456».

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

У подхода два жёстких ограничения. Первое — если в строке встретится буква или дефис, Число() вызовет исключение «Преобразование значения к типу Число не может быть выполнено». Второе — очень длинные номера (более 15–17 значащих цифр) могут потерять точность при преобразовании, так как платформа использует числа с плавающей точкой ограниченной разрядности.

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

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

Номер содержит только цифры и короче 15 символовИспользуйте Формат(Число(Строка), "ЧГ=") — быстрее и короче
Номер может содержать префиксы, буквы или дефисыИспользуйте цикл со СтрНачинаетсяС — он безопасно остановится на первом нецифровом символе
Нули нужно убрать в запросе или СКДПрименяйте ВЫРАЗИТЬ(... КАК ЧИСЛО) или конструкцию ВЫБОР с ПОДСТРОКА
Нужно только отображение без нулей в печатной формеОбрабатывайте значение при заполнении параметров макета, не трогая объект

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

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Реализация.Номер КАК ЧИСЛО(15, 0)) КАК НомерБезНулей

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

Если номер может содержать нецифровые символы, приведение к числу вернёт NULL или ошибку в зависимости от СУБД. Тогда применяют каскад вложенных ПОДСТРОКА с проверками через ВЫБОР, последовательно отрезая нули. Конструкция громоздкая, поэтому на практике чаще ограничиваются разумной глубиной — например, 11 проверками по длине номера:

ВЫБОР

КОГДА ПОДСТРОКА(Док.Номер, 1, 1) = "0"

ТОГДА ВЫБОР

КОГДА ПОДСТРОКА(Док.Номер, 2, 1) = "0"

ТОГДА ПОДСТРОКА(Док.Номер, 3, 20)

ИНАЧЕ ПОДСТРОКА(Док.Номер, 2, 20)

КОНЕЦ

ИНАЧЕ Док.Номер

КОНЕЦ КАК НомерБезНулей

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

Лидирующие нули в кодах справочников и выгрузках

С кодами справочников ситуация симметричная: при выгрузке номенклатуры на сайт или в Excel код «0000042» обычно требуется привести к виду «42». Здесь работают те же приёмы — функция с циклом или Формат(Число(Код), "ЧГ="). Обратная задача — дополнить код нулями слева — решается конструкцией Формат(Код, "ЧЦ=9; ЧВН=") или функцией вида Строка = Прав("000000000" + Код, 9).

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

Типичные ошибки
01
Использование Число() без проверки: на номере с префиксом возникает исключение и падает вся обработка
02
Забытый параметр ЧГ=: в номере появляются пробелы-разделители разрядов («123 456»)
03
Перезапись реквизита Номер объекта без нулей: ломается нумерация и поиск
04
Цикл без проверки длины: строка «000000000» превращается в пустую вместо «0»
05
Удаление нулей в ключе обмена: принимающая система перестаёт сопоставлять объекты и создаёт дубли

Проверка результата

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

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

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

Номер «000000123»
Норма

На выходе «123»

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

Пустая строка, «000000123» без изменений или «123 456» с пробелом

Номер «000000000»
Норма

На выходе «0»

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

Пустая строка или исключение

Номер «00БП-000123»
Норма

На выходе «БП-000123» (нули внутри сохранены)

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

Исключение преобразования или обрезанный номер

Исходный объект в базе
Норма

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

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

Номер перезаписан — нумерация повреждена

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

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

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

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

Как убрать нули слева, но оставить их внутри номера?

Используйте цикл со СтрНачинаетсяС: он срезает только подряд идущие нули в начале строки и останавливается на первом отличном символе. Номер «00АБ-001» превратится в «АБ-001», внутренние нули сохранятся.

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

По умолчанию функция Формат группирует разряды неразрывными пробелами: «123 456». Добавьте параметр «ЧГ=» (пустая строка группировки): Формат(Число(Номер), "ЧГ=") — и пробелы исчезнут.

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

В запросе динамического списка добавьте вычисляемое поле с ВЫРАЗИТЬ(Номер КАК ЧИСЛО) или каскадом ВЫБОР с ПОДСТРОКА и выводите его вместо стандартного поля «Номер». Учтите, что сортировка по такому полю будет числовой, а не строковой.

Что делать, если номер содержит буквы и Число() выдаёт ошибку?

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

Как сделать обратную операцию — добавить нули слева?

Два варианта: Формат(Значение, "ЧЦ=9; ЧВН=") для чисел или конструкция Прав("000000000" + СокрЛП(Код), 9) для строк, где 9 — требуемая длина результата.

Итог

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

Лидирующие нули убирают только в копии значения — никогда в самом реквизите объекта. Для строк с возможными префиксами используйте цикл со СтрНачинаетсяС, для чисто цифровых номеров — Формат(Число(Строка), "ЧГ="), в запросах — ВЫРАЗИТЬ КАК ЧИСЛО или каскад ВЫБОР с ПОДСТРОКА. Обязательно проверяйте граничные случаи: строку из одних нулей и номера с буквами.