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