В процессе работы с 1С часто возникает задача подготовить номер документа для вывода на печать или для выгрузки во внешние системы, например, в системы электронного документооборота (ЭДО). Стандартно платформа 1С формирует номера с ведущими (лидирующими) нулями для сохранения заданной длины и корректной сортировки, например, 0000000550. Однако в печатной форме или в XML-файле такой номер может выглядеть избыточно, и требуется его сокращенный вариант — 550. Если же в вашей базе произошел сбой в этом механизме, стоит изучить, как исправить ошибку механизма автонумерации объектов.
Рассмотрим несколько способов, как корректно убрать лидирующие нули из номера документа, не изменяя при этом сам номер в базе данных. Проанализируем как наиболее предпочтительные методы с использованием стандартных функций, так и альтернативные подходы.
Если ваша конфигурация разработана с использованием Библиотеки стандартных подсистем (БСП), то это самый правильный и надежный способ. В БСП уже есть готовые функции, которые учитывают все нюансы структуры номеров в 1С, включая префиксы. Разобраться в них подробнее поможет актуальный справочник по методам БСП с примерами использования.
Метод А: УдалитьЛидирующиеНулиИзНомераОбъекта
Эта функция находится в общем модуле ПрефиксацияОбъектовКлиентСервер и предназначена именно для удаления лидирующих нулей из числовой части номера, сохраняя при этом все префиксы.
Посмотрим на пример:
Предположим, у нас есть номер документа со сложным префиксом: "0ФНК-000365". Функция корректно обработает его и вернет "0ФНК-365", убрав нули только из числовой части.
Пример использования в коде:
// Предположим, что ИсходныйНомерДокумента = "0000000550"
СтрокаТаблицы.Параметры.ДокНомер = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(ИсходныйНомерДокумента);
// В параметр ДокНомер запишется значение "550"
// Пример с префиксом
НомерСПрефиксом = "0ФНК-000365";
Результат = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(НомерСПрефиксом);
// В переменной Результат будет "0ФНК-365"
Метод Б: НомерНаПечать
Эта функция из того же модуля ПрефиксацияОбъектовКлиентСервер обладает еще более широкими возможностями и идеально подходит для подготовки номеров для печатных форм. Если вы создаете внешнюю подключаемую печатную форму, использование этой функции является стандартом разработки. Помимо удаления лидирующих нулей, она умеет отбрасывать префиксы организации и информационной базы.
Основные возможности функции НомерНаПечать:
Это делает ее универсальным инструментом для большинства задач. Например, вы можете использовать этот подход, реализуя печать и подписи на БСП 3.1.10 в своих проектах.
Пример вызова:
// Исходный номер может содержать префиксы, например "УТ-0000123"
НомерОбъекта = ДокументСсылка.Номер;
// Просто убираем нули и стандартные префиксы
НомерДляПечати = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерОбъекта);
// Передаем результат в макет
ОбластьМакета.Параметры.НомерДокумента = НомерДляПечати;
Этот метод прост и эффективен, но имеет важное ограничение: он работает только для номеров, состоящих исключительно из цифр. Если в номере есть буквы, дефисы или другие символы, попытка преобразования в число вызовет ошибку.
Суть метода в том, чтобы преобразовать строковое представление номера в тип Число, при этом все ведущие нули автоматически исчезнут. Затем число нужно преобразовать обратно в строку. Такой способ часто применяется, когда выполняется заполнение Word-макетов при помощи БСП, если требуется максимально упростить код.
Посмотрим на примеры кода:
ДокНомер = "0000000550";
// Вариант 1: через преобразование в Число и затем в строку
ЧисловойНомер = Число(ДокНомер); // Получим число 550
СтроковыйНомер = Строка(ЧисловойНомер); // Получим строку "550"
// Вариант 2: в одну строку с помощью XMLСтрока (часто используется)
Результат = XMLСтрока(Число(ДокНомер)); // Вернет "550"
// Вариант 3: с помощью функции Формат
// "ЧГ=" означает "Число без Группировки разрядов"
Результат = Формат(Число(ДокНомер), "ЧГ="); // Вернет "550"
Важно: перед использованием этого метода всегда убедитесь, что в номере нет нечисловых символов, иначе программа аварийно завершится с ошибкой преобразования типов.
Этот способ является универсальным. Он не зависит от наличия БСП и справится с любой строкой, содержащей любые символы. Метод заключается в последовательной проверке первого символа строки: если это ноль, он отсекается, и так до тех пор, пока первый символ не перестанет быть нулем.
Хотя этот метод может быть чуть менее производительным на очень больших объемах данных по сравнению со встроенными функциями, он очень надежен и его логика прозрачна.
Разберем по шагам реализацию в коде:
Номер = "00000000170";
Пока Лев(Номер, 1) = "0" И СтрДлина(Номер) > 1 Цикл
// Отсекаем первый символ, если это ноль
// Используем Прав(), чтобы взять все символы, кроме первого
Номер = Прав(Номер, СтрДлина(Номер) - 1);
КонецЦикла;
// В переменной "Номер" будет "170"
// Добавлена проверка СтрДлина(Номер) > 1, чтобы не удалить последний ноль в номере "0"
Другой вариант реализации той же логики с использованием функции Сред():
Номер = "0000000550";
Пока Лев(Номер, 1) = "0" Цикл
// Берем подстроку, начиная со второго символа
Номер = Сред(Номер, 2);
КонецЦикла;
// В переменной "Номер" будет "550"
Подводя итог, можно дать следующие рекомендации:
НомерНаПечать или УдалитьЛидирующиеНулиИзНомераОбъекта), если они доступны в вашей конфигурации. Это стандарт индустрии и наиболее безопасный метод.