Разработка и Конфигурация · 10 мин
Как удалить лидирующие нули в 1С
Как убрать лидирующие нули в 1С: функции, преобразование типов, готовые примеры кода для строк и номеров документов, типичные ошибки и проверка результата.
Лидирующие нули в 1С появляются там, где числовое значение хранится или выводится как строка фиксированной длины: номера документов («000000123»), коды элементов справочников, артикулы, штрихкоды. При обмене данными, печати, сравнении значений и выгрузке во внешние системы эти нули часто мешают — строки не совпадают, поиск не находит элементы, а отчёты выглядят нечитаемо.
Универсальной встроенной функции «убрать нули слева» в языке 1С нет, поэтому задача решается несколькими способами: преобразованием строки в число и обратно, циклом посимвольной обработки, функциями форматирования или штатными механизмами префиксации номеров. Выбор зависит от того, где именно возникли нули — в коде, в номере документа или в данных, полученных извне.
Важно понимать: удаление лидирующих нулей — не всегда правильное решение. Если нули являются частью формата (например, в штрихкодах EAN-13 или в номерах, по которым идёт сопоставление с контрагентами), их удаление сломает обмен данными. Ниже разобраны рабочие способы, их ограничения и ситуации, когда нули трогать нельзя.
Откуда берутся лидирующие нули в 1С
Основной источник — механизм нумерации объектов. Номер документа или код справочника хранится как строка фиксированной длины, и платформа дополняет его нулями слева до заданной длины. Это нужно для корректной лексикографической сортировки: строки «2» и «10» сравниваются «неправильно», а «0002» и «0010» — правильно.
Вторая причина — префиксация при обмене данными между базами. Номер вида «УТ00-000123» содержит и префикс, и нули-заполнители. Третья причина — загрузка данных из внешних источников: Excel, CSV, веб-сервисов, где коды и артикулы приходят уже с нулями.
Наконец, нули появляются при форматировании чисел функцией Формат() с указанием длины, например Формат(Значение, "ЧЦ=10; ЧВН=") — такой приём часто используют в печатных формах и выгрузках.
Способ 1. Преобразование строки в число и обратно
Самый короткий вариант, если строка гарантированно состоит только из цифр:
СтрокаБезНулей = Строка(Число("000000123"));
// Результат: "123"
Функция Число() отбрасывает все нули слева, а Строка() возвращает значение без них. Подходит для кодов справочников, артикулов-чисел, числовых частей номеров.
Ограничения способа существенные. Если в строке есть хотя бы одна нецифровая буква или символ («00А123», «УТ-000123»), функция Число() вызовет ошибку преобразования. Если строка длиннее, чем максимальная разрядность числа в 1С, возможна потеря точности. И если исходное значение — «0000», результатом будет «0», что не всегда ожидаемо.
Функция УбратьЛидирующиеНули(ЗначениеСтрокой)
Попытка
Возврат Строка(Число(ЗначениеСтрокой));
Исключение
Возврат ЗначениеСтрокой; // не число — вернём как есть
КонецПопытки;
КонецФункцииСпособ 2. Посимвольное удаление нулей циклом
Когда строка может содержать буквы или смешанный формат, надёжнее идти по символам слева и отсекать нули до первого значимого символа:
Функция УбратьЛидирующиеНули(Строка)
Пока СтрДлина(Строка) > 1 И Лев(Строка, 1) = "0" Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Возврат Строка;
КонецФункции
Условие СтрДлина(Строка) > 1 защищает от ситуации, когда строка состоит из одних нулей: «0000» превратится в «0», а не в пустую строку. Если пустая строка допустима, условие можно убрать.
Вариант с определением позиции первого ненулевого символа работает быстрее на длинных строках, так как не создаёт новую строку на каждой итерации:
Функция УбратьЛидирующиеНулиБыстро(Строка)
Позиция = 1;
Пока Позиция <= СтрДлина(Строка) И Сред(Строка, Позиция, 1) = "0" Цикл
Позиция = Позиция + 1;
КонецЦикла;
Возврат Сред(Строка, Позиция);
КонецФункции
Сравнение способов
Самый короткий код. Подходит только для чисто цифровых строк; на строках с буквами выдаёт ошибку.
Универсален, работает с любыми строками. Требует аккуратной обработки строки из одних нулей.
Для номеров документов при обмене. Не требует кода, но настраивается только в типовых подсистемах обмена.
Способ 3. Настройка префиксации для номеров документов
Если задача — убрать нули из номеров документов при печати или обмене, не всегда нужен код. В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) есть механизм префиксации, который умеет автоматически удалять лидирующие нули и префиксы информационной базы при выводе номера.
Проверьте настройки в разделе администрирования, связанные с нумерацией и префиксами. В коде печатных форм типовые конфигурации часто используют функцию получения номера на печать, которая уже отсекает нули и префикс организации. Если ваша печатная форма выводит номер «как есть», замените прямое обращение к реквизиту Номер на штатную функцию получения номера для печати — состав функций зависит от конфигурации, ищите её в общих модулях работы с префиксами.
Если требуется своё поведение, типовые функции можно использовать как образец: они обычно отсекают префикс до разделителя, затем удаляют нули слева от числовой части.
Удаление нулей в запросах и при поиске
Частая практическая задача — найти элемент справочника или документ по номеру, введённому без нулей, когда в базе номер хранится с нулями. Здесь два подхода.
Первый — не удалять нули, а дополнить введённое значение до нужной длины перед поиском. Это надёжнее, потому что не требует обхода и преобразования всех записей:
ДлинаНомера = Метаданные.Документы.РеализацияТоваровУслуг.ДлинаНомера;
НомерДляПоиска = Формат(Число(ВведенныйНомер), "ЧЦ=" + ДлинаНомера + "; ЧВН=; ЧГ=");
Второй — искать по окончанию строки через ПОДОБНО в запросе. Способ рабочий, но медленный на больших таблицах, так как индекс при таком сравнении не используется. Применяйте его только для разовых операций или небольших объёмов данных.
Как выбрать действие
Проверка результата и типичные ошибки
После применения любого способа проверьте граничные случаи: строка из одних нулей, пустая строка, строка с пробелами по краям, строка с буквами после нулей. Пробелы предварительно убирайте функцией СокрЛП(), иначе « 000123» не будет распознано как число.
Как проверить результат
Получено «123»
Остались нули или ошибка преобразования
Получено «0»
Пустая строка там, где она недопустима
Получено «А45» или исходное значение по логике задачи
Необработанное исключение
Номер выводится без нулей и префикса
Номер в базе изменён, а не только отформатирован
Когда нули удалять нельзя
Штрихкоды (EAN-8, EAN-13, коды маркировки) — нули слева являются значащей частью кода, их удаление делает код невалидным. Артикулы и коды, по которым идёт сопоставление с данными поставщиков и контрагентов, — удаление нулей разорвёт соответствие при следующей загрузке.
Также не трогайте нули в номерах, участвующих в синхронизации между базами: префиксно-нулевой формат там используется для разрешения коллизий нумерации. Общее правило: удаляйте нули только на этапе представления данных пользователю или внешней системе, которая этого требует, и никогда — в хранимых ключевых реквизитах.
FAQ
Можно ли убрать лидирующие нули прямо в запросе 1С?
В языке запросов нет функции удаления символов слева, поэтому полноценно убрать нули в запросе нельзя. Обычно поступают наоборот: параметр поиска дополняют нулями до нужной длины перед передачей в запрос, а сами данные в базе не меняют.
Что вернёт преобразование, если строка состоит только из нулей?
Число("0000") вернёт 0, а Строка(Число("0000")) — строку «0». Если в вашей логике пустая строка или сохранение исходного вида важнее, добавьте отдельную проверку этого случая перед преобразованием.
Как убрать нули вместе с префиксом вида «УТ00-000123»?
Сначала отделите часть после последнего разделителя (дефиса) с помощью СтрНайти и Сред, затем удалите нули из оставшейся числовой части любым из описанных способов. В типовых конфигурациях для этого уже есть штатные функции получения номера на печать.
Почему после удаления нулей перестал находиться элемент справочника?
Потому что сравнение строк в 1С точное: «123» и «000123» — разные значения. Если код в базе хранится с нулями, ищите по исходному формату: дополните введённое значение нулями до длины кода, указанной в метаданных справочника.
Влияет ли удаление нулей на сортировку номеров?
Да. Строки без нулей сортируются лексикографически: «10» окажется раньше «2». Если порядок важен, сортируйте по числовому представлению или храните номера с нулями и форматируйте их только при выводе.
Что важно запомнить
Для чисто цифровых строк используйте Строка(Число(Строка)), для смешанных — цикл отсечения нулей слева, для номеров документов — штатную префиксацию. Удаляйте нули только при выводе, не меняя хранимые номера, коды и штрихкоды.