К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как убрать нули в строке в 1С

Как убрать нули в строке в 1С: СтрЗаменить, СокрЛП, Формат, регулярные выражения. Разбор задач: ведущие нули, нули после запятой, все нули. Примеры кода и ошибки.

Задача убрать нули из строки в 1С встречается в трёх разных вариантах, и для каждого нужен свой подход. Первый — удалить все нули из строки целиком, например из номера документа вида «00-001204». Второй — убрать только ведущие нули слева, чтобы «000123» превратилось в «123». Третий — убрать незначащие нули после запятой в числе, преобразованном к строке: «15,500» → «15,5».

Путаница между этими сценариями — главная причина ошибок. Функция СтрЗаменить удаляет все вхождения символа, и если применить её к строке «100,20», получится «1,2» — результат, который редко нужен. Поэтому сначала определите, какие именно нули мешают, а потом выбирайте инструмент.

Ниже разобраны рабочие приёмы на встроенном языке 1С с примерами кода, ограничениями и типичными ошибками. Все примеры применимы как в тонком клиенте, так и на сервере, без внешних компонент.

Определяем, какие нули нужно убрать

Прежде чем писать код, посмотрите на исходные данные и ответьте на вопрос: нули стоят в начале строки, в конце, внутри или везде сразу? От этого зависит и алгоритм, и проверка результата.

Типичные ситуации: номер документа с префиксом и лидирующими нулями («АБ-000456»), числовой код из справочника («000078»), строковое представление суммы с хвостовыми нулями («1 250,00»), артикул, где нули значимы и трогать их нельзя («102030»). В последнем случае любая автоматическая чистка разрушит данные — это важно учитывать.

Нули только слеваВедущие нули

Строка вида «000123» — используйте цикл отсечения слева или Число()

Нули в конце после запятойНезначащие дробные нули

Строка вида «15,500» — используйте Формат() или отсечение справа

Нули вездеВсе вхождения символа

Строка вида «10-0203» — СтрЗаменить, но проверьте, не разрушит ли это данные

Убираем все нули из строки через СтрЗаменить

Самый простой вариант — функция СтрЗаменить, которая заменяет все вхождения подстроки на другую подстроку. Чтобы удалить символ, заменяем его на пустую строку:

СтрокаБезНулей = СтрЗаменить(ИсходнаяСтрока, "0", "");

Для строки «00-001204» результат будет «-124». Обратите внимание: функция работает со всеми вхождениями, поэтому из «100,20» получится «1,2». Это корректно с точки зрения функции, но почти наверняка не то, что нужно для чисел.

Дополнительная тонкость — неразрывные пробелы и специальные символы группировки, которые 1С вставляет при форматировании чисел. Если строка получена из числа, сначала очистите её от пробелов: СтрЗаменить(Строка, Символ(160), "") и СтрЗаменить(Строка, " ", ""), иначе дальнейшие преобразования дадут неожиданный результат.

Убираем ведущие нули слева

Классическая задача — номер документа или код с лидирующими нулями. Здесь СтрЗаменить не подходит: она удалит и значимые нули внутри. Надёжный способ — цикл, который отсекает символы слева, пока встречает «0»:

Пока СтрДлина(Строка) > 1 И Лев(Строка, 1) = "0" Цикл

Строка = Сред(Строка, 2);

КонецЦикла;

Условие СтрДлина(Строка) > 1 защищает от ситуации, когда строка состоит из одних нулей: «0000» превратится в «0», а не в пустую строку. Если пустая строка допустима, условие можно упростить до СтрДлина(Строка) > 0.

Вариант через преобразование в число

Если строка гарантированно содержит только цифры, можно преобразовать её в число и обратно:

СтрокаБезНулей = Формат(Число(Строка), "ЧГ=");

Этот приём короче, но опаснее: Число() вызовет исключение, если в строке есть буквы, дефис или пробелы. Перед использованием проверьте содержимое или оберните вызов в Попытка ... Исключение. Также помните об ограничении разрядности чисел в 1С — длинные коды (более 30 с лишним знаков) в число не поместятся.

