Число в строку в 1С: Строка(), Формат() и СтрШаблон()

· 9 мин

Содержание

Самая частая ошибка новичка: написать "Итого: " + Сумма, где Сумма — число. Платформа не склеит текст с числом молча, а остановит выполнение с сообщением о несоответствии типов. Число в строку в 1С переводят явно, и для этого есть три рабочих инструмента: функция Строка(), функция Формат() и шаблон СтрШаблон().

Разница между ними простая. Строка() даёт текст «как получится». Формат() даёт текст ровно такой, какой нужен: с нужным числом знаков после запятой, без разделителей разрядов, с ведущими нулями. СтрШаблон() удобен, когда в одну фразу нужно подставить сразу несколько значений. Ниже — где какой применять, с примерами и подводными камнями.

Функция Строка(): быстрое преобразование и его подвох

Глобальная функция Строка() принимает значение любого типа и возвращает его строковое представление:

Текст = Строка(1000);      // "1 000"
Текст = Строка(3.14);      // "3,14"
Текст = Строка(1234567);   // "1 234 567"

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

Строка(1000000) вернёт 1 000 000, а не 1000000. Между цифрами стоит неразрывный пробел (символ с кодом 160), который глазом не отличить от обычного. Поиск по такой строке и сравнение с «1000000» работать не будут.

Поэтому правило такое: Строка() — для быстрого показа на экране или в сообщении, когда формат числа не важен. Как только формат важен, берите Формат().

Функция Формат(): полный контроль над видом числа

Формат(Значение, ФорматнаяСтрока) — главный инструмент, когда число в строку нужно привести «красиво». Второй параметр — это набор параметров через точку с запятой. Для чисел чаще всего используют эти:

ПараметрЧто задаётПример
ЧДЦзнаков после запятойЧДЦ=2 → 3,14
ЧЦобщее число разрядов (ширина)ЧЦ=6
ЧГ=0отключить разделитель разрядов1234567 вместо 1 234 567
ЧРДсимвол разделителя дробной частиЧРД=. → точка вместо запятой
ЧВН=ведущие нули (вместе с ЧЦ)0007
ЧНчто выводить вместо нуляЧН=нет

Несколько практических примеров:

// Два знака после запятой, без разделителя тысяч
Сумма = Формат(1234567.5, "ЧДЦ=2; ЧГ=0");   // "1234567,50"

// Денежный формат для показа: два знака, разряды через пробел
Сумма = Формат(1234567.5, "ЧДЦ=2");         // "1 234 567,50"

// Разделитель дробной части — точка (для выгрузки, CSV, JSON)
Сумма = Формат(3.14, "ЧДЦ=2; ЧРД=.; ЧГ=0"); // "3.14"

// Вместо нуля — прочерк
Остаток = Формат(0, "ЧН=—");                 // "—"

Формат() сам округляет до указанного числа знаков. Формат(3.146, "ЧДЦ=2") вернёт 3,15. Если нужно округлить по своим правилам раньше, примените Окр(Число, 2) до вызова Формат().

Ведущие нули: номер фиксированной длины

Частая задача — сделать из числа 7 строку 0007 для кода или артикула фиксированной ширины. Это связка ЧЦ (ширина) и ЧВН= (ведущие нули):

Код = Формат(7, "ЧЦ=4; ЧВН=; ЧГ=0");   // "0007"
Код = Формат(42, "ЧЦ=4; ЧВН=; ЧГ=0");  // "0042"

ЧГ=0 здесь обязателен: без него на больших числах снова вылезет разделитель разрядов. Если без ведущих нулей поставить только ЧЦ, платформа дополнит число пробелами слева, а не нулями.

Склейка числа с текстом: конкатенация и СтрШаблон()

Самое типовое применение — вставить число в фразу. Прямая конкатенация требует явного преобразования:

// ОШИБКА: несоответствие типов, выполнение прервётся
Сообщить("Итого: " + Сумма);

// Правильно
Сообщить("Итого: " + Строка(Сумма));
Сообщить("Итого: " + Формат(Сумма, "ЧДЦ=2"));

Когда значений несколько, читать «плюсы» тяжело. Тогда удобнее СтрШаблон() — он подставляет аргументы в места %1, %2 и так далее:

