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

Разработка и Конфигурация · 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. 1
    Определите, какие поля участвуют в склейке, и оберните NULL-поля в ЕСТЬNULL
  2. 2
    Каждое числовое поле оберните в ПРЕДСТАВЛЕНИЕ()
  3. 3
    Соедините части оператором сложения строк с нужными разделителями
  4. 4
    Выполните запрос в консоли и проверьте результат на данных с NULL, нулём и большими числами
  5. 5
    Если в строке мешают разделители разрядов — перенесите форматирование в код через Формат()

Сравнение числа со строковым полем

Обратная задача — соединить таблицы, где в одной код хранится числом, а в другой строкой. Прямое сравнение Таб1.ЧислоКод = Таб2.СтрокаКод приведёт к ошибке несовместимости типов или к пустому результату.

Правильный подход — привести типы к одному виду. Лучше приводить строку к числу через ВЫРАЗИТЬ, если формат строки гарантированно числовой: ВЫРАЗИТЬ(Таб2.СтрокаКод КАК ЧИСЛО(10, 0)). Это работает стабильнее, чем приведение числа к строке, и не создаёт проблем с разделителями разрядов и лидирующими нулями.

Если в строковом поле встречаются нечисловые значения, приведение к числу даст ошибку или непредсказуемый результат в зависимости от СУБД. В таком случае сначала отфильтруйте данные или выполните сопоставление в коде, предварительно выгрузив обе таблицы.

Типичные ошибки
01
Сравнение числа со строкой напрямую — ошибка несовместимости типов или пустой результат соединения
02
Игнорирование разделителей разрядов в ПРЕДСТАВЛЕНИИ — строка '1 234' не равна строке '1234', сравнения ломаются
03
Склейка без ЕСТЬNULL — одно NULL-поле обнуляет всю результирующую строку
04
ВЫРАЗИТЬ КАК СТРОКА с недостаточной длиной — тихое усечение значения без ошибки
05
Использование строкового поля из запроса в соединении — потеря индексов и резкое падение производительности

Производительность и ограничения

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

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

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

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

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

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

В консоли запросов колонка отображается как строка, значения выровнены влево

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

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

Значения больших чисел
Норма

Числа выведены полностью, без обрезки

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

Хвост числа потерян — недостаточная длина в ВЫРАЗИТЬ

Строки с NULL в исходных полях
Норма

Строка собрана, NULL заменён значением по умолчанию

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

Вся склеенная строка пустая

Сравнение со строковым полем
Норма

Соединение возвращает ожидаемое число строк

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

Пустой результат при заведомо совпадающих данных

Часто задаваемые вопросы

Можно ли в запросе 1С отформатировать число без пробелов-разделителей разрядов?

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

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

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

Как склеить число со строкой, если в поле может быть NULL?

Оберните поле в ЕСТЬNULL: например, ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(Таблица.Количество, 0)). Иначе вся результирующая строка станет NULL, даже если остальные поля заполнены.

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

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

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

В запросе это сделать штатно нельзя. Используйте в коде Формат(Число, "ЧЦ=10; ЧВН=; ЧГ=") — параметр ЧВН включает вывод ведущих нулей до указанной общей длины.

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

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

Итог

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

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