Разработка и Конфигурация · 9 мин
Как убрать лидирующие нули в 1С
Как убрать лидирующие нули в 1С из номеров документов, кодов и строк: готовые функции СокрЛП, СтрЗаменить, Формат, работа через запрос и типичные ошибки разработчика.
Лидирующие нули в 1С появляются везде, где платформа хранит номера и коды фиксированной длины: «00000000123» у документа, «0000042» у элемента справочника. Для внутреннего хранения это удобно — сортировка и поиск работают корректно, но при выгрузке в Excel, обмене с сайтом или печати документов нули мешают и выглядят непрофессионально.
Способ удаления зависит от контекста: одно дело — обработать строку во встроенном языке, другое — получить «чистый» номер прямо в запросе, третье — настроить формат вывода в макете или СКД. Ниже разобраны все рабочие варианты с готовым кодом, ограничениями каждого подхода и типичными ошибками.
Откуда берутся лидирующие нули и когда их нельзя трогать
Платформа 1С хранит номера документов и коды справочников как строки фиксированной длины (обычно 11 символов для документов, 9 для справочников в типовых конфигурациях). Пустые позиции слева заполняются нулями автоматически — это обеспечивает правильную лексикографическую сортировку и уникальность в пределах периода нумерации.
Важно понимать: нули — часть значения в базе данных. Убирать их нужно только на этапе представления (вывод на печать, выгрузка, отображение в отчёте), а не изменением самого номера в объекте. Перезапись номера документа без нулей сломает нумерацию, поиск по номеру и может нарушить обмен данными, где номер используется как ключ сопоставления.
Универсальная функция на встроенном языке
Самый надёжный способ — цикл, который срезает нули слева по одному символу. Он работает с любыми строками, включая номера с буквенными префиксами вида «00БП-000123» (в этом случае цикл остановится на первой букве, что корректно для большинства задач).
Функция УбратьЛидирующиеНули(Знач Строка) Экспорт
Строка = СокрЛП(Строка);
Пока СтрДлина(Строка) > 1 И СтрНачинаетсяС(Строка, "0") Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Возврат Строка;
КонецФункции
Обратите внимание на условие СтрДлина(Строка) > 1: оно защищает от ситуации, когда значение состоит из одних нулей («000000000»). Без этой проверки функция вернёт пустую строку, а корректный результат — «0». Вызов выглядит так: НомерДляПечати = УбратьЛидирующиеНули(Документ.Номер).
Такую функцию принято размещать в общем модуле (например, «РаботаСоСтроками» или «ОбщегоНазначения» в самописных конфигурациях), чтобы не дублировать код по всей системе. В типовых конфигурациях на БСП уже есть похожие механизмы — проверьте модуль СтроковыеФункцииКлиентСервер перед тем, как писать своё.
- 1Скопируйте функцию УбратьЛидирующиеНули в общий модуль с признаком «Сервер» (и «Клиент», если нужен вызов с клиента)
- 2В месте вывода номера замените прямое обращение к реквизиту на вызов функции
- 3Проверьте граничные случаи: номер «000000001», номер «000000000», номер с префиксом «00АБ-00123»
- 4Убедитесь, что исходный номер объекта в базе не изменился
Удаление нулей через преобразование в число
Если значение гарантированно состоит только из цифр, задача решается в одну строку через приведение к числу и обратное форматирование. Функция Число() отбрасывает лидирующие нули автоматически, а Формат() с параметром «ЧГ=» убирает группировку разрядов, чтобы «123456» не превратилось в «123 456».
НомерБезНулей = Формат(Число(СокрЛП(Номер)), "ЧГ=");
У подхода два жёстких ограничения. Первое — если в строке встретится буква или дефис, Число() вызовет исключение «Преобразование значения к типу Число не может быть выполнено». Второе — очень длинные номера (более 15–17 значащих цифр) могут потерять точность при преобразовании, так как платформа использует числа с плавающей точкой ограниченной разрядности.
Как выбрать действие
Удаление нулей в запросе
Когда «чистый» номер нужен в отчёте или динамическом списке, обрабатывать его в цикле по результату запроса — лишняя работа. Проще получить значение сразу в запросе. Для числовых номеров работает приведение типа:
ВЫБРАТЬ
ВЫРАЗИТЬ(Реализация.Номер КАК ЧИСЛО(15, 0)) КАК НомерБезНулей
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Если номер может содержать нецифровые символы, приведение к числу вернёт NULL или ошибку в зависимости от СУБД. Тогда применяют каскад вложенных ПОДСТРОКА с проверками через ВЫБОР, последовательно отрезая нули. Конструкция громоздкая, поэтому на практике чаще ограничиваются разумной глубиной — например, 11 проверками по длине номера:
ВЫБОР
КОГДА ПОДСТРОКА(Док.Номер, 1, 1) = "0"
ТОГДА ВЫБОР
КОГДА ПОДСТРОКА(Док.Номер, 2, 1) = "0"
ТОГДА ПОДСТРОКА(Док.Номер, 3, 20)
ИНАЧЕ ПОДСТРОКА(Док.Номер, 2, 20)
КОНЕЦ
ИНАЧЕ Док.Номер
КОНЕЦ КАК НомерБезНулей
В СКД альтернатива — вынести обработку в выражение представления поля или вычисляемое поле с функцией из общего модуля (в выражениях СКД допустимы вызовы функций общих модулей). Это читабельнее, чем каскад ВЫБОР, и проще в сопровождении.
Лидирующие нули в кодах справочников и выгрузках
С кодами справочников ситуация симметричная: при выгрузке номенклатуры на сайт или в Excel код «0000042» обычно требуется привести к виду «42». Здесь работают те же приёмы — функция с циклом или Формат(Число(Код), "ЧГ="). Обратная задача — дополнить код нулями слева — решается конструкцией Формат(Код, "ЧЦ=9; ЧВН=") или функцией вида Строка = Прав("000000000" + Код, 9).
Особый случай — обмены, где код является ключом синхронизации. Если вы уберёте нули в выгрузке, а принимающая система при следующем обмене сравнит «42» со своим «0000042», сопоставление сломается и появятся дубли. Перед изменением формата выгрузки убедитесь, что обе стороны обмена нормализуют ключи одинаково.
Проверка результата
После внедрения любого из способов проверьте обработку на контрольном наборе значений, а не на одном «удобном» номере. Минимальный набор: обычный номер с нулями, номер из одних нулей, номер без нулей вообще, номер с буквенным префиксом, пустая строка.
Как проверить результат
На выходе «123»
Пустая строка, «000000123» без изменений или «123 456» с пробелом
На выходе «0»
Пустая строка или исключение
На выходе «БП-000123» (нули внутри сохранены)
Исключение преобразования или обрезанный номер
Номер документа в базе не изменился
Номер перезаписан — нумерация повреждена
Для массовых обработок полезно временно добавить в цикл вывод «было → стало» в журнал регистрации или табличный документ: так сразу видно аномальные значения, которые не вписываются в ожидаемый формат.
Частые вопросы
Можно ли убрать лидирующие нули у номера документа прямо в базе?
Технически можно перезаписать реквизит, но делать этого не стоит: платформа хранит номер фиксированной длины и при записи снова дополнит его нулями либо нарушится работа нумератора. Нули убирают только в копии значения — при выводе, печати или выгрузке.
Как убрать нули слева, но оставить их внутри номера?
Используйте цикл со СтрНачинаетсяС: он срезает только подряд идущие нули в начале строки и останавливается на первом отличном символе. Номер «00АБ-001» превратится в «АБ-001», внутренние нули сохранятся.
Почему Формат(Число(Номер)) возвращает число с пробелами?
По умолчанию функция Формат группирует разряды неразрывными пробелами: «123 456». Добавьте параметр «ЧГ=» (пустая строка группировки): Формат(Число(Номер), "ЧГ=") — и пробелы исчезнут.
Как убрать лидирующие нули в динамическом списке?
В запросе динамического списка добавьте вычисляемое поле с ВЫРАЗИТЬ(Номер КАК ЧИСЛО) или каскадом ВЫБОР с ПОДСТРОКА и выводите его вместо стандартного поля «Номер». Учтите, что сортировка по такому полю будет числовой, а не строковой.
Что делать, если номер содержит буквы и Число() выдаёт ошибку?
Либо перейдите на цикл со СтрНачинаетсяС, который безопасен для любых строк, либо перед преобразованием проверьте строку на нецифровые символы (например, через СтрЗаменить всех цифр и проверку результата на пустоту) и обрабатывайте такие номера отдельной веткой.
Как сделать обратную операцию — добавить нули слева?
Два варианта: Формат(Значение, "ЧЦ=9; ЧВН=") для чисел или конструкция Прав("000000000" + СокрЛП(Код), 9) для строк, где 9 — требуемая длина результата.
Что важно запомнить
Лидирующие нули убирают только в копии значения — никогда в самом реквизите объекта. Для строк с возможными префиксами используйте цикл со СтрНачинаетсяС, для чисто цифровых номеров — Формат(Число(Строка), "ЧГ="), в запросах — ВЫРАЗИТЬ КАК ЧИСЛО или каскад ВЫБОР с ПОДСТРОКА. Обязательно проверяйте граничные случаи: строку из одних нулей и номера с буквами.