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

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

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

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

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

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


// НомерОбъекта - это строковый номер документа, например "МС00-000140"
УдалитьПрефиксИБ = Истина; 
УдалитьПользовательскийПрефикс = Истина;
НомерДляПечати = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(НомерОбъекта, УдалитьПрефиксИБ, УдалитьПользовательскийПрефикс);

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

  1. Удаление пользовательских префиксов: Если номер был изменен пользователем вручную с добавлением разделителей.
  2. Удаление лидирующих нулей: Выполняется поиск первой значащей цифры.
  3. Удаление префиксов организации и ИБ: Используется стандартная длина префикса (обычно 2 или 4 символа плюс дефис).

Способ 2. Упрощенное преобразование «Строка — Число — Строка»

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


МойНомер = "0000001540"; 
// Преобразуем строку в число, чтобы избавиться от нулей, 
// а затем форматируем обратно в строку без группировки разрядов
НомерДляПечати = Формат(Число(МойНомер), "ЧГ=0");

Важное предупреждение: этот метод крайне опасен в следующих ситуациях:

Для минимизации рисков при использовании этого метода рекомендуется всегда заключать его в блок Попытка...Исключение:


Функция ПолучитьЧисловойНомер(Знач ВходнойНомер)
    Попытка
        Возврат Формат(Число(ВходнойНомер), "ЧГ=0");
    Исключение
        // Если преобразование не удалось, возвращаем исходный номер
        Возврат ВходнойНомер;
    КонецПопытки;
КонецФункции

Способ 3. Ручная обработка строки (Цикл)

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


Номер = СокрЛП(Документ.Номер);
Пока Лев(Номер, 1) = "0" Цикл
    Номер = Сред(Номер, 2);
КонецЦикла;

Этот код эффективно удаляет все нули слева. Однако, если номер состоит только из нулей (что редко, но возможно), в итоге получится пустая строка. Для предотвращения этого добавим проверку:


Номер = СокрЛП(Документ.Номер);
Пока Лев(Номер, 1) = "0" И СтрДлина(Номер) > 1 Цикл
    Номер = Сред(Номер, 2);
КонецЦикла;

Способ 4. Работа со строковыми функциями БСП

В модуле СтроковыеФункцииКлиентСервер есть полезная функция УдалитьПовторяющиесяСимволыСлева. Она работает быстрее циклов и выглядит гораздо лаконичнее. Рассмотрим ее применение:


ИсходныйНомер = "000000789";
СимволДляУдаления = "0";
Результат = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволыСлева(ИсходныйНомер, СимволДляУдаления);

Способ 5. Регулярные выражения (RegExp)

Для тех, кто предпочитает более технологичные подходы, можно использовать объект VBScript.RegExp. Этот способ работает мгновенно даже с очень длинными строками и позволяет гибко настраивать правила удаления. Посмотрим на пример кода:


РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Pattern = "^0+"; // Ищем все нули в начале строки
РегВыражение.Global = Ложь;
Результат = РегВыражение.Replace(ИсходныйНомер, "");

Особый случай: Счета-фактуры на аванс

Выясним причину, по которой обычное удаление нулей может быть критичным для бухгалтерии. Счета-фактуры на аванс часто имеют префикс «А» (например, «А000000140»). Если мы просто применим Число(), мы потеряем литеру «А», что является нарушением правил ведения книги продаж.

В типовых конфигурациях логика для таких документов обычно выглядит так:

  1. Проверяется, является ли счет-фактура авансовым.
  2. Если да, то запоминается префикс «А».
  3. Оставшаяся часть номера очищается от нулей.
  4. Префикс «А» приклеивается обратно к очищенному номеру.

Проанализируем фрагмент типового кода для такой ситуации:


// Пример логики из типовой Бухгалтерии
Если ЭтоСчетФактураНаАванс Тогда
    Номер = Сред(Номер, 2); // Отрезаем "А"
    // ... здесь удаляем нули любым из способов выше ...
    Номер = "А" + Номер; // Возвращаем "А"
КонецЕсли;

Резюме и рекомендации

Выбор метода зависит от вашей среды разработки:

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

← На главную