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

Разработка и Конфигурация · 10 мин

Как в 1С выразить число как строку

Как в 1С преобразовать число в строку: функции Строка(), Формат(), ЧислоПрописью, форматные строки, вывод без пробелов и разделителей, типичные ошибки.

Задача выразить число как строку возникает в 1С постоянно: при формировании номеров документов, выводе сумм в печатных формах, передаче данных в файлы обмена, склейке сообщений пользователю. Встроенный язык платформы предлагает несколько способов такого преобразования, и у каждого есть свои особенности — от пробелов-разделителей групп разрядов до локализованных обозначений.

Главный нюанс, о котором часто забывают начинающие разработчики: при неявном или «наивном» преобразовании числа в строку 1С вставляет неразрывные пробелы между группами разрядов. Число 1234567,89 может превратиться в «1 234 567,89», и такая строка сломает XML-обмен, запрос или сравнение. Поэтому выбирать способ преобразования нужно осознанно, а не по привычке.

Функция Строка(): самый простой способ и его ловушки

Функция Строка() преобразует значение любого типа в его строковое представление. Для числа это выглядит так:

Число = 1234567.89;

Результат = Строка(Число); // "1 234 567,89"

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

Если такую строку передать в XML-файл, веб-сервис или запрос, приёмник может не распознать число. Неразрывный пробел (символ с кодом 160) внешне неотличим от обычного, поэтому ошибка диагностируется с трудом: строка «выглядит правильно», но сравнение и парсинг не работают.

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

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

Функция Формат(Значение; ФорматнаяСтрока) — основной рабочий инструмент преобразования чисел в строки в 1С. Она позволяет задать точность, разделители, лидирующие нули и представление нуля.

Ключевые параметры форматной строки для чисел:

  • ЧГ — группировка разрядов. Значение ЧГ=0 отключает разделители групп (убирает пробелы);
  • ЧЦ — общее количество знаков (целая и дробная части вместе);
  • ЧДЦ — количество знаков дробной части;
  • ЧРД — символ-разделитель дробной части, например точка вместо запятой;
  • ЧН — строка, выводимая вместо нулевого значения;
  • ЧВН — вывод лидирующих нулей.

Примеры типовых вызовов:

Формат(1234567.89; "ЧГ=0");            // "1234567,89" — без пробелов

Формат(1234567.89; "ЧГ=0; ЧРД=."); // "1234567.89" — точка для обмена

Формат(42; "ЧЦ=5; ЧВН=; ЧГ=0"); // "00042" — лидирующие нули

Формат(0; "ЧН=-"); // "-" вместо нуля

Формат(1234.5; "ЧЦ=10; ЧДЦ=2; ЧГ=0"); // "1234,50"

Параметры в форматной строке разделяются точкой с запятой. Порядок не важен, но пропущенная точка с запятой — частая причина «молчаливого» игнорирования параметров.

1c
Формат(СуммаДокумента; "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0")

Типовые сценарии: какой способ выбрать

Выгрузка в XML, JSON и веб-сервисы

Стандарты обмена требуют «канонический» формат числа: без пробелов, с точкой в качестве разделителя дробной части. Правильная форматная строка:

СтрокаДляXML = Формат(Значение; "ЧРД=.; ЧГ=0");

Тот же подход работает при подстановке числа в текст запроса, хотя корректнее использовать параметры запроса — это исключает и проблемы формата, и риск инъекций.

Номера с лидирующими нулями

Для формирования номера фиксированной длины (например, штрихкода или кода по шаблону) используется сочетание ЧЦ и ЧВН:

Код = Формат(НомерПоПорядку; "ЧЦ=8; ЧВН=; ЧГ=0"); // "00000123"

Учтите: если число не помещается в заданную разрядность, оно не обрезается — выводится целиком. Контроль длины при необходимости делайте отдельно.

Сумма прописью в печатных формах

Для сумм в документах (счета, акты, накладные) применяется функция ЧислоПрописью(). Она формирует текстовое представление с учётом склонений:

ЧислоПрописью(1234.56; "Л=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");

// "Одна тысяча двести тридцать четыре рубля 56 копеек"

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

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

Как выбрать способ преобразования

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

