Как превратить число в строку: все способы в 1С 8.3

· 9 мин

Содержание

Самая частая ловушка: разработчик пишет Строка(Число), получает вроде бы текст из цифр — и ломает сравнение, конкатенацию или выгрузку в файл. Причина в том, что Строка() подставляет разделитель групп (неразрывный пробел), поэтому Строка(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.

Но свои подводные камни есть:

  1. Разрядность реквизита. Длина и точность числового реквизита задаются в конфигураторе. Если присвоить значение длиннее заявленной разрядности, лишние знаки потеряются при записи — число молча округлится или обрежется.
  2. Промежуточное округление. При делении и умножении накапливается «хвост» из многих знаков. Если округлять результат только на экране через ЧДЦ, в базе останется неокруглённое значение, и сумма строк не сойдётся с итогом.

Правильно округлять расчётное число функцией Окр():

Окр(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"). Если строка уже получена через Строка(), уберите неразрывный пробел: СтрЗаменить(Текст, Символы.НПП, "").
Почему `Формат(3.145, "ЧДЦ=2")` даёт «3,15», а не «3,14»?
ЧДЦ не обрезает, а округляет дробную часть. Третий знак 5 округляет сотые вверх. Чтобы управлять округлением предсказуемо, округлите число заранее через Окр() с нужным режимом.
Как перевести число в строку с точкой вместо запятой?
Указать разделитель дробной части: Формат(Число, "ЧРД=."). Для полностью «машинного» вида добавьте ЧГ=0, чтобы не было разделителей групп.
Можно ли получить сумму прописью без своего кода?
Да, встроенной функцией ЧислоПрописью(). Она принимает число, форматную строку с локалью и описание предмета исчисления (рубль/копейка и формы склонения).