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

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

Число как строка в 1С: преобразование и форматирование

Как в 1С преобразовать число в строку и обратно: Формат(), Строка(), Число(), пробелы-разделители, неразрывные пробелы, типичные ошибки и проверка результата.

Во встроенном языке 1С число и строка — разные типы данных, и автоматическое приведение между ними работает не всегда так, как ожидает разработчик. Операция «число как строка» встречается постоянно: при выводе суммы в сообщение пользователю, формировании наименования документа, выгрузке данных в файл, передаче значений через HTTP-запрос или заполнении макета печатной формы.

Главная проблема — неявное преобразование. Если просто написать Строка(Число), результат часто содержит неразрывные пробелы в качестве разделителей групп разрядов: вместо «1234567» получится «1 234 567». Такая строка ломает дальнейший парсинг, сравнение и выгрузку в другие системы. Поэтому корректное преобразование требует понимания инструментов: функций Формат(), Строка(), Число() и форматной строки.

Ниже разобраны рабочие способы преобразования в обе стороны, настройка форматной строки, обработка неразрывных пробелов и типичные ошибки, которые приводят к дефектам в обменах данными.

Зачем преобразовывать число в строку и где это встречается

Числовой тип в 1С хранит значение с заданной точностью и подходит для вычислений, сравнений и сортировки. Строка нужна там, где значение становится частью текста: номер документа в заголовке, сумма прописью в печатной форме, параметр в URL веб-сервиса, значение в CSV-файле или JSON.

Типичные сценарии: формирование сообщения «Проведен документ № 125 от …», выгрузка прайса в Excel через табличный документ, передача суммы заказа на сайт через HTTPСоединение, запись лога обмена. Во всех этих случаях число сначала приводится к строке, и качество этого приведения определяет, сработает ли приёмник.

Обратная задача возникает при загрузке: из файла, формы или ответа сервиса приходит строка «1 250,50», которую нужно превратить в число для расчётов. Здесь главные риски — разделители разрядов, запятая вместо точки и невидимые символы.

Базовые способы: Строка() и Формат()

Функция Строка(Значение) — самый простой способ, но её результат зависит от региональных настроек сеанса. Для числа 1234567.89 она обычно вернёт «1 234 567,89» с неразрывными пробелами между группами разрядов. Для отображения пользователю это нормально, для машинной обработки — нет.

Функция Формат(Значение, ФорматнаяСтрока) даёт полный контроль над представлением. Форматная строка состоит из параметров вида Имя=Значение, разделённых запятыми внутри одной строки. Ключевые параметры для чисел:

  • ЧГ — группировка разрядов. ЧГ=0 отключает разделители групп, убирая пробелы;
  • ЧЦ — общее количество знаков (целая и дробная части вместе);
  • ЧДЦ — количество знаков дробной части;
  • ЧРД — разделитель дробной части, например ЧРД=. для точки;
  • ЧН — представление нуля, например ЧН=0,00, чтобы ноль не выводился пустой строкой;
  • ЧО — сдвиг разрядов при выводе (редко используется).
// Строка для машинной обработки

СтрокаСумма = Формат(Сумма, "ЧГ=0; ЧРД=.; ЧДЦ=2");

// Результат: "1234567.89"

// Строка для пользователя

СтрокаДляСообщения = Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧН=0,00");

// Результат: "1 234 567,89"

Форматная строка: практические сценарии

Выгрузка в файл и веб-сервисы

При выгрузке в CSV, XML или JSON вручную число должно быть строкой без группировки и с точкой как разделителем дробной части — иначе приёмник не распарсит значение. Шаблон: Формат(Значение, "ЧГ=0; ЧРД=."). Для целых значений достаточно Формат(Значение, "ЧГ=0").

Номера и коды с ведущими нулями

Если нужно представить число строкой фиксированной длины с нулями слева (например, «0000125»), используйте параметр ЧЦ с заполнением: Формат(Номер, "ЧЦ=7; ЧВН=; ЧГ=0"). Параметр ЧВН включает вывод ведущих нулей. Это удобно для кодов, артикулов и номеров, которые сортируются как строки.

Сумма прописью

Для печатных форм есть встроенный механизм: ЧислоПрописью(Сумма, "Л=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"). Он сам формирует строку вида «Одна тысяча двести рублей 00 копеек». Предмет исчисления (валюту) задают строкой параметров либо берут из констант конфигурации.

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

Строка(Число)

Быстро, но зависит от региональных настроек и добавляет неразрывные пробелы. Подходит только для отладочного вывода.

Формат(Число, "ЧГ=0")

Контролируемый результат без разделителей групп. Основной способ для обменов и выгрузок.

ЧислоПрописью()

Для печатных форм и документов, где сумма нужна словами. Не подходит для машинной обработки.

XMLСтрока()

Каноническое строковое представление значения для XML/XDTO. Удобно при обменах, где важна однозначность типа.

Обратное преобразование: строка в число

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

Поэтому перед преобразованием строку очищают. Минимальный набор действий: удалить обычные и неразрывные пробелы, убрать символы валют, при необходимости заменить запятую на точку.

Функция СтрокаВЧисло(Стр)

Результат = СтрЗаменить(Стр, Символ(160), ""); // неразрывный пробел

Результат = СтрЗаменить(Результат, " ", "");

Результат = СтрЗаменить(Результат, "р.", "");

Результат = СтрЗаменить(Результат, ",", ".");

Попытка

Возврат Число(Результат);

Исключение