Проверка результата и контрольные точки

После преобразования полезно убедиться, что строка соответствует ожиданиям, особенно если она уходит во внешнюю систему. Самая коварная проблема — неразрывный пробел, который не виден глазом.

Быстрая проверка в коде:

Если СтрНайти(Результат, Символ(160)) > 0 Тогда

// в строке есть неразрывный пробел — формат неверный

КонецЕсли;

Также проверяйте длину строки и возможность обратного преобразования: если Число(Результат) вызывает исключение, строка содержит лишние символы.

Контрольные точки

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

Наличие пробелов в строке
Норма

Пробелов нет (для машинного формата)

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

Есть символы с кодом 160 — неразрывные пробелы групп разрядов

Разделитель дробной части
Норма

Соответствует требованиям приёмника (точка для XML/JSON)

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

Запятая там, где приёмник ждёт точку

Обратное преобразование
Норма

Число(Строка) выполняется без ошибки

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

Исключение при попытке преобразовать обратно

Длина строки
Норма

Совпадает с ожидаемой разрядностью

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

Строка длиннее из-за разделителей или знаков

Типичные ошибки и ограничения

Первая и самая массовая ошибка — склейка числа со строкой напрямую: "Сумма: " + Сумма. Здесь срабатывает неявное преобразование с теми же пробелами-разделителями. Для сообщений это допустимо, но лучше сразу приучиться использовать СтрШаблон() или Формат().

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

Третья группа проблем — точность. При указании ЧДЦ происходит округление по арифметическим правилам, а не отсечение. Если нужно отсечь лишние знаки без округления, сначала используйте Цел() с умножением или функции округления в нужном режиме.

Наконец, помните об ограничении точности типа «Число» в 1С: для очень больших значений при преобразованиях возможна потеря младших разрядов. Если требуется побайтовая точность длинных целых, храните такие значения изначально как строки.

Типичные ошибки
01
Конкатенация числа со строкой напрямую — в результате появляются неразрывные пробелы, ломающие обмен данными
02
Использование форматной строки без ЧРД — разделитель зависит от локали сервера и плывёт между средами
03
Ожидание отсечения вместо округления при задании ЧДЦ — 1С округляет арифметически
04
Игнорирование ЧГ=0 при формировании номеров и кодов — разделители групп попадают в идентификаторы

Альтернативы и смежные приёмы

Для формирования составных строк удобнее СтрШаблон(): он принимает готовые строки-параметры, поэтому число всё равно нужно предварительно отформатировать, но сама склейка становится читаемой:

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

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

Для обратной задачи — преобразования строки в число — используется Число() или ОписаниеТипа с методом ПривестиЗначение(), который безопаснее: вместо исключения вернёт значение по умолчанию.

Итоговые рекомендации

Зафиксируйте в команде простое правило: машинный формат — всегда через Формат() с явными ЧГ=0 и ЧРД, пользовательский вывод — любым удобным способом, суммы прописью — через ЧислоПрописью() или типовые модули. Это избавит от целого класса труднодиагностируемых ошибок обмена.

Итог

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

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

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

Как убрать пробелы из строки, уже полученной из числа?

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

Почему Формат(Число; "ЧГ=0") всё равно выдаёт запятую, а мне нужна точка?

Параметр ЧГ управляет только разделителями групп разрядов. Символ дробной части задаётся отдельно параметром ЧРД: Формат(Число; "ЧГ=0; ЧРД=."). Без ЧРД разделитель берётся из региональных настроек сеанса.

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

Используйте параметр ЧДЦ: Формат(1234.5; "ЧДЦ=2; ЧГ=0") даст "1234,50". Учтите, что значение округляется арифметически, а не отсекается. Если нужно отсечение, предварительно обработайте число функциями округления.

Можно ли преобразовать число в строку прямо в запросе 1С?

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

Чем отличается Строка() от Формат() без параметров?

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

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

Функция Число() выбрасывает исключение на некорректной строке. Безопаснее использовать ОписаниеТипа("Число").ПривестиЗначение(Строка) — метод вернёт 0 или значение по умолчанию вместо ошибки. Перед этим удалите неразрывные пробелы и приведите разделитель дробной части к ожидаемому.