Как установить лидирующие нули в номере документа в 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки и настройки конфигураций на платформе 1С:Предприятие разработчики часто сталкиваются с необходимостью управления номерами документов. Одной из самых распространенных задач является заполнение номера лидирующими нулями (например, превращение номера "25" в одиннадцатисимвольный вид "00000000025"). Это критически важно для правильной сортировки документов в списках, так как строковые типы данных сортируются посимвольно (лексикографически), а не математически.

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

Анализ синтаксической ошибки в конструкции ветвления

Часто при написании кода ручной обработки номеров начинающие программисты допускают досадные синтаксические ошибки при работе с условиями. Рассмотрим типичный пример ошибки:


Иначе СтрДлина(СТРОКА(НомерДокумента)) = 2 Тогда
    // Какое-то действие

При проверке или компиляции такого кода платформа выдаст ошибку: «Встроенная функция может быть использована только в выражении (СтрДлина)». Выясним причину этого поведения.

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

Для исправления этой ошибки мы должны использовать правильный синтаксис множественного ветвления с помощью ключевого слова ИначеЕсли:


Если СтрДлина(Строка(НомерДокумента)) = 1 Тогда
    // Обработка однозначного номера
ИначеЕсли СтрДлина(Строка(НомерДокумента)) = 2 Тогда
    // Обработка двузначного номера
Иначе
    // Обработка всех остальных случаев
КонецЕсли;

Помните, что ключевое слово ИначеЕсли пишется слитно, и после него обязательно должно следовать логическое условие, завершающееся словом Тогда.

Способ 1. Использование функции Прав() для текстовых номеров

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

Давайте разберем этот алгоритм по шагам. Допустим, нам нужно получить номер строго заданной длины — например, 11 символов. Мы можем "нарастить" исходный номер строкой, состоящей из одиннадцати нулей, а затем забрать ровно 11 символов с правой стороны получившейся строки.

Посмотрим на пример практической реализации:


// Определяем требуемую длину номера
ДлинаНомера = 11;
// Очищаем исходный номер от лишних концевых пробелов
ИсходныйНомер = СокрЛП(Объект.Номер); 
// Дополняем нулями слева и обрезаем справа
Объект.Номер = Прав("00000000000" + ИсходныйНомер, ДлинаНомера);

Проанализируем ситуацию: если исходный номер был равен "15", строка "00000000000" + "15" превратится в "0000000000015" (всего 13 символов). Функция Прав() с параметром 11 вернет нам 11 крайних правых символов, то есть "00000000015". Это чрезвычайно надежный, быстрый и простой способ, работающий в одну строку кода.

Способ 2. Применение функции Формат() для числовых значений

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

Рассмотрим подробнее шаблон форматирования. Для вывода лидирующих нулей используется специальный конструктор форматной строки:


ЧисловойНомер = Число(Объект.Номер);
// Применяем форматирование
Объект.Номер = Формат(ЧисловойНомер, "ЧЦ=11; ЧВН=; ЧГ=0");

Разберем параметры форматной строки по деталям:

  1. ЧЦ=11 (Число целых) — указывает платформе общую длину формируемого числа.
  2. ЧВН= (Выводить незначащие нули) — этот флаг заставляет систему заполнять пустые разряды слева нулями вместо пробелов.
  3. ЧГ=0 (Группировка) — отключает разделение тысяч пробелами. Если этого не сделать, вы можете получить строку вида "00 000 000 025", что недопустимо для номера документа.

Важное предупреждение: этот способ крайне чувствителен к типу данных. Если в номере документа случайно окажется буква (например, префикс организации "МД-0001"), функция Число() вызовет аварийное завершение работы программы с ошибкой преобразования типа.

Способ 3. Дополнение строки нулями с помощью БСП

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

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


// Используем функцию из БСП
Объект.Номер = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Объект.Номер, 11, "0", "Слева");

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

Способ 4. Переход на штатную автонумерацию платформы 1С

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

Чтобы автонумерация работала корректно, необходимо соблюдать следующие правила:

  1. В конфигураторе у нужного вида документа свойство Тип номера должно быть установлено в значение Строка.
  2. Свойство Автонумерация должно находиться в режиме Автоматически.
  3. Длина номера должна быть достаточной для хранения префиксов и порядкового номера (рекомендуется от 11 символов).

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


НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();

// Метод генерирует следующий уникальный номер с лидирующими нулями 
// и учитывает переданный префикс организации (например, "ТД")
НовыйДокумент.УстановитьНовыйНомер("ТД");

НовыйДокумент.Записать();

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

Дополнительный сценарий: красивый вывод номера на печать

Бухгалтеры и менеджеры часто просят разработчиков убрать "лишние" нули и префиксы в печатных формах документов (например, выводить на печать "Акт № 45" вместо "Акт № БП-00000045"). Для решения этой обратной задачи в БСП также существует готовый инструмент.

Рассмотрим, как красиво получить номер для печатной формы:


// Получаем чистый номер без префиксов и лидирующих нулей
НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СсылкаНаДокумент.Номер, Истина, Истина);

Эта функция аккуратно удалит все префиксы организации, префиксы информационных баз и уберет все идущие слева нули. На печать уйдет лаконичный номер "45", в то время как в базе данных сохранится строгий одиннадцатизначный номер "БП-00000045", обеспечивающий идеальную сортировку и стабильную работу автонумератора.

← На главную