Разработка и Конфигурация · 10 мин
Как в 1С выразить число как строку в запросе
Как преобразовать число в строку в запросе 1С: ВЫРАЗИТЬ, ПРЕДСТАВЛЕНИЕ, ПОДСТРОКА, конкатенация. Ограничения, примеры кода и типичные ошибки.
Задача преобразовать число в строку прямо в тексте запроса возникает регулярно: нужно склеить номер документа с префиксом, сравнить числовой код со строковым полем, сформировать представление для отчёта. Язык запросов 1С в этом месте неудобен — в нём нет полноценной функции форматирования чисел, а оператор ВЫРАЗИТЬ имеет жёсткие ограничения по типам.
Главная проблема в том, что конструкция ВЫРАЗИТЬ(Поле КАК СТРОКА(...)) работает не для всех типов данных и не во всех СУБД одинаково. Поэтому на практике применяют несколько обходных приёмов: функцию ПРЕДСТАВЛЕНИЕ, сложение со строкой, преобразование на стороне встроенного языка после выгрузки результата. Ниже разобраны все рабочие варианты с условиями их применения.
Почему ВЫРАЗИТЬ число как строку не всегда работает
Оператор ВЫРАЗИТЬ в языке запросов 1С предназначен в первую очередь для уточнения типа полей составного типа и для приведения ссылок, а не для универсального преобразования значений. Приведение числа к строке через ВЫРАЗИТЬ(Поле КАК СТРОКА(20)) формально допустимо в ряде случаев, но его поведение зависит от используемой СУБД и версии платформы.
На файловом варианте и в клиент-серверном режиме с разными СУБД результат может отличаться: где-то запрос выполнится, где-то упадёт с ошибкой несовместимости типов. Дополнительная проблема — длина строки: если указать недостаточную длину, значение может быть усечено без предупреждения.
Поэтому использовать ВЫРАЗИТЬ для преобразования числа в строку стоит только тогда, когда вы уверены в целевой СУБД и проверили результат на реальных данных. В переносимых решениях и типовых доработках этот приём лучше избегать.
Способ 1. Функция ПРЕДСТАВЛЕНИЕ — универсальный вариант
Функция ПРЕДСТАВЛЕНИЕ возвращает строковое представление значения любого типа, включая числа, даты, ссылки и булево. Это самый безопасный способ получить строку из числа в запросе, потому что он не зависит от приведения типов на уровне СУБД.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Товары.Количество) КАК КоличествоСтрокой,
ПРЕДСТАВЛЕНИЕ(Товары.Цена) КАК ЦенаСтрокой
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
У ПРЕДСТАВЛЕНИЕ есть особенности. Для чисел представление формируется по общим правилам платформы и может содержать неразрывные пробелы как разделители групп разрядов — например, «1 234 567». Если строка дальше используется для сравнения или склейки, эти пробелы нужно учитывать.
Для ссылочных типов ПРЕДСТАВЛЕНИЕ возвращает то, что видит пользователь: например, для документа — строку вида «Реализация товаров и услуг 0000-000123 от 12.03.2026». Это удобно для отчётов, но не подходит для машинной обработки номеров.
Способ 2. Сложение числа со строкой
В языке запросов 1С допустима операция сложения строки с числом — платформа неявно приведёт число к строке. Это короткий приём, когда нужно склеить число с префиксом или суффиксом:
ВЫБРАТЬ
"Артикул: " + Товары.Код КАК Подпись
ИЗ
Справочник.Номенклатура КАК Товары
Однако здесь есть подводные камни. Порядок операндов имеет значение: "" + Число и Число + "" могут вести себя по-разному в зависимости от СУБД, а в некоторых конфигурациях сложение числа со строкой вообще вызывает ошибку. Кроме того, неявное приведение даёт тот же эффект разделителей разрядов, что и ПРЕДСТАВЛЕНИЕ.
Использовать конкатенацию разумно для формирования подписей в отчётах и печатных формах, где строка сразу выводится пользователю. Для дальнейших соединений и сравнений такой способ не подходит.
Способ 3. Преобразование после выгрузки результата
Самый гибкий и предсказуемый вариант — оставить число числом в запросе, а преобразование выполнить во встроенном языке при обходе выборки или после выгрузки таблицы значений. Функция Формат() даёт полный контроль над видом строки:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СуммаСтрокой = Формат(Выборка.Сумма, "ЧГ=; ЧДЦ=2");
// СуммаСтрокой = "1234567,89" без разделителей групп
КонецЦикла;
Параметры форматной строки позволяют убрать разделители групп (ЧГ=0 или пустая группа разрядов), зафиксировать число знаков после запятой (ЧДЦ), подавить ноль. Ничего подобного внутри запроса сделать нельзя — язык запросов не имеет функции Формат.
Этот способ рекомендуется, когда строка нужна для обмена данными, формирования файлов, веб-сервисов или точного сравнения. Цена решения — дополнительный проход по данным в коде, что на больших выборках чуть медленнее, но предсказуемо.
Сравнение вариантов
Работает в запросе для любых типов, переносимо между СУБД. Ограничение: разделители разрядов и отсутствие управления форматом.
Компактно, но поведение зависит от СУБД и версии платформы; риск ошибок и усечения. Только для проверенных окружений.
Быстро для подписей в отчётах. Не подходит для сравнений и соединений, поведение не гарантировано.
Полный контроль над видом строки. Требует обхода результата в коде, чуть больше ресурсов.
Склейка нескольких полей и работа с ПОДСТРОКА
Типовая задача — собрать из числовых полей составную строку, например «Код-Номер-Год». Здесь комбинируют ПРЕДСТАВЛЕНИЕ с оператором сложения строк:
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Документ.Номер) + " / " + ПРЕДСТАВЛЕНИЕ(ГОД(Документ.Дата)) КАК Ключ
ИЗ
Документ.СчетНаОплату КАК Документ
Если из строкового представления нужен только фрагмент, применяют ПОДСТРОКА: ПОДСТРОКА(ПРЕДСТАВЛЕНИЕ(Поле), 1, 5). Учтите, что нумерация символов начинается с 1, а длина указывается в символах. Выход за границы строки ошибкой не считается — вернётся то, что есть.
При склейке помните про NULL: если любое из полей равно NULL, результат всей конкатенации станет NULL. Перед склейкой обрабатывайте такие поля через ЕСТЬNULL(Поле, 0) или ЕСТЬNULL(Поле, "").
- 1Определите, какие поля участвуют в склейке, и оберните NULL-поля в ЕСТЬNULL
- 2Каждое числовое поле оберните в ПРЕДСТАВЛЕНИЕ()
- 3Соедините части оператором сложения строк с нужными разделителями
- 4Выполните запрос в консоли и проверьте результат на данных с NULL, нулём и большими числами
- 5Если в строке мешают разделители разрядов — перенесите форматирование в код через Формат()
Сравнение числа со строковым полем
Обратная задача — соединить таблицы, где в одной код хранится числом, а в другой строкой. Прямое сравнение Таб1.ЧислоКод = Таб2.СтрокаКод приведёт к ошибке несовместимости типов или к пустому результату.
Правильный подход — привести типы к одному виду. Лучше приводить строку к числу через ВЫРАЗИТЬ, если формат строки гарантированно числовой: ВЫРАЗИТЬ(Таб2.СтрокаКод КАК ЧИСЛО(10, 0)). Это работает стабильнее, чем приведение числа к строке, и не создаёт проблем с разделителями разрядов и лидирующими нулями.
Если в строковом поле встречаются нечисловые значения, приведение к числу даст ошибку или непредсказуемый результат в зависимости от СУБД. В таком случае сначала отфильтруйте данные или выполните сопоставление в коде, предварительно выгрузив обе таблицы.
Производительность и ограничения
Любое преобразование типов в запросе отключает использование индексов по преобразуемому полю. Если ПРЕДСТАВЛЕНИЕ или ВЫРАЗИТЬ применяется в условии соединения или отбора по большой таблице, СУБД будет сканировать таблицу целиком. На больших объёмах это критично.
Правильный паттерн: выполняйте соединения и отборы по исходным числовым полям, а преобразование в строку делайте только в списке выбираемых полей — для вывода. Если строка нужна именно для соединения, лучше на этапе проектирования хранить код в одном типе в обеих таблицах.
Также помните, что ПРЕДСТАВЛЕНИЕ ссылки — это потенциально дорогая операция: платформа формирует текстовое представление объекта, что может потянуть обращения к связанным данным. В больших отчётах выбирайте представление только там, где оно действительно показывается пользователю.
Как проверить результат
В консоли запросов колонка отображается как строка, значения выровнены влево
Колонка осталась числовой — преобразование не сработало
Числа выведены полностью, без обрезки
Хвост числа потерян — недостаточная длина в ВЫРАЗИТЬ
Строка собрана, NULL заменён значением по умолчанию
Вся склеенная строка пустая
Соединение возвращает ожидаемое число строк
Пустой результат при заведомо совпадающих данных
Часто задаваемые вопросы
Можно ли в запросе 1С отформатировать число без пробелов-разделителей разрядов?
Нет, в языке запросов нет функции форматирования. ПРЕДСТАВЛЕНИЕ и неявное приведение могут добавлять разделители групп. Чтобы получить «чистую» строку, выгрузите результат и примените Формат(Значение, "ЧГ=") во встроенном языке.
Почему ВЫРАЗИТЬ(Поле КАК СТРОКА(10)) выдаёт ошибку?
Приведение числа к строке через ВЫРАЗИТЬ поддерживается не во всех комбинациях платформы и СУБД. Замените конструкцию на ПРЕДСТАВЛЕНИЕ(Поле) — она работает универсально.
Как склеить число со строкой, если в поле может быть NULL?
Оберните поле в ЕСТЬNULL: например, ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(Таблица.Количество, 0)). Иначе вся результирующая строка станет NULL, даже если остальные поля заполнены.
Что быстрее: ПРЕДСТАВЛЕНИЕ в запросе или Формат в коде?
На выборке без соединений по преобразованному полю разница непринципиальна. Проблемы начинаются, когда преобразованное поле участвует в соединениях и отборах — тогда отключаются индексы. Для вывода используйте ПРЕДСТАВЛЕНИЕ, для точного формата — Формат в коде.
Как преобразовать число в строку фиксированной длины с лидирующими нулями?
В запросе это сделать штатно нельзя. Используйте в коде Формат(Число, "ЧЦ=10; ЧВН=; ЧГ=") — параметр ЧВН включает вывод ведущих нулей до указанной общей длины.
Можно ли сравнить числовое поле со строковым без преобразования?
Нет, типы должны совпадать. Приведите строку к числу через ВЫРАЗИТЬ(СтрокаПоле КАК ЧИСЛО(15, 0)) — это надёжнее обратного преобразования, но требует, чтобы в строке были только цифры.
Что важно запомнить
В запросе 1С число в строку преобразуют функцией ПРЕДСТАВЛЕНИЕ — это переносимый и безопасный способ. ВЫРАЗИТЬ КАК СТРОКА зависит от СУБД и рискован. Для точного формата (без разделителей, с ведущими нулями) преобразование выполняют в коде через Формат(). Не используйте преобразованные поля в соединениях — это отключает индексы.