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

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

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

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

Лидирующие нули в номерах документов — штатный механизм платформы 1С:Предприятие 8.3: номер хранится как строка фиксированной длины, и пустые позиции слева заполняются нулями. Например, номер «000000125» — это тот же номер 125, но в формате, обеспечивающем правильную сортировку и уникальность. Проблема возникает, когда такой номер нужно вывести в печатную форму, передать в печатный макет, отправить контрагенту или сопоставить с номером из внешней системы, где нули не используются.

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

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

Почему в 1С номера содержат лидирующие нули

Номер документа в 1С 8.3 — это строковое значение фиксированной длины, заданной в свойствах объекта метаданных (обычно 11 символов в типовых конфигурациях). Платформа автоматически дополняет номер нулями слева до этой длины. Такой формат обеспечивает корректную лексикографическую сортировку: строки «000000002» и «000000125» упорядочиваются правильно, тогда как «2» и «125» при строковом сравнении дали бы неверный порядок.

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

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

Способ 1. Убрать нули программно при выводе

Самый безопасный вариант — обработать строку номера в момент вывода в печатную форму, отчёт или сообщение. Данные в базе при этом не меняются. Простейший вариант на встроенном языке:

НомерБезНулей = СокрЛП(НомерДокумента);

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

НомерБезНулей = Сред(НомерБезНулей, 2);

КонецЦикла;

Этот код последовательно отрезает первый символ, пока он равен нулю. Условие «СтрДлина > 1» защищает от ситуации, когда номер состоит из одних нулей, — в таком случае останется хотя бы один символ.

Альтернативный вариант — преобразование через число. Он короче, но имеет ограничение: работает только если в номере нет букв и префиксов:

Если СтрЧислоВхождений(НомерДокумента, "-") = 0 Тогда

Попытка

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

Исключение

НомерБезНулей = НомерДокумента;

КонецПопытки;

КонецЕсли;

Способ 2. Готовые функции типовых конфигураций

В конфигурациях на базе Библиотеки стандартных подсистем (УТ 11, ERP, БП 3.0, КА и других) уже есть штатный механизм получения номера для печати. Использовать его предпочтительнее собственных велосипедов: функция учитывает префиксы и особенности нумерации.

В современных версиях БСП вызов выглядит так:

НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(

ДокументОбъект.Номер, Истина, Истина);

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

Способ 3. Убрать нули в запросе и в СКД

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

НомерДляВывода = СокрЛП(Выборка.Номер);

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

НомерДляВывода = Сред(НомерДляВывода, 2);

КонецЦикла;

// дальнейшее использование НомерДляВывода

КонецЦикла;

Способ 4. Изменить длину номера в конфигураторе

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

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

Сравнение способов и критерии выбора

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

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

Нужно вывести номер без нулей в печатной форме типовой конфигурацииИспользуйте ПрефиксацияОбъектовКлиентСервер.НомерНаПечать()
Конфигурация самописная или функция БСП недоступнаНапишите функцию отсечения нулей через цикл Сред() в общем модуле
Номер содержит буквы или префиксНе используйте Число(), отсекайте нули посимвольно или убирайте префикс отдельно
Нули мешают на уровне хранения, а не выводаРассмотрите изменение метаданных, но только на копии базы и с анализом обменов

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

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

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

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

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

Номер «000000125» на печати
Норма

Выводится «125»

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

Остались нули или номер обрезан не с той стороны

Номер с префиксом «БП00-000125»
Норма

Выводится ожидаемый формат по договорённости с контрагентом

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

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

Поиск документа в журнале по номеру
Норма

Документ находится по полному номеру с нулями

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

Документ не находится ни в каком виде

Типичные ошибки

Типичные ошибки
01
Использование Число() без обработки исключений — при наличии букв или префикса в номере код падает с ошибкой
02
Отсечение нулей без проверки длины — номер из одних нулей превращается в пустую строку
03
Изменение длины номера в боевой базе без копии — риск усечения существующих номеров и нарушения уникальности
04
Удаление префикса вместе с нулями там, где префикс нужен для идентификации базы-источника в обмене
05
Доработка типовой печатной формы напрямую вместо использования расширения — изменения теряются при обновлении конфигурации

Отдельная распространённая ситуация — сопоставление номеров при обмене с сайтом или другой учётной системой. Если одна система хранит номер с нулями, а другая без, сравнение строк даст ложное несовпадение. Решение — приводить оба значения к единому виду перед сравнением: либо оба с нулями, либо оба без.

Итог

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

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

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

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

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

Почему функция НомерНаПечать не найдена в моей конфигурации?

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

Как убрать нули, но оставить префикс базы?

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

Мешают ли нули при поиске документа в журнале?

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

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

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

Что будет, если уменьшить длину номера в конфигураторе?

Новые номера будут дополняться нулями до новой, меньшей длины. Существующие номера, превышающие новую длину, могут быть усечены при перезаписи документов, что создаёт риск дублирования и конфликтов уникальности. Перед изменением сделайте резервную копию и проверьте максимальную фактическую длину номеров в базе.