Сравнение вариантов

Цикл со Сред()

Подходит для любых строк, сохраняет буквы и символы после нулей; чуть больше кода

Число() + Формат()

Одна строка кода, но только для чисто цифровых строк и с риском исключения

СтрЗаменить

Удаляет все нули, а не только ведущие — подходит редко и требует проверки данных

Убираем нули после запятой в числе

Когда число 15,5 выводится как «15,50» или «15,500000», лишние нули — следствие форматирования, а не самой строки. Правильнее всего не чистить строку, а сразу сформировать её нужным образом через функцию Формат:

СтрокаЧисла = Формат(Значение, "ЧРД=,; ЧН=0; ЧГ=");

Здесь ЧРД=, задаёт разделитель дробной части, ЧН=0 — представление нуля, ЧГ= отключает группировку разрядов пробелами. Точность при этом определяется типом значения: если реквизит имеет два знака после запятой, Формат выведет два знака.

Отсечение нулей справа в уже готовой строке

Если строка уже сформирована и менять источник нельзя, отсекайте нули справа, а затем — висячую запятую:

Пока Прав(Строка, 1) = "0" Цикл

Строка = Лев(Строка, СтрДлина(Строка) - 1);

КонецЦикла;

Если Прав(Строка, 1) = "," ИЛИ Прав(Строка, 1) = "." Тогда

Строка = Лев(Строка, СтрДлина(Строка) - 1);

КонецЕсли;

Важно: такой цикл применим только если в строке точно есть дробная часть. Для целого числа «100» он сотрёт значимые нули и превратит значение в «1». Поэтому перед отсечением проверяйте наличие разделителя: СтрНайти(Строка, ",") > 0.

Порядок действий
  1. 1
    Определите, где стоят нули: слева, справа после запятой или по всей строке
  2. 2
    Выберите инструмент: цикл со Сред, Формат или СтрЗаменить
  3. 3
    Очистите строку от пробелов и неразрывных пробелов Символ(160)
  4. 4
    Выполните преобразование и проверьте крайние случаи: «0», «0000», «100», пустая строка
  5. 5
    Протестируйте на реальных данных документа или справочника

Проверка результата и крайние случаи

Любую обработку строк стоит проверять на граничных значениях, иначе ошибка всплывёт на рабочих данных. Минимальный набор для теста: пустая строка, строка «0», строка из одних нулей «0000», обычный случай «00123», число без дробной части «100», число с нулями внутри «1 002,05».

Особое внимание — строке «0»: цикл отсечения ведущих нулей с условием СтрДлина > 1 корректно оставит «0», а вариант без защиты вернёт пустую строку, что может сломать дальнейшую логику (например, поиск документа по номеру).

Если результат обработки используется для сравнения или поиска, дополнительно примените СокрЛП — пробелы по краям строки частая скрытая причина «не находится» документ, который визуально совпадает.

Контрольные точки

Как проверить результат

Строка «0000» после обработки
Норма

Осталось «0» или пустая строка — как задумано

Тревожный признак

Исключение или неожиданное значение

Строка «100» при отсечении справа
Норма

Осталось «100»

Тревожный признак

Получилось «1» — цикл применён без проверки запятой

Число с группировкой «1 250,00»
Норма

Пробелы удалены, формат корректен

Тревожный признак

Остались неразрывные пробелы Символ(160)

Типичные ошибки при работе с нулями в строках

Первая и самая распространённая — применение СтрЗаменить там, где нужно удалить только ведущие нули. Номер «001020» превращается в «12», и поиск документа по такому номеру ничего не найдёт. Всегда уточняйте постановку задачи: «убрать нули» почти всегда означает «убрать лишние нули», а не все.

Вторая ошибка — игнорирование неразрывного пробела (код 160), который 1С подставляет как разделитель групп при форматировании чисел. Визуально он неотличим от обычного пробела, но СтрЗаменить(Строка, " ", "") его не удаляет — нужен Символ(160).

