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

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

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

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

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

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

Почему нули пропадают: число против строки

В 1С тип «Число» хранит только значение, без какого-либо представления. Записать Номер = 00042 бессмысленно — в памяти останется 42. Форматирование с нулями существует только в момент преобразования числа в строку: при выводе на экран, в печатную форму, в файл обмена.

Отсюда следует практическое правило: если нули являются значимой частью данных (например, код склада «007» должен именно храниться и участвовать в поиске), реквизит нужно делать строковым. Если нули нужны только для отображения — храните число и форматируйте при выводе.

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

Способ 1: функция Формат с параметром ЧЦ

Самый короткий и правильный способ — функция Формат() с параметрами форматной строки. Она дополняет число нулями слева до указанной общей длины:

Номер = 123;

СтрокаСНулями = Формат(Номер, "ЧЦ=10; ЧВН=; ЧГ=0");

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

Разбор параметров:

  • ЧЦ=10 — общее количество знаков в результате, включая нули;
  • ЧВН= — пустое значение параметра «ведущий нуль» означает, что разряды дополняются нулями (если указать ЧВН=1, поведение меняется — проверяйте на своей версии платформы);
  • ЧГ=0 — отключает группировку разрядов пробелами, иначе получите «000 001 23» с неразрывными пробелами, что сломает обмен данными.

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

Способ 2: ручное дополнение нулями в цикле

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

Процедура ДополнитьНулями(Строка, НужнаяДлина)

Пока СтрДлина(Строка) < НужнаяДлина Цикл

Строка = "0" + Строка;

КонецЦикла;

КонецПроцедуры

Более быстрый вариант без цикла — через формирование строки нулей нужной длины и отсечение лишнего:

Строка = "42";

НужнаяДлина = 8;

Нули = "0000000000000000"; // запас с избытком

Результат = Прав(Нули + Строка, НужнаяДлина);

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

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

Способ 3: дополнение через функции работы со строками

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

Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку("42", 8, "0", "Слева");

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

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

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

Формат(Число, "ЧЦ=N; ЧВН=; ЧГ=0")

Подходит для чисел, одна строка кода. Не работает со строками и номерами с префиксами.

Цикл с конкатенацией

Универсально для строк, просто читается. Медленнее на больших объёмах.

Прав(Нули + Строка, N)

Быстро и компактно для строк. Нужен запас нулей и контроль длины.

БСП ДополнитьСтроку()

Стандартно для типовых конфигураций. Требует наличия библиотеки в конфигурации.

Номера документов и коды справочников

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

Если вы создаёте собственный документ и хотите номера вида «000000001»:

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

Для кодов справочников логика аналогична. Если код должен быть «007» и участвовать в упорядочивании, строковый тип с дополнением нулями даст правильную сортировку: «007» < «010» < «102». С числовым кодом сортировка тоже правильная, но отображение нулей придётся делать форматированием в каждом месте вывода.

Выгрузка в файлы и обмен с внешними системами

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

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

Второе: проверяйте длину результата после форматирования. Если внешняя система ждёт ровно 10 символов, а число выросло до 11 разрядов, Формат() молча вернёт более длинную строку, и файл будет отклонён на стороне приёмника. Добавьте явную проверку СтрДлина() с понятным сообщением об ошибке.

Порядок действий при выгрузке с нулями
  1. 1
    Определите требуемую длину поля по спецификации внешней системы
  2. 2
    Преобразуйте значение: Формат(Значение, "ЧЦ=N; ЧВН=; ЧГ=0")
  3. 3
    Проверьте СтрДлина(Результат) — она не должна превышать N
  4. 4
    Запишите значение в файл и проверьте его на тестовой выгрузке

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

После внедрения любого из способов проверьте результат на граничных значениях: ноль, единица, число длиной ровно N, число длиннее N, отрицательное число. Отрицательные значения — отдельный подводный камень: знак минуса занимает символ, и «-42» с ЧЦ=5 даст неожиданный результат, поэтому для отрицательных чисел логику нужно продумывать отдельно.

Типичные ошибки
01
Забытый ЧГ=0 — в строке появляются неразрывные пробелы-разделители, ломается сравнение и обмен
02
Попытка хранить нули в числовом реквизите — они теряются при записи
03
Дополнение справа вместо слева при использовании универсальных функций — проверяйте параметр направления
04
Отсутствие контроля максимальной длины — длинное число молча выходит за рамки формата
05
Ручная склейка нулей в запросе вместо кода — в языке запросов нет функции дополнения, делайте это после выборки

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

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

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

Строка результата
Норма

Длина равна заданной, слева только нули, без пробелов

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

Есть пробелы между цифрами или длина больше заданной

Значение 0
Норма

Вернулось N нулей или заданное представление нуля

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

Пустая строка или ошибка форматирования

Число длиннее N
Норма

Обнаружено проверкой и выдано сообщение

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

Длинная строка молча ушла в файл обмена

FAQ

Как убрать лидирующие нули из строки?

Проще всего преобразовать строку в число и обратно: Строка(Число("00042")) даст «42». Если строка может содержать буквы, числовое преобразование не сработает — тогда обрезайте нули в цикле, пока первый символ равен «0» и длина больше единицы.

Работает ли Формат() с параметром ЧЦ на управляемых формах и в тонком клиенте?

Да, функция Формат доступна везде: на сервере, в тонком и веб-клиенте. Различий в поведении форматной строки между клиентами нет, поэтому код дополнения нулями можно писать в общих модулях без дублирования.

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

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

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

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

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

Штатной функции для этого в языке запросов нет. Обходной путь через ВЫБОР и ПОДСТРОКА возможен для малого числа вариантов длины, но он громоздкий. Рекомендуется выбирать число запросом и форматировать его в коде при обработке результата.

Что делать, если внешняя система требует нули, а в 1С поле числовое?

Ничего менять в структуре базы не нужно. Оставьте реквизит числовым, а при выгрузке применяйте Формат(Значение, "ЧЦ=N; ЧВН=; ЧГ=0"). Требования к представлению решаются на этапе формирования файла, а не хранения данных.

Итог

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

Нули слева — это свойство строки, а не числа. Для чисел используйте Формат с ЧЦ и обязательным ЧГ=0, для строк — Прав(Нули + Строка, N) или функцию ДополнитьСтроку из БСП. Всегда проверяйте итоговую длину при обмене с внешними системами и не меняйте типы реквизитов в рабочей базе без копии.