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

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

Как в запросе 1С число представить строкой

Как в запросе 1С преобразовать число в строку: ПРЕДСТАВЛЕНИЕ, конкатенация, обходные приёмы, типичные ошибки и проверка результата.

Задача представить число строкой в запросе 1С возникает часто: нужно склеить номер документа с префиксом, вывести сумму в произвольном отчёте, сформировать навигационную ссылку или подпись для СКД. При этом язык запросов 1С в отличие от встроенного языка не имеет универсальной функции явного приведения числа к строке, и это становится источником ошибок у начинающих разработчиков.

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

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

Почему ВЫРАЗИТЬ не поможет превратить число в строку

Интуитивно разработчик пишет ВЫРАЗИТЬ(Сумма КАК СТРОКА(20)) и ожидает получить строку. На практике такая конструкция либо вызовет ошибку при выполнении запроса, либо вернёт NULL — поведение зависит от платформы и СУБД, но строкового представления числа вы не получите. Оператор ВЫРАЗИТЬ предназначен для уточнения типа внутри совместимого семейства: усечь строку, изменить разрядность числа, сузить составной тип до одного ссылочного.

Причина в том, что запрос транслируется в SQL, а приведение числа к строке зависит от региональных настроек сервера СУБД (разделитель дробной части, группировка разрядов). Платформа 1С сознательно не даёт такого неявного преобразования, чтобы результат запроса был детерминированным на любой инфраструктуре.

Способ 1. Функция ПРЕДСТАВЛЕНИЕ

Основной рабочий инструмент — функция ПРЕДСТАВЛЕНИЕ. Она принимает значение любого типа и возвращает его строковое представление так, как его увидел бы пользователь. Для чисел результат обычно совпадает с обычной записью числа, для ссылок — с представлением объекта, для дат — с форматом даты по умолчанию.

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаСтрокой,

ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслуг.Номер) КАК НомерСтрокой

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

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

Признак корректной работы: в результате запроса поле имеет строковый тип, значение читается как число в привычном виде. Если вместо ожидаемой строки вы видите пустое значение — проверьте, не является ли исходное поле NULL (например, при левом соединении без совпадений).

Способ 2. Конкатенация и арифметические приёмы

Второй приём — сложение числа со строковым литералом. В ряде конфигураций и версий платформы выражение вида "" + Число или конкатенация через оператор + со строкой заставляет платформу вычислить строковое представление. Однако поведение такого выражения не гарантировано документацией и может отличаться на разных СУБД, поэтому полагаться на него в серьёзных решениях не стоит.

Более надёжный вариант той же идеи — склеить ПРЕДСТАВЛЕНИЕ с другими строками, когда цель именно текстовая надпись:

ВЫБРАТЬ

"Документ № " + ПРЕДСТАВЛЕНИЕ(ЗаказПокупателя.Номер)

+ " на сумму " + ПРЕДСТАВЛЕНИЕ(ЗаказПокупателя.СуммаДокумента) КАК Описание

ИЗ

Документ.ЗаказПокупателя КАК ЗаказПокупателя

Отдельный частный случай — дополнение числа лидирующими нулями (например, для кодов фиксированной длины). В запросе это делается громоздко: через ПОДСТРОКА и конкатенацию с заранее заданной строкой нулей. Если такая задача возникает регулярно, правильнее вынести форматирование в код.

Способ 3. Преобразование после запроса — встроенным языком

Часто самый правильный ответ на вопрос «как в запросе представить число строкой» — «никак, делайте это после запроса». Выгрузите результат в таблицу значений или обойдите выборку и примените функции Строка() или Формат():

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

СуммаСтрокой = Формат(Выборка.СуммаДокумента, "ЧДЦ=2; ЧРГ=' '");

КонецЦикла;

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

Этот способ особенно уместен, когда строковое представление нужно для вывода пользователю: в сообщения, в табличные документы, в надписи форм. Запрос остаётся «чистым» и быстрым, а вся косметика выполняется на уровне, где она и должна жить.

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

Как выбрать действие

Нужна строка для склейки текста прямо в запросеИспользуйте ПРЕДСТАВЛЕНИЕ(Число) в сочетании с конкатенацией
Нужен строгий формат: 2 знака после запятой, разделители разрядов, лидирующие нулиВыведите число из запроса как есть и примените Формат() в коде
Результат показывается в отчёте на СКДОформите число через формат поля в настройках СКД, а не в тексте запроса
Строка нужна для сравнения или поискаПересмотрите задачу: сравнивайте числа как числа, иначе получите ошибки вида '10' меньше '2'

Способ 4. Форматирование в СКД и в макетах

Если запрос используется в отчёте на системе компоновки данных, преобразовывать число в строку в тексте запроса обычно вообще не нужно. У поля в настройках СКД есть свойство «Оформление» → «Формат», где задаётся та же форматная строка, что и для функции Формат(). Отчёт выведет число в нужном виде, а в данных останется числовой тип — сортировка и итоги будут работать корректно.

Это важное преимущество: если превратить число в строку на уровне запроса, то группировочные итоги, сортировка по убыванию суммы и числовые сравнения в отборе сломаются. Строки сортируются лексикографически: «10000» окажется раньше «9». Поэтому правило простое — преобразование в строку выполняется как можно позже, в идеале на этапе отображения.

