Разработка и Конфигурация · 12 мин
Как получить номер документа без префикса и нулей в 1С
Способы убрать префикс и ведущие нули из номера документа в 1С: готовые функции на встроенном языке, запросы, типичные ошибки и проверка результата.
Номер документа в 1С — строка, которая почти всегда содержит префикс информационной базы или организации и ведущие нули для выравнивания длины: например, «00БП-000123» или «0000-000045». Для печатных форм, обмена данными, интеграции с внешними системами и поиска часто нужен «чистый» номер — только значащие цифры: «123» или «45».
Задача решается несколькими способами: встроенными функциями общих модулей (в типовых конфигурациях), собственной функцией на встроенном языке, а также обработкой на уровне запроса. Выбор зависит от того, где работаете — в типовой конфигурации на поддержке или в собственной доработке — и от того, как именно формируется префикс: с буквами, с дефисом, с разделителем «-» или без него.
Ниже разобраны рабочие варианты кода, условия их применения, ограничения и способы проверить, что обрезка номера не сломала нумерацию и обмен данными.
Как устроен номер документа в 1С и почему в нём префикс и нули
Номер документа хранится в реквизите «Номер» как строка фиксированной длины (обычно 11 символов, зависит от настройки длины номера в метаданных). Платформа автоматически дополняет номер ведущими нулями до полной длины, чтобы сортировка и автонумерация работали корректно.
Префикс добавляется механизмом префиксации — в типовых конфигурациях это функциональность библиотеки стандартных подсистем (БСП). Префикс может включать код организации, код обособленного подразделения, буквенный признак вида документа и разделитель. Например, «АВ00-001234»: «АВ» — префикс базы, «00» — префикс организации, дефис — разделитель, «001234» — значащая часть.
Важно понимать: префикс и нули — это не «лишнее оформление», а часть механизма, обеспечивающего уникальность номеров при распределённой работе и обмене между базами. Убирать их нужно только для представления — на печать, в выгрузку, в сообщение обмена. Сам номер в базе изменять не следует.
Способ 1: штатная функция НомерНаПечать в типовых конфигурациях
Если конфигурация построена на БСП (1С:Бухгалтерия, Управление торговлей, ERP, ЗУП и другие типовые), задача уже решена. Используйте функцию общего модуля префиксации:
НомерДляПечати = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДокументОбъект.Номер, Истина, Истина);
Первый параметр — исходный номер. Второй (УдалитьПрефиксИнформационнойБазы) и третий (УдалитьПользовательскийПрефикс) управляют удалением префиксов. Ведущие нули функция убирает всегда. Результат для номера «00БП-000123» будет «123».
В старших версиях БСП модуль может называться иначе или функция может быть перенесена — проверьте наличие через глобальный поиск по конфигурации (Ctrl+Shift+F, искать «НомерНаПечать»). Если функция найдена в нескольких модулях, используйте вариант из модуля префиксации объектов.
Способ 2: собственная функция удаления префикса и нулей
В самописной конфигурации или когда штатная функция недоступна, напишите свою. Логика в два шага: отрезать префикс, затем убрать ведущие нули.
Вариант с разделителем
Если префикс отделён от цифровой части дефисом или другим символом, надёжнее всего взять подстроку после последнего разделителя:
Функция НомерБезПрефиксаИНулей(НомерДокумента) Экспорт
Номер = СокрЛП(НомерДокумента);
// Отрезаем префикс по последнему дефису
ПозицияРазделителя = СтрНайти(Номер, "-", НаправлениеПоиска.СКонца);
Если ПозицияРазделителя > 0 Тогда
Номер = Сред(Номер, ПозицияРазделителя + 1);
КонецЕсли;
// Убираем ведущие нули
Пока СтрДлина(Номер) > 1 И Лев(Номер, 1) = "0" Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
Возврат Номер;
КонецФункции
Вариант без разделителя — поиск первой цифры
Если префикс идёт вплотную к номеру без разделителя («АВ000123»), ищите позицию первого значащего символа, пропуская буквы, а затем — ведущие нули:
Функция НомерБезПрефиксаИНулей(НомерДокумента) Экспорт
Номер = СокрЛП(НомерДокумента);
Результат = "";
ЦифрыНачались = Ложь;
Для Позиция = 1 По СтрДлина(Номер) Цикл
Символ = Сред(Номер, Позиция, 1);
КодСимвола = КодСимвола(Символ);
ЭтоЦифра = (КодСимвола >= КодСимвола("0") И КодСимвола <= КодСимвола("9"));
Если ЭтоЦифра Тогда
Если Символ <> "0" Тогда
ЦифрыНачались = Истина;
КонецЕсли;
Если ЦифрыНачались Тогда
Результат = Результат + Символ;
КонецЕсли;
ИначеЕсли ЦифрыНачались Тогда
// Цифра после начала значащей части — сохраняем всё подряд
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Если Результат = "" Тогда
Результат = "0";
КонецЕсли;
Возврат Результат;
КонецФункции
Обратите внимание на защиту от пустого результата: если номер состоит только из префикса и нулей, функция вернёт «0», а не пустую строку. Это предотвращает ошибки в печатных формах и обменах, где пустой номер недопустим.
- 1Создайте общий серверный модуль, например РаботаСНомерамиДокументов, и поместите в него функцию с ключевым словом Экспорт
- 2Протестируйте функцию на реальных номерах: с префиксом и дефисом, без дефиса, только из нулей, с буквами внутри цифровой части
- 3Замените прямое использование реквизита Номер на вызов функции в печатных формах и обменах
- 4Проверьте, что форматно-логический контроль и нумерация документов не затронуты — функция должна только читать номер, не записывать
Способ 3: получить чистый номер в запросе
Иногда обрезать номер нужно прямо в запросе — например, для соединения с внешними данными по номеру. Язык запросов 1С ограничен: в нём нет циклов и функции удаления ведущих нулей. Практичные варианты:
- Вычисляемое поле через ПОДСТРОКА — если длина префикса фиксирована и известна:
ПОДСТРОКА(Документ.Номер, 5, 7)отрежет первые 4 символа. Нули при этом останутся. - Соединение с таблицей соответствий — если набор номеров ограничен, иногда проще заранее подготовить таблицу «полный номер → чистый номер».
- Перенос обработки на уровень встроенного языка: выбрать номера запросом как есть, а обрезку выполнить в цикле по выборке функцией из предыдущего раздела. Это самый надёжный и самый распространённый подход.
Попытки выразить удаление нулей через каскад ПОДСТРОКА и ВЫБОР в запросе технически возможны, но дают громоздкий и хрупкий код, который ломается при смене длины номера. Для нулей практически всегда разумнее обработка после запроса.
Как выбрать способ под свою задачу
Критерии выбора простые. Работаете в типовой конфигурации на поддержке — используйте штатный НомерНаПечать, не добавляя свой код: при обновлении конфигурации ничего не сломается. Дорабатываете типовую через расширение — вызывайте ту же штатную функцию из расширения, она доступна.
Самописная конфигурация или нестандартный формат префикса — пишите собственную функцию в общем модуле. Обмен с внешней системой, где формат номера жёстко согласован (например, только цифры, без букв внутри) — добавьте в функцию проверку результата и явное поведение при неожиданном формате: вернуть исходный номер или зафиксировать ошибку в журнале.
Как выбрать действие
Проверка результата и типичные ошибки
После внедрения проверьте функцию на граничных случаях. Минимальный набор тестовых номеров: «00АБ-000123» (ожидается «123»), «АБ000123» без дефиса («123»), «0000-000000» («0»), «12» без префикса и нулей («12»), номер с буквой в конце цифровой части «000123А» — здесь заранее решите, должен ли результат быть «123А» или это ошибочная ситуация.
Отдельно проверьте места, где номер сравнивается или ищется: если раньше поиск шёл по полному номеру «00АБ-000123», а теперь пользователь вводит «123», поиск перестанет находить документ. Для поиска либо приводите введённое значение к полному формату, либо ищите по шаблону с подстановкой (ПОДОБНО "%123"), понимая, что это может находить лишние документы.
Как проверить результат
Возвращаются только значащие цифры после дефиса без нулей
Остался дефис, буквы префикса или ведущие нули
Возвращается «0»
Пустая строка или ошибка
Возвращается исходный номер без изменений, кроме ведущих нулей
Функция ошибочно отрезает часть цифр как «префикс»
Номер выводится в чистом виде, макет не едет
Пустое поле номера или обрезанные цифры
Ограничения и безопасные границы
Обрезка номера — операция представления. Уникальность документов в базе обеспечивается полным номером вместе с префиксом: после обрезки номера «123» могут встречаться у нескольких документов разных организаций или узлов обмена. Поэтому чистый номер нельзя использовать как ключ поиска или синхронизации без дополнительного признака (организация, узел, дата).
В обменах с внешними системами заранее зафиксируйте в соглашении об интеграции, какой именно формат номера передаётся. Если внешняя система ожидает полный номер, а вы начнёте слать обрезанный, сопоставление документов на той стороне развалится. Обратная совместимость важнее красоты номера.
Если требуется изменить сам принцип нумерации — например, отказаться от префикса у новых документов, — это делается настройкой префиксации и нумераторов, а не обрезкой строки. Такие изменения влияют на всю последующую нумерацию и требуют согласования с учётной политикой: номера первичных документов — элемент регламентированного учёта.
Что важно запомнить
В типовых конфигурациях используйте штатную функцию НомерНаПечать модуля префиксации. В остальных случаях — собственная функция: сначала отрезать префикс (по разделителю или по первой цифре), затем убрать ведущие нули, с защитой от пустого результата. Обрезайте номер только при выводе, никогда не изменяя реквизит Номер в базе.
Частые вопросы
Можно ли просто преобразовать номер в число, чтобы убрать нули?
Только если номер гарантированно состоит из одних цифр после префикса. Для номеров с буквами, дефисами или суффиксами преобразование Число() вызовет ошибку или потеряет часть данных. Предварительно префикс всё равно придётся отрезать строковыми функциями, поэтому выигрыша почти нет.
Почему НомерНаПечать вернула номер с остатком префикса?
Функция удаляет только префиксы, заданные штатными механизмами: префикс информационной базы и пользовательский префикс организации. Если префикс формируется прикладным кодом документа (например, буква вида операции подставляется в обработчике установки номера), штатная функция о нём не знает. Такой префикс отрезайте дополнительно — по разделителю или по первой цифре.
Как убрать префикс, если он стоит не в начале номера?
Стандартная префиксация всегда ставит префикс в начало. Если префикс оказался в середине, значит, номер формируется нестандартным кодом — изучите подписку на событие установки номера у этого вида документов. Универсальный приём — брать подстроку после последнего разделителя либо искать первую значащую цифру посимвольным разбором.
Чем опасно отрезание фиксированного числа символов под префикс?
Длина префикса меняется при смене настроек префиксации, добавлении организации или переносе базы в другой узел. Жёстко зашитая длина (например, всегда 4 символа) начнёт отрезать цифры номера или оставлять кусок префикса. Используйте поиск разделителя или первой цифры — такой код устойчив к смене длины.
Как найти документ, если пользователь вводит номер без префикса и нулей?
Два рабочих подхода: дополнить введённое значение нулями и префиксом до полного формата по правилам нумерации и искать точное совпадение, либо искать запросом с условием ПОДОБНО "%" + ВведённыйНомер. Второй вариант проще, но может находить несколько документов с одинаковыми цифрами у разных организаций — тогда добавляйте в выборку организацию и дату для различения.
Нужно ли что-то менять при обмене между базами 1С?
Если обе базы — 1С с одинаковой префиксацией, обычно передают полный номер как есть, и ничего обрезать не требуется. Обрезка нужна, когда принимающая сторона — внешняя система с собственным форматом номера. В этом случае формат фиксируется в соглашении об обмене, а преобразование выполняется в правилах конвертации или в коде формирования сообщения.