Разработка и Конфигурация · 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"
Параметры в форматной строке разделяются точкой с запятой. Порядок не важен, но пропущенная точка с запятой — частая причина «молчаливого» игнорирования параметров.
Формат(СуммаДокумента; "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0")Типовые сценарии: какой способ выбрать
Выгрузка в XML, JSON и веб-сервисы
Стандарты обмена требуют «канонический» формат числа: без пробелов, с точкой в качестве разделителя дробной части. Правильная форматная строка:
СтрокаДляXML = Формат(Значение; "ЧРД=.; ЧГ=0");
Тот же подход работает при подстановке числа в текст запроса, хотя корректнее использовать параметры запроса — это исключает и проблемы формата, и риск инъекций.
Номера с лидирующими нулями
Для формирования номера фиксированной длины (например, штрихкода или кода по шаблону) используется сочетание ЧЦ и ЧВН:
Код = Формат(НомерПоПорядку; "ЧЦ=8; ЧВН=; ЧГ=0"); // "00000123"
Учтите: если число не помещается в заданную разрядность, оно не обрезается — выводится целиком. Контроль длины при необходимости делайте отдельно.
Сумма прописью в печатных формах
Для сумм в документах (счета, акты, накладные) применяется функция ЧислоПрописью(). Она формирует текстовое представление с учётом склонений:
ЧислоПрописью(1234.56; "Л=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
// "Одна тысяча двести тридцать четыре рубля 56 копеек"
В типовых конфигурациях обычно есть готовые функции формирования суммы прописью в общих модулях работы с печатью — используйте их, а не пишите свою реализацию.
Как выбрать способ преобразования
Проверка результата и контрольные точки
После преобразования полезно убедиться, что строка соответствует ожиданиям, особенно если она уходит во внешнюю систему. Самая коварная проблема — неразрывный пробел, который не виден глазом.
Быстрая проверка в коде:
Если СтрНайти(Результат, Символ(160)) > 0 Тогда
// в строке есть неразрывный пробел — формат неверный
КонецЕсли;
Также проверяйте длину строки и возможность обратного преобразования: если Число(Результат) вызывает исключение, строка содержит лишние символы.
Как проверить результат преобразования
Пробелов нет (для машинного формата)
Есть символы с кодом 160 — неразрывные пробелы групп разрядов
Соответствует требованиям приёмника (точка для XML/JSON)
Запятая там, где приёмник ждёт точку
Число(Строка) выполняется без ошибки
Исключение при попытке преобразовать обратно
Совпадает с ожидаемой разрядностью
Строка длиннее из-за разделителей или знаков
Типичные ошибки и ограничения
Первая и самая массовая ошибка — склейка числа со строкой напрямую: "Сумма: " + Сумма. Здесь срабатывает неявное преобразование с теми же пробелами-разделителями. Для сообщений это допустимо, но лучше сразу приучиться использовать СтрШаблон() или Формат().
Вторая ошибка — забыть, что форматная строка зависит от региональных настроек сеанса. Разделитель дробной части по умолчанию берётся из локали: на русской локали это запятая. Если код должен работать на разных серверах, всегда задавайте ЧРД явно.
Третья группа проблем — точность. При указании ЧДЦ происходит округление по арифметическим правилам, а не отсечение. Если нужно отсечь лишние знаки без округления, сначала используйте Цел() с умножением или функции округления в нужном режиме.
Наконец, помните об ограничении точности типа «Число» в 1С: для очень больших значений при преобразованиях возможна потеря младших разрядов. Если требуется побайтовая точность длинных целых, храните такие значения изначально как строки.
Альтернативы и смежные приёмы
Для формирования составных строк удобнее СтрШаблон(): он принимает готовые строки-параметры, поэтому число всё равно нужно предварительно отформатировать, но сама склейка становится читаемой:
Текст = СтрШаблон("Сумма документа: %1", Формат(Сумма; "ЧДЦ=2"));
В запросах преобразование числа в строку на уровне языка запросов ограничено: функции ПРЕДСТАВЛЕНИЕ() для чисел нет, а ВЫРАЗИТЬ(Число КАК Строка) не поддерживается. Если строковое представление числа нужно в результате запроса, формируйте его уже в коде после выборки или храните заранее в отдельном строковом реквизите.
Для обратной задачи — преобразования строки в число — используется Число() или ОписаниеТипа с методом ПривестиЗначение(), который безопаснее: вместо исключения вернёт значение по умолчанию.
Итоговые рекомендации
Зафиксируйте в команде простое правило: машинный формат — всегда через Формат() с явными ЧГ=0 и ЧРД, пользовательский вывод — любым удобным способом, суммы прописью — через ЧислоПрописью() или типовые модули. Это избавит от целого класса труднодиагностируемых ошибок обмена.
Что важно запомнить
Строка() добавляет пробелы-разделители и годится только для экрана. Для файлов, запросов и сервисов — Формат() с ЧГ=0 и явным ЧРД. Для номеров с нулями — ЧЦ и ЧВН. Для сумм прописью — ЧислоПрописью(). Всегда проверяйте результат на неразрывные пробелы.
Частые вопросы
Как убрать пробелы из строки, уже полученной из числа?
Надёжнее заново сформировать строку через Формат(Число; "ЧГ=0"). Если исходное число недоступно, удалите неразрывные пробелы: СтрЗаменить(Строка, Символ(160), "") — обычный пробел в СтрЗаменить не сработает, так как разделитель групп имеет код 160.
Почему Формат(Число; "ЧГ=0") всё равно выдаёт запятую, а мне нужна точка?
Параметр ЧГ управляет только разделителями групп разрядов. Символ дробной части задаётся отдельно параметром ЧРД: Формат(Число; "ЧГ=0; ЧРД=."). Без ЧРД разделитель берётся из региональных настроек сеанса.
Как вывести число с фиксированным числом знаков после запятой?
Используйте параметр ЧДЦ: Формат(1234.5; "ЧДЦ=2; ЧГ=0") даст "1234,50". Учтите, что значение округляется арифметически, а не отсекается. Если нужно отсечение, предварительно обработайте число функциями округления.
Можно ли преобразовать число в строку прямо в запросе 1С?
Нет, язык запросов не поддерживает приведение числа к строке через ВЫРАЗИТЬ, а функции ПРЕДСТАВЛЕНИЕ для чисел нет. Формируйте строковое представление в коде после выполнения запроса или храните его в отдельном строковом реквизите объекта.
Чем отличается Строка() от Формат() без параметров?
Для чисел результат практически одинаков: оба варианта дают представление с разделителями групп разрядов по региональным настройкам. Разница в том, что Формат() позволяет управлять представлением через форматную строку, поэтому в прикладном коде предпочтительнее именно он.
Как безопасно преобразовать строку обратно в число?
Функция Число() выбрасывает исключение на некорректной строке. Безопаснее использовать ОписаниеТипа("Число").ПривестиЗначение(Строка) — метод вернёт 0 или значение по умолчанию вместо ошибки. Перед этим удалите неразрывные пробелы и приведите разделитель дробной части к ожидаемому.