Тот же принцип действует для табличных документов и макетов: область с параметром числового типа можно отформатировать через свойство «Формат» ячейки, не меняя данные.

Сравнение вариантов

ПРЕДСТАВЛЕНИЕ в запросе

Подходит для склейки текста и подписей. Ограничение: формат не управляется, не работает в части контекстов запроса.

Формат() после запроса

Полный контроль над форматом. Ограничение: требуется обход выборки или работа с таблицей значений в коде.

Формат поля в СКД

Лучший вариант для отчётов: данные остаются числами, итоги и сортировка не ломаются. Ограничение: только для отчётов на СКД.

Конкатенация с пустой строкой

Работает не во всех режимах и СУБД, поведение не гарантировано. Использовать только как временный приём с проверкой.

Типичные ошибки и как их проверить

Первая ошибка — попытка сравнивать или искать числа как строки после ПРЕДСТАВЛЕНИЕ. Условие ГДЕ ПРЕДСТАВЛЕНИЕ(Сумма) = "1000" может не сработать из-за пробелов-разделителей разрядов, которые платформа добавляет в представление. Сравнивайте числа как числа, а строковое представление используйте только для вывода.

Вторая ошибка — группировка по ПРЕДСТАВЛЕНИЮ числа. Значения 1000 и 1000,00 могут дать разные строки и развалить группировку. Группируйте по исходному числовому полю, а представление берите как агрегатное или вычисляйте после.

Третья ошибка — ожидание фиксированной длины результата. ПРЕДСТАВЛЕНИЕ возвращает строку переменной длины; если результат затем помещается в поле ограниченной длины, возможно усечение. Проверяйте результат на реальных данных с максимальными значениями, а не только на тестовых примерах.

Типичные ошибки
01
ВЫРАЗИТЬ(Число КАК СТРОКА(20)) — ошибка исполнения или NULL вместо строки
02
Сравнение строкового представления числа с литералом — промахи из-за разделителей разрядов и пробелов
03
Группировка по ПРЕДСТАВЛЕНИЮ(Число) — дробление групп из-за разного формата одинаковых значений
04
Преобразование в строку до сортировки — порядок '10' < '2' вместо числового
05
Использование недокументированной конкатенации с пустой строкой — сбой после смены СУБД или обновления платформы

Порядок действий на практике

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

Порядок действий
  1. 1
    Определите назначение строки: вывод пользователю, склейка текста, сравнение или обмен
  2. 2
    Если нужна только подпись — добавьте ПРЕДСТАВЛЕНИЕ(Число) в список полей запроса
  3. 3
    Если нужен формат — оставьте в запросе число и примените Формат() в коде или формат поля в СКД
  4. 4
    Выполните запрос в консоли и проверьте тип и содержимое поля на нуле, отрицательном и крупном значении
  5. 5
    Проверьте, что сортировка, итоги и отборы по-прежнему работают по числовому полю
Контрольные точки

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

Тип поля в результате запроса
Норма

Строка, значение читается как число

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

Число (преобразование не применилось) или NULL

Крупное значение, например 1234567,89
Норма

Строка содержит значение целиком, без обрезки

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

Усечение или неожиданные разделители, ломающие дальнейшую логику

Сортировка и итоги в отчёте
Норма

Сортируются по числовому полю, итоги сходятся

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

Лексикографический порядок строк, итоги по строкам равны нулю или отсутствуют

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

Итог

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

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

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

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

В самом запросе управлять форматом нельзя: ПРЕДСТАВЛЕНИЕ отдаёт представление по умолчанию. Чтобы гарантированно получить два знака, выведите число из запроса и примените Формат(Число, "ЧДЦ=2") в коде либо задайте формат поля в настройках СКД.

Почему ВЫРАЗИТЬ(Сумма КАК СТРОКА(20)) выдаёт ошибку?

Оператор ВЫРАЗИТЬ умеет уточнять тип только внутри одного семейства: число к числу другой разрядности, строку к строке ограниченной длины, составную ссылку к конкретному типу. Приведение числа к строке в него не заложено, поэтому запрос завершается ошибкой или возвращает NULL.

ПРЕДСТАВЛЕНИЕ вернуло пустую строку, хотя число есть. В чём причина?

Чаще всего исходное поле содержит NULL — например, при левом соединении без совпадения или в необязательном реквизите. Проверьте поле через ЕСТЬNULL(Поле, 0) до применения ПРЕДСТАВЛЕНИЕ и убедитесь, что соединение действительно находит запись.

Как дополнить число лидирующими нулями до фиксированной длины?

В запросе это делается громоздко через ПОДСТРОКА и конкатенацию со строкой нулей, и такой код трудно поддерживать. Практичнее получить число из запроса и применить в коде форматную строку с лидирующими нулями, например через Формат() с параметром ЧЦ.

Можно ли сортировать по ПРЕДСТАВЛЕНИЮ числа?

Технически можно, но результат будет лексикографическим: "10" окажется раньше "2", а "9" — после "10000". Для сортировки используйте исходное числовое поле в секции УПОРЯДОЧИТЬ ПО, а строковое представление оставьте только для отображения.

Работает ли сложение числа с пустой строкой для получения строки?

Такой приём встречается в старых решениях, но он не документирован, и его поведение зависит от режима работы и СУБД. Для надёжного кода используйте ПРЕДСТАВЛЕНИЕ или форматирование после выполнения запроса.