Разработка и Конфигурация · 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Определите, где стоят нули: слева, справа после запятой или по всей строке
- 2Выберите инструмент: цикл со Сред, Формат или СтрЗаменить
- 3Очистите строку от пробелов и неразрывных пробелов Символ(160)
- 4Выполните преобразование и проверьте крайние случаи: «0», «0000», «100», пустая строка
- 5Протестируйте на реальных данных документа или справочника
Проверка результата и крайние случаи
Любую обработку строк стоит проверять на граничных значениях, иначе ошибка всплывёт на рабочих данных. Минимальный набор для теста: пустая строка, строка «0», строка из одних нулей «0000», обычный случай «00123», число без дробной части «100», число с нулями внутри «1 002,05».
Особое внимание — строке «0»: цикл отсечения ведущих нулей с условием СтрДлина > 1 корректно оставит «0», а вариант без защиты вернёт пустую строку, что может сломать дальнейшую логику (например, поиск документа по номеру).
Если результат обработки используется для сравнения или поиска, дополнительно примените СокрЛП — пробелы по краям строки частая скрытая причина «не находится» документ, который визуально совпадает.
Как проверить результат
Осталось «0» или пустая строка — как задумано
Исключение или неожиданное значение
Осталось «100»
Получилось «1» — цикл применён без проверки запятой
Пробелы удалены, формат корректен
Остались неразрывные пробелы Символ(160)
Типичные ошибки при работе с нулями в строках
Первая и самая распространённая — применение СтрЗаменить там, где нужно удалить только ведущие нули. Номер «001020» превращается в «12», и поиск документа по такому номеру ничего не найдёт. Всегда уточняйте постановку задачи: «убрать нули» почти всегда означает «убрать лишние нули», а не все.
Вторая ошибка — игнорирование неразрывного пробела (код 160), который 1С подставляет как разделитель групп при форматировании чисел. Визуально он неотличим от обычного пробела, но СтрЗаменить(Строка, " ", "") его не удаляет — нужен Символ(160).
Третья — преобразование Число() без проверки содержимого. Номера документов в типовых конфигурациях часто содержат буквенные префиксы, и попытка преобразовать «АБ-000456» в число завершится исключением в рабочей базе.
Когда нули убирать не нужно
Есть данные, где нули — часть значения, и любая чистка их разрушит. Это штрихкоды (EAN-13, где ведущий ноль значим), ИНН и КПП, банковские счета, БИК, коды ОКПО и подобные идентификаторы. Их хранят в строковых реквизитах именно потому, что числовое представление потеряло бы ведущие нули.
Если задача — вывести значение «красиво» в печатной форме или отчёте, лучше не менять сами данные, а формировать представление в момент вывода через Формат или присваивать очищенное значение отдельной переменной. Исходный реквизит при этом остаётся нетронутым.
Для номеров документов в типовых конфигурациях существуют механизмы работы с префиксами и нумерацией — например, функции получения номера на печать, которые сами отсекают префикс и ведущие нули. Прежде чем писать свой код, проверьте, нет ли готовой функции в общем модуле вашей конфигурации.
Частые вопросы
Как убрать ведущие нули из номера документа одной строкой кода?
Если номер содержит только цифры: Формат(Число(НомерСтрокой), "ЧГ="). Если в номере возможны буквы или дефисы, одной строкой безопасно не обойтись — используйте цикл с Лев() и Сред(), который отсекает нули до первого отличного символа.
Почему СтрЗаменить не удаляет пробелы из числа?
При форматировании чисел 1С использует неразрывный пробел с кодом 160, а не обычный пробел. Удаляйте его так: СтрЗаменить(Строка, Символ(160), ""). Часто приходится удалять оба варианта пробела подряд.
Как вывести число без нулей после запятой в печатной форме?
Используйте Формат(Значение, "ЧРД=,; ЧГ=") при заполнении параметра макета. Если значение хранится с фиксированной точностью, дополнительно отсеките нули справа в полученной строке, предварительно проверив наличие запятой.
Что делать, если строка состоит из одних нулей?
Добавьте в цикл условие СтрДлина(Строка) > 1 — тогда «0000» превратится в «0», а не в пустую строку. Вариант с Число() обрабатывает этот случай автоматически: Число("0000") вернёт 0.
Можно ли убрать нули запросом, без кода?
В языке запросов 1С есть функция ПОДСТРОКА и ВЫРАЗИТЬ, но полноценной замены символов нет. Привести строку к числу в запросе можно через ВЫРАЗИТЬ(Поле КАК ЧИСЛО), однако это работает только для чисто цифровых строк и требует осторожности с разрядностью. Обычно проще обработать результат после выборки.
Как удалить нули только из конкретной позиции строки?
Используйте Сред() для извлечения нужного фрагмента, обработайте его и соберите строку обратно конкатенацией. Для сложных шаблонов в 1С доступны регулярные выражения через COM-объект VBScript.RegExp на Windows-сервере, но для простых задач с нулями они избыточны.
Что важно запомнить
Сначала определите, какие нули лишние: слева, справа после запятой или все. Ведущие нули убирайте циклом со Сред() или Число(), дробные — функцией Формат, все вхождения — СтрЗаменить. Проверяйте граничные случаи («0», «0000», «100») и не трогайте коды, где нули значимы.