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