Разработка и Конфигурация · 10 мин
Как убрать нули из строки в 1С
Как убрать нули из строки в 1С: функции СтрЗаменить, Формат, СокрЛП, работа с ведущими нулями номеров документов и дробной частью чисел. Примеры кода.
Задача убрать нули из строки в 1С возникает в нескольких типовых ситуациях: нужно удалить ведущие нули из номера документа, очистить строковое представление числа от нулей в конце дробной части, убрать все символы «0» из произвольной строки или избавиться от незначащих нулей при выгрузке данных. Для каждого случая есть свой подход, и неправильный выбор метода приводит к потере значимых цифр.
Во встроенном языке 1С нет одной универсальной функции «убрать нули» — используются комбинации СтрЗаменить, Формат, Прав, Сред и циклов проверки символов. Ниже разобраны рабочие варианты с примерами кода, ограничения каждого способа и контрольные точки для проверки результата.
Определите, какие именно нули нужно убрать
Прежде чем писать код, важно понять характер задачи, потому что методы принципиально различаются. Строка «000123» и строка «1.5000» требуют разной обработки: в первой нули стоят в начале и не несут смысла, во второй нули в конце дробной части могут быть значимыми для точности расчётов.
Выделяют четыре типовые ситуации:
- все нули в строке — символ «0» удаляется везде, где встречается;
- ведущие нули — только в начале строки, типично для номеров документов и кодов;
- замыкающие нули — только в конце строки, например «1500» → «15»;
- нули дробной части числа — «12,5000» → «12,5», но при этом «0,5» не должно превратиться в «,5».
Как выбрать действие
Удаление всех нулей через СтрЗаменить
Самый простой способ — функция СтрЗаменить, которая заменяет все вхождения подстроки. Чтобы убрать нули полностью, заменяем символ «0» на пустую строку:
ИсходнаяСтрока = "0102030405";
Результат = СтрЗаменить(ИсходнаяСтрока, "0", "");
// Результат: "12345"
Метод работает быстро и не требует циклов, но у него жёсткое ограничение: удаляются все нули, включая значимые. Строка «102030» превратится в «123», хотя, возможно, нули внутри были частью данных. Поэтому СтрЗаменить подходит только когда ноль в строке гарантированно является мусорным символом — например, при очистке результата склейки или удалении маски.
Дополнительный риск — строка, состоящая только из нулей. «0000» превратится в пустую строку, что может сломать последующую логику сравнения или поиска. Если такая ситуация возможна, добавьте проверку:
Результат = СтрЗаменить(ИсходнаяСтрока, "0", "");
Если ПустаяСтрока(Результат) Тогда
Результат = "0";
КонецЕсли;
Удаление ведущих нулей из номера документа
Классическая задача — номер вида «000000123» нужно показать пользователю как «123» или использовать в интеграции, где внешняя система не понимает ведущие нули. Здесь СтрЗаменить не подходит, потому что нули могут встречаться и в середине номера («000101» должен стать «101», а не «11»).
Способ через цикл
Надёжный вариант — последовательно срезать первый символ, пока он равен нулю:
НомерДок = "000101";
Пока СтрДлина(НомерДок) > 1 И Лев(НомерДок, 1) = "0" Цикл
НомерДок = Сред(НомерДок, 2);
КонецЦикла;
// Результат: "101"
Условие СтрДлина(НомерДок) > 1 защищает от случая, когда номер состоит из одних нулей: в результате останется «0», а не пустая строка. Это важно, потому что пустой номер в печатной форме или файле обмена выглядит как ошибка.
Способ через преобразование в число
Если номер гарантированно состоит только из цифр, можно преобразовать его в число и обратно:
НомерДок = "000101";
Результат = Формат(Число(НомерДок), "ЧГ=");
// Результат: "101"
Ограничения способа: номер с буквами («АБВ-000123») вызовет ошибку преобразования, а очень длинные номера могут потерять точность при превышении разрядности числа. Для смешанных номеров используйте цикл.
Функция УбратьВедущиеНули(Строка) Экспорт
Пока СтрДлина(Строка) > 1 И Лев(Строка, 1) = "0" Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Возврат Строка;
КонецФункцииУдаление нулей в конце дробной части числа
Число 12,5000 при выводе часто нужно показать как «12,5». Если значение хранится как число, правильный инструмент — функция Формат с форматной строкой, а не строковые операции:
Значение = 12.5000;
Строка = Формат(Значение, "ЧГ=; ЧН=0");
// Результат: "12,5"
По умолчанию Формат уже отбрасывает незначащие нули дробной части, если не задан параметр ЧЦ (общее число разрядов) с фиксированной длиной. Проблемы возникают, когда в конфигурации задана форматная строка вида «ЧЦ=15; ЧДЦ=4» — тогда нули дополняются принудительно. Уберите жёсткую фиксацию дробной части или скорректируйте формат.
Если исходные данные уже строка («12,5000»), применяют срезку справа с контролем разделителя:
Строка = "12,5000";
Пока Прав(Строка, 1) = "0" Цикл
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЦикла;
Если Прав(Строка, 1) = "," ИЛИ Прав(Строка, 1) = "." Тогда
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЕсли;
// Результат: "12,5"
Вторая проверка обязательна: без неё «12,000» превратится в «12,», что является некорректным отображением числа. Также учитывайте, что в разных региональных настройках разделителем может быть точка — проверяйте оба варианта.
Удаление замыкающих нулей из целой строки
Иногда нужно убрать нули только с конца строки, не трогая начало и середину: «15000» → «15». Это встречается при обработке значений, к которым программно дописали нули для выравнивания длины.
Строка = "15000";
Пока СтрДлина(Строка) > 1 И Прав(Строка, 1) = "0" Цикл
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЦикла;
// Результат: "15"
Как и в случае с ведущими нулями, условие на длину больше единицы предотвращает превращение «000» в пустую строку. Если пустой результат допустим в вашей логике, условие можно упростить до Пока Прав(Строка, 1) = "0", но тогда добавьте отдельную обработку пустого исходного значения, чтобы не получить ошибку обращения к символу пустой строки.
Сравнение способов и типичные ошибки
Выбор метода зависит от типа данных и требований к результату. Сопоставление основных вариантов:
| Способ | Что удаляет | Когда подходит | Ограничение |
|---|---|---|---|
| СтрЗаменить | Все нули | Ноль — мусорный символ | Удаляет значимые нули внутри |
| Цикл с Лев/Сред | Ведущие нули | Номера документов, коды | Медленнее на длинных строках |
| Число + Формат | Ведущие нули, дробные нули | Только цифровые строки | Ошибка на буквах, предел разрядности |
| Цикл с Прав/Лев | Замыкающие нули | Дробная часть, выравнивание | Нужен контроль разделителя |
Отдельная ошибка — изменение исходного значения в базе вместо формирования отображаемой строки. Ведущие нули в номере документа часто обеспечивают правильную сортировку и уникальность. Убирайте нули только в переменной для вывода, печати или передачи, а сам номер в объекте не перезаписывайте, если этого не требует осознанная задача.
Проверка результата
После реализации функции прогоните её на граничных значениях, а не только на типовом примере. Минимальный набор тестовых строк: «000123», «000», «0», «100», «102030», пустая строка, строка с буквами. Каждый случай должен дать предсказуемый результат без ошибок.
Как проверить результат
Результат «123»
«123» с потерей нулей внутри или ошибка
Результат «0»
Пустая строка
Нули внутри сохранены
Получилось «123»
Строка «12,5»
«12,» или «12,5000»
Возвращается пустая строка без ошибки
Ошибка обращения к символу
Оформляйте удаление нулей как отдельную функцию в общем модуле, а не копируйте цикл по коду. Тогда исправление логики (например, добавление контроля разделителя) делается в одном месте, а не в десятке процедур печати и обмена.
Часто задаваемые вопросы
Как убрать ведущие нули, если в номере есть буквы?
Используйте цикл с проверкой первого символа: он работает с любыми строками, пока нули стоят в начале. Преобразование в число здесь не подойдёт — вызовет ошибку. Если нули стоят после буквенного префикса («АБВ-000123»), сначала разделите строку по разделителю, обработайте числовую часть и склейте обратно.
Почему Формат не убирает нули в дробной части?
Скорее всего, в форматной строке задана фиксированная длина, например «ЧЦ=15; ЧДЦ=4» — тогда нули дописываются принудительно до четырёх знаков. Уберите жёсткий ЧДЦ или уменьшите его, либо обрабатывайте результат строковым срезанием нулей справа.
Что делать, если строка состоит только из нулей?
Цикл со сдвигом символов при условии «длина больше 1» оставит один ноль — это корректно для номеров. СтрЗаменить вернёт пустую строку, поэтому после него добавьте проверку ПустаяСтрока и подстановку «0», если пустое значение недопустимо в вашей логике.
Можно ли убрать нули запросом, без кода?
В языке запросов 1С нет функции удаления ведущих нулей напрямую. Обычно данные выбирают запросом как есть, а обработку строки выполняют уже в коде при обходе выборки. Для числовых полей можно привести значение к числу в запросе, но строковые номера так не обработать.
Как убрать не только нули, но и пробелы и неразрывные пробелы?
Сначала удалите неразрывные пробелы через СтрЗаменить(Строка, Символ(160), ""), затем примените СокрЛП для краевых пробелов, и только после этого обрабатывайте нули. Обратный порядок опасен: пробел перед нулями помешает циклу распознать ведущий ноль.
Безопасно ли менять номер документа, убирая нули, в самой базе?
Нет, если в этом нет осознанной необходимости. Ведущие нули обеспечивают сортировку и уникальность номеров, а их удаление может нарушить нумерацию и обмены с другими системами. Убирайте нули только в копии значения — для вывода, печати или передачи.
Что важно запомнить
Для всех нулей — СтрЗаменить, для ведущих — цикл с Лев/Сред или преобразование в число, для дробной части — Формат или срезка справа с контролем разделителя. Всегда проверяйте граничные случаи: строка из одних нулей, пустая строка, нули внутри значения. Исходный номер в базе не изменяйте — обрабатывайте копию для вывода.