При работе в конфигурациях «1С:Предприятие» многие пользователи и бухгалтеры сталкиваются с тем, что стандартные номера документов выглядят громоздко. Например, вместо ожидаемого номера «123» в печатную форму выводится строка вида АБ-000000123. Это происходит из-за того, что система автоматически добавляет префиксы организации, префиксы информационной базы и дополняет номер нулями для обеспечения правильной сортировки в базе данных.
В этой статье мы подробно разберем, как программно преобразовать номер документа, чтобы оставить только значимую часть. Мы рассмотрим несколько методов: от простых манипуляций со строками до использования мощных инструментов Библиотеки стандартных подсистем (БСП).
Прежде чем мы перейдем к решению, давайте проанализируем ситуацию и выясним причину такого формата номера. В 1С номер документа — это строковое поле. Чтобы программа могла корректно сортировать документы по порядку (например, чтобы номер 10 шел после номера 9), все номера должны иметь одинаковую длину. Именно поэтому система добавляет ведущие нули.
Префиксы же позволяют разделять документы разных организаций или документы, созданные в разных узлах распределенной информационной базы (РИБ). Обычно структура номера выглядит так: [ПрефиксОрг][ПрефиксИБ]-[НомерСНулями].
Если вы работаете в современной конфигурации (например, БП 3.0, УТ 11, ERP) или даже в старой БП 2.0, где подключены модули БСП, лучше всего использовать встроенные функции. Они учитывают все нюансы префиксации и гарантируют корректный результат.
Рассмотрим использование функции НомерНаПечать из модуля ПрефиксацияОбъектовКлиентСервер. Этот метод является наиболее «правильным» с точки зрения архитектуры 1С.
// Пример вывода номера без префиксов и нулей
НомерДляПечати = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СсылкаНаОбъект.Номер, Истина, Истина);
Область.Параметры.Номер1 = НомерДляПечати;
Разберем параметры этой функции подробнее:
Номер — исходный строковый номер документа (например, АБ-000000123).УдалитьПрефиксИнформационнойБазы — булево значение (Истина/Ложь).УдалитьПрефиксОрганизации — булево значение (Истина/Ложь).Если вы работаете в более старых версиях (как в случае с БП 2.0), может подойти вызов из общего модуля ОбщегоНазначения:
МассивПрефиксов = Новый Массив;
МассивПрефиксов.Добавить(СсылкаНаОбъект.Организация.Префикс);
Область.Параметры.Номер1 = ОбщегоНазначения.ПолучитьНомерНаПечать(СсылкаНаОбъект, МассивПрефиксов);
Иногда программисты прибегают к хитрости, используя преобразование строки в число. Функция Число() в 1С автоматически отсекает все ведущие нули. Однако этот метод имеет существенный недостаток: если в номере останутся буквы (например, суффикс 123А), система выдаст критическую ошибку.
Посмотрим на пример такого кода, который сначала удаляет известный префикс, а затем преобразует результат:
// Удаляем префикс и превращаем в число для отсечения нулей
Префикс = СсылкаНаОбъект.Организация.Префикс;
НомерБезПрефикса = СтрЗаменить(СсылкаНаОбъект.Номер, Префикс, "");
Попытка
Область.Параметры.Номер1 = Число(НомерБезПрефикса);
Исключение
// Если в номере были буквы, просто выводим как есть
Область.Параметры.Номер1 = НомерБезПрефикса;
КонецПопытки;
Важно: Этот способ можно использовать только тогда, когда вы на 100% уверены, что номер содержит только цифры после префикса.
Если нам нужно сохранить буквенные окончания (например, 123А или 000045/1), но при этом убрать лидирующие нули, мы можем воспользоваться алгоритмом посимвольной обработки. Проанализируем ситуацию: нам нужно найти первый символ, который не является нулем, и обрезать строку до него.
Рассмотрим пример функции, которая делает это надежно:
Функция ОчиститьНомерОтНулей(Знач ВходнойНомер)
// 1. Удаляем стандартный префикс (до дефиса включительно)
ПозицияТире = СтрНайти(ВходнойНомер, "-");
Если ПозицияТире > 0 Тогда
ВходнойНомер = Сред(ВходнойНомер, ПозицияТире + 1);
КонецЕсли;
// 2. В цикле удаляем нули слева
Пока Лев(ВходнойНомер, 1) = "0" Цикл
ВходнойНомер = Сред(ВходнойНомер, 2);
КонецЦикла;
Возврат ВходнойНомер;
КонецФункции
Использование этого метода позволяет избежать ошибок преобразования типов и корректно обрабатывать номера с любыми символами.
Для более сложных случаев, когда структура номера может быть нестандартной, можно применить объект VBScript.RegExp. Это позволяет одной строкой кода описать шаблон того, что нужно удалить (все нецифровые символы и нули в начале строки).
Разберем пример кода:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^[A-ZА-Я0-9]*-0*"; // Шаблон для поиска префикса и нулей
Результат = RegExp.Replace(СсылкаНаОбъект.Номер, "");
Этот метод считается продвинутым и требует установленных компонентов Windows на сервере 1С, но он крайне эффективен для нестандартных задач форматирования.
В документе «Поступление товаров и услуг» часто используется поле НомерВходящегоДокумента. Важно понимать разницу: внутренний Номер генерируется системой 1С по строгим правилам префиксации, а НомерВходящегоДокумента заполняется бухгалтером вручную на основании бумажной накладной поставщика.
Если бухгалтер вводит входящий номер как 000567, функции БСП могут его не обработать, так как в нем нет системного префикса организации. В этом случае лучше всего использовать метод циклического удаления нулей (Решение 3) или функцию из БСП УправлениеКонтактнойИнформациейКлиентСервер.ОставитьТолькоЦифрыВСтроке, если вам нужно избавиться от всех букв и знаков.
Мы рассмотрели различные подходы к форматированию номеров в 1С. Выбор конкретного метода зависит от ваших задач:
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать.Число() с обработкой исключения.Пока Лев(Текст, 1) = "0".Применяя эти методы, вы сможете сделать печатные формы документов более аккуратными и удобными для чтения, что обязательно оценят конечные пользователи и контрагенты.