Разработка и Конфигурация · 11 мин
Как превратить число в строку в 1С
Способы преобразования числа в строку в 1С: функция Строка(), Формат() с форматной строкой, ЧислоПрописью(), СтрШаблон(). Примеры кода, ошибки и проверка результата.
Задача преобразовать число в строку возникает в 1С постоянно: при формировании печатных форм, выводе сообщений пользователю, записи данных в файлы обмена, построении наименований и заголовков отчётов. Встроенный язык платформы предлагает несколько инструментов — от простой функции Строка() до гибкого форматирования через Формат(), и выбор зависит от того, как именно должно выглядеть итоговое значение.
Главный подводный камень — разница между «просто получить строку» и «получить строку в нужном виде». Функция Строка() возвращает представление числа по умолчанию, но оно может содержать неразрывные пробелы в качестве разделителей групп разрядов, что ломает дальнейший парсинг или сравнение. Поэтому в прикладном коде чаще применяют Формат() с явной форматной строкой.
Ниже разобраны все рабочие способы с примерами кода, типичными ошибками и критериями выбора. Примеры применимы как к управляемым, так и к обычным формам, синтаксис един для всех современных версий платформы 1С:Предприятие 8.
Функция Строка() — базовое преобразование
Самый простой способ превратить число в строку — передать значение в функцию Строка(). Она возвращает строковое представление значения любого типа, в том числе числового:
Число = 12345.67;
Результат = Строка(Число); // "12 345,67"
Обратите внимание на результат: платформа вставляет неразрывные пробелы как разделители групп разрядов и использует региональные настройки для разделителя дробной части. Для вывода пользователю это нормально, но при записи в файл, передаче по HTTP или сравнении строк такие пробелы становятся источником ошибок — строка «12 345,67» не равна строке «12345,67».
Ещё одна особенность — при передаче числа в операции конкатенации платформа выполняет неявное преобразование автоматически:
Текст = "Остаток: " + 1500; // "Остаток: 1 500"
Неявное преобразование работает, но полагаться на него не стоит: поведение аналогично Строка(), то есть разделители разрядов будут добавлены, а контроль над форматом отсутствует. В коде, который читают другие разработчики, явное преобразование предпочтительнее.
Функция Формат() — полный контроль над представлением
Функция Формат() — основной рабочий инструмент преобразования чисел в строки в прикладном коде. Она принимает значение и форматную строку, которая задаёт вид результата:
Число = 12345.6;
Формат(Число; "ЧГ=0"); // "12345,6" — без разделителей групп
Формат(Число; "ЧЦ=10; ЧДЦ=2"); // " 12 345,60" — общая длина 10, 2 знака после запятой
Формат(Число; "ЧРД=.; ЧГ=0"); // "12345.60" — точка в дробной части
Ключевые параметры форматной строки
Параметры указываются через точку с запятой. Наиболее востребованные:
ЧЦ— общее количество отображаемых знаков, включая дробную часть и разделитель;ЧДЦ— количество знаков в дробной части; лишние цифры округляются, недостающие дополняются нулями;ЧРД— разделитель дробной части (точка или запятая);ЧРГ— разделитель групп разрядов;ЧГ— вариант группировки разрядов; значение0отключает разделители групп;ЧН— строка, выводимая вместо нулевого значения, напримерЧН=ноль.
Комбинация "ЧГ=0" — самый частый приём для получения «чистого» числа без пробелов. Для выгрузки в форматы, где требуется точка как разделитель дробной части, добавляют "ЧРД=.":
СуммаДляФайла = Формат(Сумма; "ЧРД=.; ЧГ=0; ЧДЦ=2"); // "12345.60"
ЧислоПрописью() — сумма словами для документов
Для печатных форм договоров, счетов и накладных число часто нужно представить прописью. Эту задачу решает функция ЧислоПрописью():
Сумма = 1250.50;
Пропись = ЧислоПрописью(Сумма, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
// "Одна тысяча двести пятьдесят рублей 50 копеек"
Первый параметр — число, второй — код локализации, третий — параметры предмета исчисления: формы наименования для единицы и дробной части, род и количество знаков дробной части. Если параметры предмета исчисления не задать, получится просто число словами без валюты.
Обратите внимание: функция возвращает строку с заглавной буквы в начале. Если пропись вставляется в середину предложения, первую букву придётся перевести в нижний регистр вручную через НРег() с обработкой первого символа или через Сред().
СтрШаблон() — вставка числа в текст сообщения
Когда число нужно подставить внутрь текста — сообщения пользователю, записи в журнал регистрации, заголовка — удобнее всего СтрШаблон():
Текст = СтрШаблон("На складе осталось %1 шт. товара, резерв — %2 шт.",
Формат(Остаток; "ЧГ=0"),
Формат(Резерв; "ЧГ=0"));
Шаблон содержит подстановки вида %1, %2 и так далее, которые заменяются аргументами по порядку. Аргументы числового типа будут преобразованы неявно, но лучше заранее обернуть их в Формат(), чтобы контролировать вид числа — иначе в текст попадут разделители разрядов и региональный разделитель дробной части.
В длинных сообщениях с тремя и более подстановками СтрШаблон() читается заметно лучше, чем цепочка конкатенаций через «+». Кроме того, шаблон проще выносить в макет или ресурс локализации, не меняя код.
Специальные случаи: XML, JSON и запросы
Выгрузка в XML и JSON
Для обмена данными у платформы есть функции XMLСтрока() и запись через ЗаписьJSON, которые сами приводят число к каноническому виду: точка как разделитель дробной части, без разделителей групп, без лишних пробелов. Ручное форматирование здесь не нужно и даже вредно:
СтрокаДляXML = XMLСтрока(12345.67); // "12345.67"
Число в тексте запроса
Подставлять число прямо в текст запроса конкатенацией — плохая практика: помимо риска с региональными настройками, это усложняет поддержку. Используйте параметры запроса — платформа сама выполнит корректное преобразование:
Запрос.Текст = "ВЫБРАТЬ * ИЗ Регистр.Остатки ГДЕ Количество > &Порог";
Запрос.УстановитьПараметр("Порог", ПороговоеЗначение);
Очень большие и очень маленькие числа
Тип «Число» в 1С имеет ограниченную точность (до 32 разрядов, из них до 10 в дробной части — задаётся в свойствах типа). При преобразовании очень больших чисел или чисел с большим количеством знаков после запятой проверяйте, что точность не потеряна ещё до преобразования в строку — функция Формат() лишь отобразит то значение, которое уже хранится в переменной.
Сравнение способов преобразования
Быстро и коротко. Подходит для отладочного вывода. Минусы: разделители разрядов, региональный формат, нет контроля.
Основной рабочий вариант для прикладного кода и файлов обмена. Требует явного задания ЧРД для машиночитаемых форматов.
Только для сумм прописью в печатных формах. Требует настройки параметров предмета исчисления.
Для вставки числа в текст сообщений и заголовков. Числа внутри всё равно стоит предварительно форматировать.
Для выгрузки в XML и интеграций. Даёт каноническое представление, ручное форматирование не требуется.
Типичные ошибки и как их проверить
Первая распространённая ошибка — использование Строка() для данных обмена. Симптом: принимающая система отклоняет файл или значение «съезжает» в ноль. Лечится переходом на Формат(...; "ЧРД=.; ЧГ=0") или XMLСтрока().
Вторая ошибка — забытый параметр ЧДЦ при выводе сумм. Число 1500 без ЧДЦ=2 выводится как «1 500», а не «1 500,00», что выглядит небрежно в печатной форме. Третья — попытка убрать разделители разрядов через СтрЗаменить(Строка(Число); " "; ""): это не сработает, потому что платформа вставляет неразрывный пробел (код 160), а не обычный. Правильное решение — ЧГ=0 в форматной строке.
Как проверить результат
"12345.67" — точка, без пробелов
"12 345,67" — есть пробелы и запятая
Всегда два знака после разделителя: "1 500,00"
"1 500" без копеек
Читаемый вид с разделением разрядов
Слипшиеся цифры или артефакты форматирования
Как выбрать способ под задачу
Выбор сводится к ответу на один вопрос: кто будет читать результат — человек или программа. Для человека разделители разрядов и региональный формат удобны, для программы они критичны. Дальше решение принимается по сценарию.
Как выбрать действие
Что важно запомнить
Строка() подходит только для простого вывода человеку. Для прикладного кода и обмена данными используйте Формат() с явными параметрами ЧГ=0 и ЧРД, для сумм прописью — ЧислоПрописью(), для сообщений — СтрШаблон(). Всегда проверяйте результат на наличие неразрывных пробелов и правильный разделитель дробной части.
Частые вопросы
Почему Строка(Число) добавляет пробелы в результат?
Платформа применяет представление по умолчанию с разделением групп разрядов, причём в качестве разделителя используется неразрывный пробел. Это удобно для чтения, но мешает машинной обработке. Убрать разделители можно через Формат(Число; "ЧГ=0").
Как получить число с точкой вместо запятой в дробной части?
Задайте параметр ЧРД в форматной строке: Формат(Число; "ЧРД=.; ЧГ=0"). Точка как разделитель требуется в большинстве форматов обмена — XML, JSON, CSV для внешних систем.
Как вывести число с фиксированным количеством знаков после запятой?
Используйте параметр ЧДЦ: Формат(Число; "ЧДЦ=2") выведет ровно два знака, дополнив нулями или округлив лишние. Для денежных сумм комбинируйте с ЧГ для нужного вида разрядов.
Можно ли преобразовать число в строку без функции, просто сложением со строкой?
Да, конкатенация "Текст" + Число выполнит неявное преобразование, аналогичное Строка(). Но контроль формата при этом теряется, поэтому в прикладном коде лучше явно применять Формат().
Чем отличается ЧислоПрописью() от Формат()?
Формат() возвращает цифровое представление числа с заданным оформлением, а ЧислоПрописью() — текстовое описание числа словами с возможностью указать валюту или единицу измерения. Это разные задачи: первая — оформление, вторая — юридически значимая запись суммы.
Как преобразовать число в строку в запросе 1С?
В языке запросов есть функция ПРЕДСТАВЛЕНИЕ(), но для чисел она возвращает представление по умолчанию без настройки формата. Обычно правильнее выбрать число как есть и форматировать его уже в коде при обходе результата запроса.