Текст = СтрШаблон("Заказ №%1 на сумму %2 руб.", Номер, Формат(Сумма, "ЧДЦ=2"));

СтрШаблон() сам переводит аргументы в строку по тому же правилу, что и Строка() — с разделителем разрядов. Если число должно быть «чистым», оборачивайте его в Формат(..., "ЧГ=0") прямо в аргументе, как в примере выше с суммой.

Ещё один нюанс: внутри шаблона сам символ % нужно экранировать удвоением — %%. Иначе платформа решит, что за ним идёт номер аргумента.

Разделители разрядов, валюта и локализация

По умолчанию в русской локали разделитель тысяч — неразрывный пробел, дробная часть — запятая. Это задаётся региональными настройками информационной базы. Управлять видом точечно удобнее прямо в формате.

  • 🔹 Убрать разделитель тысяч — ЧГ=0.
  • 🔹 Сменить разделитель дробной части на точку — ЧРД=..
  • 🔹 Перейти на другую локаль целиком — параметр Л=.

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

Текст = Формат(1234567.5, "Л=en_US; ЧДЦ=2");  // "1,234,567.50"

Для денежных сумм в интерфейсе обычно хватает Формат(Сумма, "ЧДЦ=2") — два знака после запятой и привычные пробелы между разрядами. Для хранения и обмена (файлы, веб-сервисы, HTTP-запросы) берите ЧГ=0; ЧРД=., чтобы на принимающей стороне число разобралось без сюрпризов.

У умолчаний есть источник. Вид числа без явного формата задаётся не кодом, а региональными настройками информационной базы — тем, какой символ там назначен разделителем дробной части и групп. Поэтому одна и та же строка Строка(Сумма) на двух базах с разными настройками может выглядеть по-разному. Если результат должен быть одинаковым везде — не оставляйте формат на усмотрение базы, а прописывайте параметры в Формат() вручную. Это особенно критично для кода, который работает на разных серверах клиентов.

Число в строку в запросе и в СКД

Отдельный частый вопрос — как привести число к строке прямо в языке запросов. Короткий ответ: язык запросов не умеет форматировать числа так, как Формат() в коде. Функции Формат() в запросе нет.

Что доступно в запросе:

  • Оператор ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) приводит значение к строке длиной N символов. Он нужен в первую очередь для составных типов и для усечения длины, а не для оформления числа — управлять разделителями и знаками после запятой он не даёт.
  • Если число нужно именно показать в красивом виде, форматирование переносят в систему компоновки данных. У поля в СКД есть свойство оформления «Формат», куда пишется та же форматная строка, что и в Формат() (например, ЧДЦ=2; ЧГ=0).

На практике это значит простое правило: считайте в запросе, а форматируйте число в строку уже в СКД или в коде после выборки. Так вы не упираетесь в ограничения языка запросов и получаете полный контроль через привычный Формат().

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    СтрокаСуммы = Формат(Выборка.Сумма, "ЧДЦ=2; ЧГ=0");
    // дальше работаем с текстом
КонецЦикла;

Неопределено, NULL, ноль и округление

Преобразование ломается чаще всего не на числах, а на их отсутствии. Разберём пограничные случаи.

Неопределено и NULL. Строка(Неопределено) и Строка(NULL) возвращают пустую строку "". Само по себе это не ошибка, но в отчёте вместо суммы вы увидите пустоту. NULL особенно часто приходит из запроса — например, при соединении, когда у записи нет связанных данных. Оберните поле в ЕСТЬNULL(Поле, 0) ещё в запросе, тогда вместо пустоты получите корректный ноль.

// В запросе
ЕСТЬNULL(Продажи.Сумма, 0) КАК Сумма

// В коде, если значение могло не прийти
Текст = Формат(?(Значение = Неопределено, 0, Значение), "ЧДЦ=2");

Ноль. Строка(0) даёт "0". Если по смыслу нулевую сумму показывать не нужно, используйте ЧН: Формат(0, "ЧН=") вернёт пустую строку, а Формат(0, "ЧН=—") — прочерк.

