Разработка и Конфигурация · 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"
Эта функция удобна тем, что умеет дополнять любым символом и с любой стороны, а также корректно работает, если строка уже длиннее требуемого — возвращает исходное значение без изменений. Если ваша конфигурация построена на БСП, используйте её вместо самописных циклов: код будет единообразным.
Сравнение способов
Подходит для чисел, одна строка кода. Не работает со строками и номерами с префиксами.
Универсально для строк, просто читается. Медленнее на больших объёмах.
Быстро и компактно для строк. Нужен запас нулей и контроль длины.
Стандартно для типовых конфигураций. Требует наличия библиотеки в конфигурации.
Номера документов и коды справочников
В типовых конфигурациях номера документов уже хранятся строкой фиксированной длины с нулями — этим управляет механизм нумерации и префиксации. Длина номера задаётся в свойствах объекта конфигурации (поле «Длина номера»), а автоматическое дополнение нулями выполняет платформа при присвоении очередного номера.
Если вы создаёте собственный документ и хотите номера вида «000000001»:
- Установите тип номера «Строка» и нужную длину в свойствах объекта.
- Проверьте, что включена автонумерация.
- При необходимости префиксов (организация, информационная база) используйте стандартный механизм префиксации БСП — он сам дополняет номер нулями после префикса.
Для кодов справочников логика аналогична. Если код должен быть «007» и участвовать в упорядочивании, строковый тип с дополнением нулями даст правильную сортировку: «007» < «010» < «102». С числовым кодом сортировка тоже правильная, но отображение нулей придётся делать форматированием в каждом месте вывода.
Выгрузка в файлы и обмен с внешними системами
При выгрузке в XML, CSV, DBF или текстовые файлы фиксированного формата требование к лидирующим нулям встречается почти всегда: банковские форматы, обмен с кассами, интеграции с сайтами. Здесь действуют те же функции, но добавляются два правила.
Первое: форматируйте значение непосредственно в момент записи в файл, а не храните отформатированную копию в базе. Иначе при изменении требований внешней системы придётся переделывать данные, а не код.
Второе: проверяйте длину результата после форматирования. Если внешняя система ждёт ровно 10 символов, а число выросло до 11 разрядов, Формат() молча вернёт более длинную строку, и файл будет отклонён на стороне приёмника. Добавьте явную проверку СтрДлина() с понятным сообщением об ошибке.
- 1Определите требуемую длину поля по спецификации внешней системы
- 2Преобразуйте значение: Формат(Значение, "ЧЦ=N; ЧВН=; ЧГ=0")
- 3Проверьте СтрДлина(Результат) — она не должна превышать N
- 4Запишите значение в файл и проверьте его на тестовой выгрузке
Проверка результата и типичные ошибки
После внедрения любого из способов проверьте результат на граничных значениях: ноль, единица, число длиной ровно N, число длиннее N, отрицательное число. Отрицательные значения — отдельный подводный камень: знак минуса занимает символ, и «-42» с ЧЦ=5 даст неожиданный результат, поэтому для отрицательных чисел логику нужно продумывать отдельно.
Отдельно отметим запросы: в языке запросов 1С нет функции дополнения строки нулями. Пытаться собрать это через ПОДСТРОКА и ВЫБОР — плохая идея, громоздко и хрупко. Правильный путь — выбрать числовое значение запросом и форматировать его уже в коде при обходе выборки.
Как проверить результат
Длина равна заданной, слева только нули, без пробелов
Есть пробелы между цифрами или длина больше заданной
Вернулось N нулей или заданное представление нуля
Пустая строка или ошибка форматирования
Обнаружено проверкой и выдано сообщение
Длинная строка молча ушла в файл обмена
FAQ
Как убрать лидирующие нули из строки?
Проще всего преобразовать строку в число и обратно: Строка(Число("00042")) даст «42». Если строка может содержать буквы, числовое преобразование не сработает — тогда обрезайте нули в цикле, пока первый символ равен «0» и длина больше единицы.
Работает ли Формат() с параметром ЧЦ на управляемых формах и в тонком клиенте?
Да, функция Формат доступна везде: на сервере, в тонком и веб-клиенте. Различий в поведении форматной строки между клиентами нет, поэтому код дополнения нулями можно писать в общих модулях без дублирования.
Как добавить нули к номеру, в котором уже есть буквенный префикс?
Формат() не подойдёт — это строка. Отделите префикс от числовой части (например, поиском первой цифры), дополните числовую часть нулями и склейте обратно. В типовых конфигурациях эту задачу решает механизм префиксации БСП автоматически.
Почему в печатной форме номер выводится без нулей, хотя в базе они есть?
Скорее всего, в коде печатной формы номер явно преобразуется к числу или используется функция удаления префиксов и нулей — в типовых конфигурациях для «человекочитаемого» вывода применяется специальное форматирование номера. Найдите это место в модуле печати и замените на вывод исходного строкового номера.
Можно ли дополнить нулями прямо в запросе?
Штатной функции для этого в языке запросов нет. Обходной путь через ВЫБОР и ПОДСТРОКА возможен для малого числа вариантов длины, но он громоздкий. Рекомендуется выбирать число запросом и форматировать его в коде при обработке результата.
Что делать, если внешняя система требует нули, а в 1С поле числовое?
Ничего менять в структуре базы не нужно. Оставьте реквизит числовым, а при выгрузке применяйте Формат(Значение, "ЧЦ=N; ЧВН=; ЧГ=0"). Требования к представлению решаются на этапе формирования файла, а не хранения данных.
Что важно запомнить
Нули слева — это свойство строки, а не числа. Для чисел используйте Формат с ЧЦ и обязательным ЧГ=0, для строк — Прав(Нули + Строка, N) или функцию ДополнитьСтроку из БСП. Всегда проверяйте итоговую длину при обмене с внешними системами и не меняйте типы реквизитов в рабочей базе без копии.