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

Разработка и Конфигурация · 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 в дробной части — задаётся в свойствах типа). При преобразовании очень больших чисел или чисел с большим количеством знаков после запятой проверяйте, что точность не потеряна ещё до преобразования в строку — функция Формат() лишь отобразит то значение, которое уже хранится в переменной.

Сравнение способов преобразования

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

Быстро и коротко. Подходит для отладочного вывода. Минусы: разделители разрядов, региональный формат, нет контроля.

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

Основной рабочий вариант для прикладного кода и файлов обмена. Требует явного задания ЧРД для машиночитаемых форматов.

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

Только для сумм прописью в печатных формах. Требует настройки параметров предмета исчисления.

СтрШаблон()

Для вставки числа в текст сообщений и заголовков. Числа внутри всё равно стоит предварительно форматировать.

XMLСтрока()

Для выгрузки в XML и интеграций. Даёт каноническое представление, ручное форматирование не требуется.

Типичные ошибки и как их проверить

Первая распространённая ошибка — использование Строка() для данных обмена. Симптом: принимающая система отклоняет файл или значение «съезжает» в ноль. Лечится переходом на Формат(...; "ЧРД=.; ЧГ=0") или XMLСтрока().

Вторая ошибка — забытый параметр ЧДЦ при выводе сумм. Число 1500 без ЧДЦ=2 выводится как «1 500», а не «1 500,00», что выглядит небрежно в печатной форме. Третья — попытка убрать разделители разрядов через СтрЗаменить(Строка(Число); " "; ""): это не сработает, потому что платформа вставляет неразрывный пробел (код 160), а не обычный. Правильное решение — ЧГ=0 в форматной строке.

Типичные ошибки
01
Строка(Число) для выгрузки в файл — неразрывные пробелы и запятая ломают парсинг на приёмной стороне.
02
СтрЗаменить для удаления разделителей разрядов — разделитель является неразрывным пробелом, обычный пробел в замене не сработает.
03
Отсутствие ЧДЦ=2 для денежных сумм — копейки теряются из представления.
04
Конкатенация числа в текст запроса вместо параметра — риск ошибок из-за региональных настроек и ухудшение читаемости.
Контрольные точки

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

Строка из числа 12345.67 для файла обмена
Норма

"12345.67" — точка, без пробелов

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

"12 345,67" — есть пробелы и запятая

Денежная сумма в печатной форме
Норма

Всегда два знака после разделителя: "1 500,00"

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

"1 500" без копеек

Число в сообщении пользователю
Норма

Читаемый вид с разделением разрядов

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

Слипшиеся цифры или артефакты форматирования

Как выбрать способ под задачу

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

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

Как выбрать действие

Нужно быстро вывести число в отладочное сообщениеИспользуйте Строка() или неявное преобразование при конкатенации
Число идёт в файл обмена, JSON, XML или внешний APIИспользуйте Формат() с ЧРД=. и ЧГ=0 либо XMLСтрока()
Нужна сумма прописью в печатной формеИспользуйте ЧислоПрописью() с параметрами валюты
Число вставляется в текст сообщения пользователюИспользуйте СтрШаблон() с предварительным Формат() аргументов
Число передаётся в запросПередавайте через параметр запроса, не преобразуя в строку
Итог

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

Строка() подходит только для простого вывода человеку. Для прикладного кода и обмена данными используйте Формат() с явными параметрами ЧГ=0 и ЧРД, для сумм прописью — ЧислоПрописью(), для сообщений — СтрШаблон(). Всегда проверяйте результат на наличие неразрывных пробелов и правильный разделитель дробной части.

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

Почему Строка(Число) добавляет пробелы в результат?

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

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

Задайте параметр ЧРД в форматной строке: Формат(Число; "ЧРД=.; ЧГ=0"). Точка как разделитель требуется в большинстве форматов обмена — XML, JSON, CSV для внешних систем.

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

Используйте параметр ЧДЦ: Формат(Число; "ЧДЦ=2") выведет ровно два знака, дополнив нулями или округлив лишние. Для денежных сумм комбинируйте с ЧГ для нужного вида разрядов.

Можно ли преобразовать число в строку без функции, просто сложением со строкой?

Да, конкатенация "Текст" + Число выполнит неявное преобразование, аналогичное Строка(). Но контроль формата при этом теряется, поэтому в прикладном коде лучше явно применять Формат().

Чем отличается ЧислоПрописью() от Формат()?

Формат() возвращает цифровое представление числа с заданным оформлением, а ЧислоПрописью() — текстовое описание числа словами с возможностью указать валюту или единицу измерения. Это разные задачи: первая — оформление, вторая — юридически значимая запись суммы.

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

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