Округление и «хвосты». Числа с плавающей точкой иногда дают длинный хвост после запятой. Если нужно ровно два знака — задайте ЧДЦ=2, и Формат() сам корректно округлит и отбросит лишнее. Не полагайтесь на то, что число «и так красивое»: без явного ЧДЦ платформа покажет столько знаков, сколько реально хранится.

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

Обратное преобразование. Часто число переводят в строку, сохраняют, а позже читают обратно через Число(Строка). Здесь всплывает всё тот же разделитель разрядов: Число("1 000") упадёт с ошибкой, потому что неразрывный пробел для парсинга — мусор. Поэтому строку, предназначенную для обратного чтения, формируйте сразу «чисто»:

Текст = Формат(Значение, "ЧГ=0; ЧРД=.");  // "1234.5"
Назад = Число(Текст);                      // корректно обратно в число

Правило round-trip: если строку потом придётся снова превращать в число, переводите её в формате ЧГ=0; ЧРД=.. Тогда Число() разберёт её без региональных сюрпризов.

Сумма прописью: когда числа мало

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

Текст = ЧислоПрописью(1250);  // "одна тысяча двести пятьдесят"

У функции есть дополнительные параметры: форматная строка задаёт язык, род и правила склонения, а параметры предмета исчисления описывают единицы — рубли и копейки, штуки, целые и дробные части. Конкретные коды в форматной строке объёмные, поэтому не держите их в голове: откройте синтакс-помощник на ЧислоПрописью и возьмите готовый пример под валюту. Выдумывать параметры этой функции не стоит — неверная форматная строка даст либо ошибку, либо текст не на том языке.

Практический вывод: для печатных форм (счёт, акт, платёжка) сумму прописью формирует именно ЧислоПрописью(), а не Формат(). А вот саму цифровую сумму рядом с прописью по-прежнему переводят через Формат(Сумма, "ЧДЦ=2").

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

Чтобы не держать всё в голове, короткая шпаргалка — что брать под конкретную цель:

ЗадачаИнструментПример
Показать число в сообщении, формат не важенСтрока()Строка(Остаток)
Сумма на форме / в печати, 2 знакаФормат()Формат(С, "ЧДЦ=2")
Число для файла, ключа, обмена (без пробелов)Формат() + ЧГ=0Формат(С, "ЧГ=0")
Точка вместо запятой (CSV, JSON)Формат() + ЧРД=.Формат(С, "ЧДЦ=2; ЧРД=.; ЧГ=0")
Код фиксированной длины с нулямиФормат() + ЧЦ + ЧВН=Формат(N, "ЧЦ=5; ЧВН=; ЧГ=0")
Фраза с несколькими значениямиСтрШаблон()СтрШаблон("№%1 — %2", N, С)
Сумма словамиЧислоПрописью()ЧислоПрописью(С)

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

Проверьте себя
Что вернёт `Строка(1000)` в русской локали?
Какой параметр отключает разделитель разрядов в `Формат()`?
Что произойдёт при `"Сумма: " + 500`, если 500 — число?

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

Почему при склейке числа с текстом выпадает ошибка?
Оператор + между строкой и числом платформа трактует как арифметику и пытается привести строку к числу, что невозможно. Переводите число явно: "Текст " + Строка(Число) или через СтрШаблон().
Как убрать пробелы между тысячами в результате?
Это разделитель разрядов. Отключается параметром ЧГ=0 в Формат(): Формат(1234567, "ЧГ=0") вернёт 1234567 без пробелов.
Чем Строка() отличается от Формат()?
Строка() даёт представление по умолчанию и не управляется параметрами. Формат() позволяет задать число знаков после запятой, ведущие нули, разделители и локаль. Нужен контроль над видом — только Формат().
Как сделать точку вместо запятой в дробной части?
Параметр ЧРД=.: Формат(3.14, "ЧДЦ=2; ЧРД=.; ЧГ=0") вернёт 3.14. Пригодится для выгрузки в CSV, JSON и веб-сервисы.
Как получить число фиксированной длины с нулями слева?
Связка ЧЦ (ширина) и ЧВН= (ведущие нули): Формат(7, "ЧЦ=4; ЧВН=; ЧГ=0") вернёт 0007.