Как превратить число в строку: все способы в 1С 8.3
Содержание
Самая частая ловушка: разработчик пишет Строка(Число), получает вроде бы текст из цифр — и ломает сравнение, конкатенацию или выгрузку в файл. Причина в том, что Строка() подставляет разделитель групп (неразрывный пробел), поэтому Строка(1000) — это не 1000, а 1 000. При переводе числа в текст в 1С это надо учитывать с самого начала.
Разберём все рабочие способы преобразования числа в строку: когда хватает Строка(), когда нужен точный Формат(), как сохранить ведущие нули для штрихкодов, как учесть язык интерфейса и чем грозит округление больших чисел. В конце — отдельно про сумму прописью.
Функция Строка: быстро, но с невидимым пробелом
Строка(Значение) переводит в текст любой тип — число, дату, булево, ссылку. Для числа она применяет форматирование по умолчанию: группирует разряды по три и ставит между ними неразрывный пробел (символ с кодом 160, а не обычный пробел).
Текст = Строка(1234567); // "1 234 567" — с неразрывными пробелами
Текст = Строка(-50.5); // "-50,5"
Текст = Строка(0); // "0"
Пока результат идёт в поле формы или в макет печати, это нормально — пользователь видит привычное число с разрядами. Проблемы начинаются, когда текст уходит дальше:
- 🔎 Сравнение строк.
Строка(1000) = "1000"вернётЛожь— слева внутри неразрывный пробел. - 📤 Выгрузка в CSV, TXT, запрос к внешней системе. Пробел попадёт в файл и собьёт импорт на стороне получателя.
- 🔗 Склейка с другим текстом. Разряды «расползутся» там, где нужна сплошная строка цифр.
Если нужна «чистая» строка без группировки — не используйте Строка(), а сразу берите Формат() с отключённой группировкой (см. ниже) или оберните в СтрЗаменить(Строка(Число), Символы.НПП, "").
Ещё один момент: число и строку нельзя просто сложить. Выражение "Итого: " + Сумма вызовет ошибку преобразования типа. Правильно — явно перевести число в текст:
Текст = "Итого: " + Формат(Сумма, "ЧДЦ=2");
// или через шаблон, это читается лучше:
Текст = СтрШаблон("Итого: %1 руб.", Формат(Сумма, "ЧДЦ=2"));
СтрШаблон удобен, когда в строку подставляется несколько значений: подстановки %1, %2 сами приводятся к тексту, и не нужно расставлять плюсы и кавычки.
Отдельно стоит СокрЛП() — она убирает пробелы по краям. После Строка(Число) ведущих и хвостовых пробелов не бывает, но при сборке текста из нескольких кусков СокрЛП() часто нужна, чтобы строка не «разъехалась».
Функция Формат: полный контроль над видом числа
Формат(Значение, ФорматнаяСтрока) — основной инструмент, когда важно, как именно выглядит число. Форматная строка — это набор параметров через точку с запятой. Для чисел чаще всего нужны эти:
| Параметр | Что делает | Пример |
|---|---|---|
ЧЦ | число знаков (ширина) | ЧЦ=6 |
ЧДЦ | знаков после запятой | ЧДЦ=2 |
ЧВН | выводить ведущие нули | ЧВН= |
ЧГ | группировка разрядов | ЧГ=0 (выключить) |
ЧРД | разделитель дробной части | ЧРД=. |
ЧРГ | разделитель групп | ЧРГ=, |
ЧН | формат отрицательных чисел | скобки вместо минуса |
Несколько рабочих комбинаций:
Формат(1234.5, "ЧДЦ=2"); // "1 234,50" — два знака после запятой
Формат(1234567, "ЧГ=0"); // "1234567" — без пробелов между разрядами
Формат(1234.5, "ЧРД=.; ЧГ=0"); // "1234.5" — точка как разделитель, без групп
Формат(0.25, "ЧДЦ=0"); // "0" — округлило до целого
Формат(3.14159, "ЧДЦ=2"); // "3,14" — округлило до сотых
Обратите внимание на последние две строки: ЧДЦ не просто обрезает хвост, а округляет число по правилам (0,25 → 0, 3,14159 → 3,14). Это важно, если результат идёт в документ, где суммы должны биться до копейки.
Формат() возвращает именно текст для показа. Для расчётов округляйте само число функцией Окр(), а не форматированием, иначе в учёте и на экране окажутся разные значения.
Как убрать пробелы и лишние нули
Три задачи, которые решаются одной форматной строкой:
- Убрать разделитель групп:
ЧГ=0. - Поставить точку вместо запятой (для выгрузки в англоязычную систему):
ЧРД=.. - Зафиксировать два знака после запятой даже у целого:
ЧДЦ=2даст100,00.
// Чистое число для API: без групп, точка-разделитель, два знака
ДляОбмена = Формат(Сумма, "ЧДЦ=2; ЧРД=.; ЧГ=0"); // 1234.50
Ведущие нули и штрихкоды
Тип «Число» не хранит ведущие нули: присвоили 000123 — в переменной лежит 123. Поэтому для артикулов, кодов, табельных номеров и штрихкодов нули нужно добавлять при выводе, а не «хранить».
Делают это связкой двух параметров: ЧЦ задаёт общую ширину, ЧВН= включает дополнение нулями слева. Группировку при этом почти всегда отключают.
Формат(123, "ЧЦ=6; ЧВН=; ЧГ=0"); // "000123"
Формат(45, "ЧЦ=13; ЧВН=; ЧГ=0"); // "0000000000045" — под EAN-13
ЧВН= без значения после знака равенства означает «да, выводить нули». Если забыть ЧГ=0, в длинный код влезут пробелы-разделители, и штрихкод не пробьётся сканером.
Ширину ЧЦ ставьте с запасом под максимальную длину кода. Если число окажется длиннее ЧЦ, лишние старшие разряды обрежутся — и вместо кода получится мусор. Для EAN-13 это 13 знаков, для EAN-8 — 8, для внутреннего артикула — сколько заложено в учётной политике предприятия.
Когда штрихкод формируется с контрольной цифрой, саму цифру считают отдельно, а Формат() отвечает только за фиксированную ширину и нули.
Когда код лучше хранить строкой, а не числом
Если борьба с ведущими нулями повторяется из отчёта в отчёт — это сигнал, что тип реквизита выбран неверно. Артикул, табельный номер, код ОКЕИ, номер счёта в банке — это не величины, с которыми считают. Их не складывают и не умножают, зато у них бывает значимый ноль в начале.
Для таких полей в конфигураторе задают тип «Строка», а не «Число». Тогда 000123 хранится как есть, сравнивается без сюрпризов и выгружается без форматных строк.
- 🔢 Число — для сумм, количеств, ставок, всего, что участвует в арифметике.
- 🔡 Строка — для кодов и идентификаторов, где важен точный вид и возможны ведущие нули.
Менять тип уже заполненного реквизита в рабочей базе рискованно: при несовместимых типах платформа очистит значения. Такую правку делают на копии, проверяют конвертацию данных и только потом переносят в основную базу.
Если изменить тип
нельзя (например, реквизит типовой), остаётся форматировать при каждом выводе — через связку ЧЦ/ЧВН=, разобранную выше.
Разделители под язык интерфейса
В русской локали дробная часть отделяется запятой, разряды — пробелом. В английской — наоборот: точка для дробей, запятая для разрядов. Если отчёт или выгрузка открывается в другой локали, разделители надо задавать явно.
Прямой способ — параметр Л= в форматной строке, он подтягивает правила нужной локали:
Формат(1234.5, "Л=ru_RU; ЧДЦ=2"); // "1 234,50"
Формат(1234.5, "Л=en_US; ЧДЦ=2"); // "1,234.50"
Если же текст показывается пользователю и должен подстраиваться под язык сеанса, форматную строку оборачивают в НСтр() — многоязычную строку:
ФС = НСтр("ru = 'ЧДЦ=2; ЧРД=,'; en = 'ЧДЦ=2; ЧРД=.'");
Текст = Формат(Сумма, ФС);
НСтр() сама выберет вариант под текущий язык интерфейса (ТекущийЯзык()). Это штатный приём для конфигураций, где есть русский и английский интерфейс.
Не завязывайтесь на разделители по умолчанию при выгрузке в файл. То, что у вас на экране запятая, не гарантирует запятую у получателя: его региональные настройки могут быть другими. Для машинного обмена всегда фиксируйте ЧРД и ЧРГ явно.
Большие числа, округление и точность
Частое заблуждение: «в 1С, как в других языках, 0.1 + 0.2 даст 0.300000004». Это не так. Платформа работает с десятичными числами, а не с двоичными с плавающей точкой, поэтому классических ошибок IEEE-арифметики здесь нет — 0,1 + 0,2 равно ровно 0,3.
Но свои подводные камни есть:
- Разрядность реквизита. Длина и точность числового реквизита задаются в конфигураторе. Если присвоить значение длиннее заявленной разрядности, лишние знаки потеряются при записи — число молча округлится или обрежется.
- Промежуточное округление. При делении и умножении накапливается «хвост» из многих знаков. Если округлять результат только на экране через
ЧДЦ, в базе останется неокруглённое значение, и сумма строк не сойдётся с итогом.
Правильно округлять расчётное число функцией Окр():
Окр(1234.567, 2); // 1234.57 — до сотых
Окр(1234.567, 0); // 1235 — до целого
Окр(2.5, 0, РежимОкругления.Окр15как20); // 3
Окр(2.5, 0, РежимОкругления.Окр15как10); // 2
Третий параметр Окр() управляет поведением ровно на половине. Окр15как20 округляет 2,5 до 3 (обычное арифметическое, оно же по умолчанию), Окр15как10 — до 2 (отбрасывает половину). Для сумм в учёте используют режим по умолчанию, если учётная политика не требует иного.
Типичный пример, где это всплывает, — распределение суммы по строкам. Если делить итог на несколько позиций и округлять каждую независимо, сумма округлённых строк может не совпасть с округлённым итогом на копейку-две. Решается это так: последнюю строку считают как разницу между округлённым итогом и суммой уже округлённых строк, а не отдельным делением. Тогда сходится и построчно, и в целом.
Отрицательные числа округляются по модулю: Окр(-2.5, 0) даст -3. При выводе отрицательных сумм это стоит проверить на конкретных значениях, особенно в возвратах и корректировках.
Порядок надёжного вывода суммы: сначала Окр(Сумма, 2) для расчёта и записи, и только потом Формат(..., "ЧДЦ=2") для показа. Тогда на экране и в проводках будет одно и то же число.
Число прописью: сумма словами
Когда «преобразовать число в текст» означает «написать сумму словами» — для договора, счёта, приходного ордера — есть отдельная функция ЧислоПрописью(). Это глобальная функция платформы, вручную парсить разряды не нужно.
Рез = ЧислоПрописью(
1234.56,
"Л=ru_RU",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
// "Одна тысяча двести тридцать четыре рубля 56 копеек"
Второй аргумент — форматная строка с локалью. Третий описывает предмет исчисления: три формы названия целой части, её род (м/ж/с), три формы дробной части, её род и число знаков дробной части. Поменяв эти слова, тем же вызовом получают «штук», «метров», «процентов» — что угодно.
Если склонения в вашем случае специфические, строку предмета исчисления подбирают под конкретную единицу; саму логику согласования числительных функция берёт на себя.
Типичные ошибки преобразования
Короткая диагностика самых частых сбоев при выводе числа в текст.
Строка(). Для обмена выводите число через Формат(Число, "ЧГ=0") — группировка отключается.Формат(Код, "ЧЦ=13; ЧВН=; ЧГ=0")."Итого: " + Формат(Сумма, "ЧДЦ=2") или через СтрШаблон.Окр(Сумма, 2) до записи, а Формат() оставьте для показа.Л=en_US в форматной строке или фиксируйте ЧРД и ЧРГ явно.Частые вопросы
Чем `Строка()` отличается от `Формат()` для числа?
Строка() даёт вид по умолчанию — с группировкой и неразрывными пробелами, без настроек. Формат() позволяет задать число знаков, разделители, ведущие нули и локаль. Для показа пользователю годится Строка(), для обмена и точного вида — только Формат().Как убрать пробелы между разрядами?
Формат(Число, "ЧГ=0"). Если строка уже получена через Строка(), уберите неразрывный пробел: СтрЗаменить(Текст, Символы.НПП, "").Почему `Формат(3.145, "ЧДЦ=2")` даёт «3,15», а не «3,14»?
ЧДЦ не обрезает, а округляет дробную часть. Третий знак 5 округляет сотые вверх. Чтобы управлять округлением предсказуемо, округлите число заранее через Окр() с нужным режимом.Как перевести число в строку с точкой вместо запятой?
Формат(Число, "ЧРД=."). Для полностью «машинного» вида добавьте ЧГ=0, чтобы не было разделителей групп.Можно ли получить сумму прописью без своего кода?
ЧислоПрописью(). Она принимает число, форматную строку с локалью и описание предмета исчисления (рубль/копейка и формы склонения).