Третья — преобразование Число() без проверки содержимого. Номера документов в типовых конфигурациях часто содержат буквенные префиксы, и попытка преобразовать «АБ-000456» в число завершится исключением в рабочей базе.

Типичные ошибки
01
СтрЗаменить по «0» для ведущих нулей — удаляет значимые нули внутри строки
02
Цикл отсечения справа без проверки запятой — портит целые числа вроде «100»
03
Число() без Попытка/Исключение — исключение на номерах с префиксами
04
Игнорирование Символ(160) — неразрывные пробелы остаются после чистки
05
Обработка штрихкодов и ИНН — разрушение значимых данных без возможности восстановления
Чего не делать в продуктивной базе
01
Не меняйте номера документов напрямую в базе обработкой — нарушится нумерация и ссылки
02
Не храните результат очистки в том же реквизите, откуда взяли исходник, без резервной копии
03
Не используйте строковую чистку там, где правильнее настроить формат вывода

Когда нули убирать не нужно

Есть данные, где нули — часть значения, и любая чистка их разрушит. Это штрихкоды (EAN-13, где ведущий ноль значим), ИНН и КПП, банковские счета, БИК, коды ОКПО и подобные идентификаторы. Их хранят в строковых реквизитах именно потому, что числовое представление потеряло бы ведущие нули.

Если задача — вывести значение «красиво» в печатной форме или отчёте, лучше не менять сами данные, а формировать представление в момент вывода через Формат или присваивать очищенное значение отдельной переменной. Исходный реквизит при этом остаётся нетронутым.

Для номеров документов в типовых конфигурациях существуют механизмы работы с префиксами и нумерацией — например, функции получения номера на печать, которые сами отсекают префикс и ведущие нули. Прежде чем писать свой код, проверьте, нет ли готовой функции в общем модуле вашей конфигурации.

Частые вопросы

Как убрать ведущие нули из номера документа одной строкой кода?

Если номер содержит только цифры: Формат(Число(НомерСтрокой), "ЧГ="). Если в номере возможны буквы или дефисы, одной строкой безопасно не обойтись — используйте цикл с Лев() и Сред(), который отсекает нули до первого отличного символа.

Почему СтрЗаменить не удаляет пробелы из числа?

При форматировании чисел 1С использует неразрывный пробел с кодом 160, а не обычный пробел. Удаляйте его так: СтрЗаменить(Строка, Символ(160), ""). Часто приходится удалять оба варианта пробела подряд.

Как вывести число без нулей после запятой в печатной форме?

Используйте Формат(Значение, "ЧРД=,; ЧГ=") при заполнении параметра макета. Если значение хранится с фиксированной точностью, дополнительно отсеките нули справа в полученной строке, предварительно проверив наличие запятой.

Что делать, если строка состоит из одних нулей?

Добавьте в цикл условие СтрДлина(Строка) > 1 — тогда «0000» превратится в «0», а не в пустую строку. Вариант с Число() обрабатывает этот случай автоматически: Число("0000") вернёт 0.

Можно ли убрать нули запросом, без кода?

В языке запросов 1С есть функция ПОДСТРОКА и ВЫРАЗИТЬ, но полноценной замены символов нет. Привести строку к числу в запросе можно через ВЫРАЗИТЬ(Поле КАК ЧИСЛО), однако это работает только для чисто цифровых строк и требует осторожности с разрядностью. Обычно проще обработать результат после выборки.

Как удалить нули только из конкретной позиции строки?

Используйте Сред() для извлечения нужного фрагмента, обработайте его и соберите строку обратно конкатенацией. Для сложных шаблонов в 1С доступны регулярные выражения через COM-объект VBScript.RegExp на Windows-сервере, но для простых задач с нулями они избыточны.

Итог

Что важно запомнить

Сначала определите, какие нули лишние: слева, справа после запятой или все. Ведущие нули убирайте циклом со Сред() или Число(), дробные — функцией Формат, все вхождения — СтрЗаменить. Проверяйте граничные случаи («0», «0000», «100») и не трогайте коды, где нули значимы.