Возврат 0; // или Неопределено — по логике задачи

КонецПопытки;

КонецФункции

Оборачивать вызов в Попытка...Исключение обязательно при загрузке из внешних источников: пользовательские файлы и ответы сервисов регулярно содержат пустые значения, прочерки и текст вроде «нет». Решение, что возвращать при ошибке (0, Неопределено или признак ошибки), зависит от бизнес-логики — молчаливая подмена на ноль может исказить итоги.

Безопасная загрузка числа из строки
  1. 1
    Удалите из строки неразрывные пробелы: СтрЗаменить(Стр, Символ(160), "")
  2. 2
    Удалите обычные пробелы и символы валют
  3. 3
    Приведите разделитель дробной части к одному виду (точка или запятая)
  4. 4
    Выполните Число() внутри Попытка...Исключение
  5. 5
    Проверьте результат на контрольном примере: загрузите известное значение и сверьте итог

Проверка, является ли строка числом

Часто нужно не преобразовать, а только проверить: можно ли строку трактовать как число. Надёжный способ — та же попытка преобразования с анализом исключения. Альтернатива — проверка состава строки посимвольно или через регулярные выражения (в 1С доступны через COM-объект VBScript.RegExp на Windows или через внешние компоненты, что ограничивает переносимость).

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

Типичные ошибки
01
Конкатенация числа со строкой напрямую: Сообщить("Сумма: " + Сумма) выводит значение с неразрывными пробелами и региональным разделителем — в выгрузке это ломает формат
02
Число() без очистки строки: неразрывный пробел или символ валюты вызывает исключение и останавливает загрузку всего файла
03
Сравнение чисел как строк: строка "9" больше строки "10", поэтому сортировка и сравнение кодов требуют либо чисел, либо выравнивания ведущими нулями
04
Потеря точности: хранение больших чисел (ИНН, штрихкоды, номера карт) в числовом типе обрезает ведущие нули и ограничено разрядностью — такие данные изначально должны быть строками
05
Подмена ошибки нулём: возврат 0 при неудачном преобразовании искажает суммы и остатки, лучше фиксировать ошибку в журнале

Числа, которые должны оставаться строками

Не всякая последовательность цифр — число. ИНН, КПП, ОГРН, штрихкоды, номера телефонов, банковские счета, номера карт — это идентификаторы, а не величины. С ними не выполняют арифметику, зато важны ведущие нули и точная длина. Хранить их нужно в строковых реквизитах фиксированной длины.

Признак ошибки проектирования: ИНН контрагента «выпадает» из проверки контрольной суммы, потому что потерял ведущий ноль при числовом хранении, или штрихкод превращается в экспоненциальную запись при выгрузке в Excel. Если значение никогда не участвует в сложении или сравнении «больше/меньше» как величина — это строка.

Маршрут решения

Как выбрать подход

Нужна строка для сообщения пользователю или печатной формыИспользуйте Формат() с ЧЦ, ЧДЦ и группировкой разрядов по умолчанию
Строка уйдёт в файл, запрос или другую системуФормат(Значение, "ЧГ=0") и явный разделитель дробной части
Загружаете число из внешнего источникаОчистка строки от пробелов и валют, затем Число() в Попытка...Исключение
Значение — идентификатор (ИНН, штрихкод, счёт)Храните и обрабатывайте как строку, не преобразуйте в число
Нужна сумма прописью в документеИспользуйте ЧислоПрописью() с параметрами валюты

Проверка результата и отладка

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

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

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

Итог

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

Строка() добавляет неразрывные пробелы — для машинной обработки используйте Формат() с ЧГ=0. Обратное преобразование требует очистки строки от пробелов (включая символ 160) и обработки исключений. Идентификаторы вроде ИНН и штрихкодов храните строками, а не числами.

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

Почему в строке появляются пробелы между цифрами и как их убрать?

Это результат группировки разрядов, которую применяют Строка() и Формат() по умолчанию. Пробелы неразрывные (код 160). Чтобы их не было, используйте Формат(Значение, "ЧГ=0"). Если строка уже сформирована, удалите символы через СтрЗаменить(Стр, Символ(160), "").

Число() выдаёт ошибку на строке, которая выглядит как число. Что проверить?

Чаще всего в строке есть неразрывный пробел, символ валюты или нестандартный разделитель. Выведите коды символов строки через КодСимвола() в цикле — так видно все невидимые символы. Затем очистите строку перед преобразованием.

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

Используйте параметр ЧДЦ: Формат(Значение, "ЧДЦ=2") всегда выведет два знака дробной части, дополняя нулями при необходимости. Добавьте ЧН=0,00, если ноль должен отображаться как «0,00», а не пустой строкой.

Можно ли в запросе 1С преобразовать строку в число?

Да, через ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)), но только если строка содержит корректное числовое значение без пробелов и лишних символов. Для «грязных» данных надёжнее очищать значения при записи в базу.

Как сравнивать числовые коды, хранящиеся строками?

Строковое сравнение лексикографическое: «9» больше «10». Либо преобразуйте оба значения к числу перед сравнением, либо храните коды с ведущими нулями фиксированной длины — тогда строковый порядок совпадёт с числовым.

Чем отличается XMLСтрока() от Формат()?

XMLСтрока() возвращает каноническое представление значения по правилам XML-схем: для чисел — без группировки и с точкой. Это удобно для обменов через XDTO, но функция не позволяет настроить внешний вид для пользователя — для этого предназначен Формат().