В типовых конфигурациях 1С номера документов часто имеют фиксированную длину и содержат множество ведущих нулей (например, «000000140»). При выводе на печать пользователям удобнее видеть краткий номер — «140». Задача кажется простой, но она имеет свои нюансы, связанные с буквенными префиксами, префиксами информационных баз и спецификой счетов-фактур на аванс. В этой статье мы разберем все способы решения: от самых простых до наиболее надежных и профессиональных.
Если вы работаете в современной типовой конфигурации (например, «1С:Бухгалтерия 3.0», «1С:ERP» или «1С:Управление торговлей 11»), самым правильным решением будет использование встроенных механизмов БСП. Это гарантирует, что программа не только уберет нули, но и корректно обработает префиксы организации и информационных баз.
Основным инструментом здесь является общий модуль ПрефиксацияОбъектовКлиентСервер. Давайте проанализируем функцию ПолучитьНомерНаПечать, которая инкапсулирует в себе всю сложную логику. Мы можем вызвать ее следующим образом:
// НомерОбъекта - это строковый номер документа, например "МС00-000140"
УдалитьПрефиксИБ = Истина;
УдалитьПользовательскийПрефикс = Истина;
НомерДляПечати = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(НомерОбъекта, УдалитьПрефиксИБ, УдалитьПользовательскийПрефикс);
Рассмотрим подробнее, что происходит внутри этой функции. Она последовательно выполняет несколько действий:
Если вы уверены, что номер документа состоит исключительно из цифр и не содержит буквенных префиксов или дробей, можно воспользоваться быстрым методом преобразования типов. Проанализируем пример кода:
МойНомер = "0000001540";
// Преобразуем строку в число, чтобы избавиться от нулей,
// а затем форматируем обратно в строку без группировки разрядов
НомерДляПечати = Формат(Число(МойНомер), "ЧГ=0");
Важное предупреждение: этот метод крайне опасен в следующих ситуациях:
Число() вызовет ошибку выполнения.Число.Для минимизации рисков при использовании этого метода рекомендуется всегда заключать его в блок Попытка...Исключение:
Функция ПолучитьЧисловойНомер(Знач ВходнойНомер)
Попытка
Возврат Формат(Число(ВходнойНомер), "ЧГ=0");
Исключение
// Если преобразование не удалось, возвращаем исходный номер
Возврат ВходнойНомер;
КонецПопытки;
КонецФункции
Этот метод универсален и подходит для самописных конфигураций, где нет БСП, или для случаев, когда нужно сохранить буквенный префикс, но убрать нули после него. Разберем алгоритм обрезки первого символа, пока он является нулем:
Номер = СокрЛП(Документ.Номер);
Пока Лев(Номер, 1) = "0" Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
Этот код эффективно удаляет все нули слева. Однако, если номер состоит только из нулей (что редко, но возможно), в итоге получится пустая строка. Для предотвращения этого добавим проверку:
Номер = СокрЛП(Документ.Номер);
Пока Лев(Номер, 1) = "0" И СтрДлина(Номер) > 1 Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
В модуле СтроковыеФункцииКлиентСервер есть полезная функция УдалитьПовторяющиесяСимволыСлева. Она работает быстрее циклов и выглядит гораздо лаконичнее. Рассмотрим ее применение:
ИсходныйНомер = "000000789";
СимволДляУдаления = "0";
Результат = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволыСлева(ИсходныйНомер, СимволДляУдаления);
Для тех, кто предпочитает более технологичные подходы, можно использовать объект VBScript.RegExp. Этот способ работает мгновенно даже с очень длинными строками и позволяет гибко настраивать правила удаления. Посмотрим на пример кода:
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Pattern = "^0+"; // Ищем все нули в начале строки
РегВыражение.Global = Ложь;
Результат = РегВыражение.Replace(ИсходныйНомер, "");
Выясним причину, по которой обычное удаление нулей может быть критичным для бухгалтерии. Счета-фактуры на аванс часто имеют префикс «А» (например, «А000000140»). Если мы просто применим Число(), мы потеряем литеру «А», что является нарушением правил ведения книги продаж.
В типовых конфигурациях логика для таких документов обычно выглядит так:
Проанализируем фрагмент типового кода для такой ситуации:
// Пример логики из типовой Бухгалтерии
Если ЭтоСчетФактураНаАванс Тогда
Номер = Сред(Номер, 2); // Отрезаем "А"
// ... здесь удаляем нули любым из способов выше ...
Номер = "А" + Номер; // Возвращаем "А"
КонецЕсли;
Выбор метода зависит от вашей среды разработки:
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(). Это стандарт платформы.Формат(Число(Номер), "ЧГ=0"), но обязательно внутри блока Попытка.Пока или функцию УдалитьПовторяющиесяСимволыСлева.Помните, что номер документа — это идентификатор, и его чрезмерное «сокращение» в печатной форме не должно мешать поиску оригинала документа в базе данных.