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

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

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

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

Лидирующие нули нужны в 1С чаще, чем кажется: при выгрузке ИНН и КПП в отчёты, формировании номеров документов фиксированной длины, обмене с банками и государственными системами, выводе кодов счетов и артикулов. Проблема в том, что числовые значения в 1С не хранят нули слева — число 42 останется 42, как бы вы его ни форматировали на входе. Поэтому дополнение нулями всегда делается либо при преобразовании в строку, либо через настройку длины строкового реквизита.

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

Почему 1С теряет нули слева и когда это важно

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

Типичные места, где это критично: ИНН организации (10 знаков) и ИНН физлица (12 знаков), КПП (9 знаков), коды ОКТМО и КБК, номера счетов (20 знаков), номера документов при обмене с ЭДО и банками, артикулы фиксированной длины. Если выгрузить ИНН «123456789» вместо «0123456789», файл может не пройти форматно-логический контроль у приёмной системы.

Способ 1. Функция Формат() с шаблоном

Самый короткий путь — встроенная функция Формат() с параметром «ЧЦ» (число целых знаков) и признаком дополнения нулями. Шаблон "ЧЦ=8; ЧВН=" означает: общая длина целой части 8 символов, недостающие позиции заполнить ведущими нулями.

bsl
НомерСтрокой = Формат(НомерДокумента, "ЧЦ=8; ЧВН=");
// НомерДокумента = 123 -> "00000123"

ИННСтрокой = Формат(ИНН, "ЧЦ=10; ЧН=");
// ИНН = 123456789 -> "0123456789"

Обратите внимание на нюансы синтаксиса. Параметр ЧВН (число с ведущими нулями) включает дополнение нулями слева, а ЧН=0 задаёт представление нуля. Если опустить ЧВН, число будет дополнено пробелами слева, а не нулями — это частая причина «не работающего» форматирования.

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

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

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

bsl
Функция ДополнитьСтрокуСлева(Знач Значение, Длина, Символ = "0") Экспорт
	Результат = СокрЛП(Строка(Значение));
	Пока СтрДлина(Результат) < Длина Цикл
		Результат = Символ + Результат;
	КонецЦикла;
	Возврат Результат;
КонецФункции

// Использование:
Артикул = ДополнитьСтрокуСлева("4571", 10); // "0000004571"

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

Вариант без цикла — через формирование строки нулей и взятие правой части: Прав(\"0000000000\" + СокрЛП(Значение), 10). Он короче и быстрее на больших объёмах, но требует, чтобы заготовленная строка нулей была не короче целевой длины.

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

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

В типовых конфигурациях генерация номера с префиксом и нулями выполняется в подписках на событие «ПриУстановкеНовогоНомера» (например, процедуры ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазыИОрганизации). Если вы дорабатываете нумерацию, меняйте именно эти обработчики или добавляйте свою подписку, а не встроенные механизмы платформы.

Способ 4. Хранение значения как строки фиксированной длины

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

Флаг «Фиксированная длина» в свойствах строки заставляет 1С дополнять значение до указанной длины, но дополняет она пробелами справа, а не нулями слева. Поэтому дополнение нулями всё равно выполняют кодом — в обработчике «ПередЗаписью» или при вводе. Зато строковый тип гарантирует, что записанные нули не потеряются при сохранении и обменах.

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

Как выбрать способ

Нули нужны только при выводе в отчёт, печать или файлИспользуйте Формат(Значение, "ЧЦ=N; ЧВН=") в месте формирования вывода
Значение уже строка или нужен нестандартный символ-заполнительНапишите или используйте существующую функцию дополнения строки слева в общем модуле
Речь о номерах документов с префиксамиНастройте нумератор и подписки ПрефиксацияОбъектовСобытия, тип номера — строка
Нули должны сохраняться в базе всегда (ИНН, КБК, счёт)Сделайте реквизит строковым фиксированной длины и дополняйте нулями при записи

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

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

Типичные ошибки
01
Шаблон Формат() без ЧВН: число дополняется пробелами слева вместо нулей, файл выгрузки отклоняется
02
Дополнение без СокрЛП(): пробелы в исходной строке съедают часть целевой длины, нулей добавляется меньше
03
Хранение ИНН или счёта числом: ведущий ноль теряется при сохранении, и восстановить его можно только по правилам длины
04
Обрезка длинных значений: функция Прав() без проверки длины отсекает старшие разряды, если значение длиннее целевого
05
Изменение типа номера документа в рабочей базе без копии: ломается сортировка и нумерация существующих документов
Контрольные точки

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

Длина итоговой строки
Норма

Всегда равна целевой длине для любых тестовых значений

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

Длина плавает или строка длиннее целевой

Значение ноль
Норма

Ноль превращается в строку из одних нулей нужной длины

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

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

Значение максимальной длины
Норма

Возвращается без изменений, разряды не обрезаны

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

Старшие цифры отсечены

Файл выгрузки
Норма

Проходит форматно-логический контроль приёмной системы

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

Ошибки формата по полям с кодами и ИНН

FAQ

Как вывести число с лидирующими нулями в запросе 1С?

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

Почему ИНН контрагента выгружается без первого нуля?

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

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

Да, логика та же, но символ добавляется в конец строки: Результат = Результат + Символ. Для чисел правое дополнение нулями встречается редко, чаще оно нужно для кодов и масок фиксированного формата.

Что делать, если значение длиннее целевой длины?

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

Как добавить нули в номере документа при печати, не меняя данные?

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

Есть ли готовая функция дополнения строки в типовых конфигурациях?

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

Итог

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

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