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

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

Число как строку в запросе 1С: как преобразовать и что учесть

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

В языке запросов 1С нет привычной функции явного приведения типа числа к строке наподобие Строка() из встроенного языка. Это регулярно ставит в тупик разработчиков, которым нужно склеить номер документа с префиксом, вывести сумму в произвольном формате или сравнить числовое поле со строковым. Понимание доступных инструментов и их ограничений экономит часы отладки.

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

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

Почему в запросе 1С нет прямого преобразования числа в строку

Язык запросов 1С — это декларативный язык выборки данных, а не язык общего назначения. Его функции ориентированы на фильтрацию, группировку и соединение таблиц, а не на форматирование вывода. Поэтому функций вида ЧислоВСтроку() в нём нет, и попытка написать что-то подобное приведёт к синтаксической ошибке.

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

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

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

bsl
ВЫБРАТЬ
	ПРЕДСТАВЛЕНИЕ(Продажи.СуммаОборот) КАК СуммаСтрокой,
	ПРЕДСТАВЛЕНИЕ(Документ.Номер) КАК НомерСтрокой
ИЗ
	РегистрНакопления.Продажи.Обороты КАК Продажи

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

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

Способ 2. Конкатенация с пустой строкой

Оператор сложения строк в запросе неявно приводит число к строке, если один из операндов — строка. Приём «прибавить пустую строку» часто используют как короткую альтернативу ПРЕДСТАВЛЕНИЕ.

bsl
ВЫБРАТЬ
	"" + Таблица.Количество КАК КоличествоСтрокой,
	"Заказ № " + Таблица.Номер + " от " + ПРЕДСТАВЛЕНИЕ(Таблица.Дата) КАК Описание
ИЗ
	Документ.ЗаказПокупателя КАК Таблица

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

Ещё одно ограничение — длина результирующей строки. Если поле результата неявно получает ограниченную длину, длинный текст может обрезаться. При склейке нескольких полей контролируйте итоговую длину через ВЫРАЗИТЬ с явным указанием типа Строка(N).

Сравнение способов и их ограничения

Выбор зависит от того, что именно требуется: просто получить текст, склеить поля или отформатировать число по шаблону. Ниже — сопоставление основных вариантов.

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

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

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

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

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

Короткий синтаксис для объединения полей. Ограничение — поведение зависит от СУБД, возможна ошибка типов.

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

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

СКД и вычисляемые поля

Форматирование без изменения запроса. Ограничение — применимо только в отчётах на компоновке данных.

Когда запрос не справляется: форматирование в коде

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

bsl
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	СуммаСтрокой = Формат(Выборка.Сумма, "ЧДЦ=2; ЧРГ=' '; ЧН=0");
КонецЦикла;

Такой подход быстрее и надёжнее: запрос возвращает компактные числовые данные, а форматирование выполняется один раз на клиенте или сервере приложения. Дополнительный плюс — число остаётся пригодным для сортировки и агрегации в самом запросе, чего строка не позволяет: строки «10» и «9» сортируются как «10» раньше «9».

Число как строка в отчётах на СКД

В системе компоновки данных есть два удобных пути. Первый — вычисляемое поле с выражением на языке выражений СКД, где доступно преобразование и функции форматирования. Второй — оставить поле числовым и задать формат в настройках: на закладке «Наборы данных» или в пользовательских настройках поля указывается форматная строка, аналогичная параметрам функции Формат().

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

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

Чаще всего проблемы возникают не на этапе написания запроса, а при использовании его результата. Строка вместо числа меняет поведение сортировки, сравнений и соединений, и это не всегда заметно сразу.

Типичные ошибки
01
Сортировка по строковому полю с числом: порядок "1, 10, 2, 25" вместо числового. Решение — сортировать по исходному числовому полю, а строку выводить отдельно.
02
Соединение таблиц по полю, преобразованному в строку: потеря индексов и резкое падение производительности на больших таблицах.
03
Ожидание фиксированного формата от ПРЕДСТАВЛЕНИЕ: на другом сервере с иными региональными настройками строка выглядит иначе, и парсинг ломается.
04
Обрезание результата конкатенации из-за неявной длины строки: часть склеенного текста теряется без ошибки.

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

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

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

Тип колонки результата
Норма

Строка с достаточной длиной

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

Строка обрезана или тип остался числом

Представление дробного числа
Норма

Разделитель и точность ожидаемые

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

Неразрывные пробелы или иной разделитель мешают разбору

Сортировка и итоги
Норма

Выполняются по числовому полю

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

Сортировка по строке даёт лексикографический порядок

Значение NULL
Норма

Обработано явно (ЕСТЬNULL или проверка)

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

Пустая строка или NULL ломают склейку

FAQ

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

Штатной функции в языке запросов для этого нет. Обычно номер документа уже хранится как строка нужной длины, и достаточно выбрать его как есть. Если исходник — число, дополнение делают функцией Формат() с параметром ЧЦ при обработке результата либо в вычисляемом поле СКД.

Почему ПРЕДСТАВЛЕНИЕ числа возвращает строку со странными пробелами?

Это неразрывные пробелы — разделители групп разрядов, которые платформа подставляет по региональным настройкам. Они визуально похожи на обычные пробелы, но не равны им при сравнении. Для чистой строки без разделителей используйте Формат() с пустым параметром ЧРГ в коде.

Работает ли ВЫРАЗИТЬ для преобразования числа в строку?

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

Как сравнить числовое поле со строковым в условии ГДЕ?

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

Что быстрее: ПРЕДСТАВЛЕНИЕ в запросе или Формат() в коде?

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

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

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

Итог

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

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