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

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

1С запрос: число как строка — способы преобразования

Как в запросе 1С преобразовать число в строку: приём через ПОДСТРОКА, ВЫРАЗИТЬ, соединение со строковыми полями, типичные ошибки и готовые примеры кода.

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

Самый распространённый рабочий приём — воспользоваться тем, что функция ПОДСТРОКА неявно приводит свой первый аргумент к строковому типу. Передав туда числовое поле, вы получаете строковое представление числа, которое дальше можно объединять с текстом через оператор + или сравнивать с другими строками.

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

Почему в запросе 1С нельзя просто написать Строка(Число)

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

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

Важно понимать: преобразование числа в строку в запросе почти всегда означает, что по этому полю нельзя будет корректно сортировать и сравнивать как числа. Строка «10» меньше строки «2» при лексикографическом сравнении. Если цель — только вывод в отчёт, преобразование допустимо; если цель — фильтрация или сортировка, лучше оставить числовой тип.

Основной приём: ПОДСТРОКА для приведения числа к строке

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

ВЫБРАТЬ

ПОДСТРОКА(Товары.Количество, 1, 12) КАК КоличествоСтрокой

ИЗ

Справочник.Товары КАК Товары

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

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

bsl
ВЫБРАТЬ
	ПОДСТРОКА(Док.Номер, 1, 11) КАК НомерСтрокой
ИЗ
	Документ.РеализацияТоваровУслуг КАК Док

Склейка числа с текстом в запросе

Типичная задача — сформировать в запросе строку вида «Заказ № 123 от покупателя». Оператор + в языке запросов требует, чтобы оба операнда были строками, поэтому числовую часть сначала приводят через ПОДСТРОКА.

ВЫБРАТЬ

"Заказ № " + ПОДСТРОКА(Заказы.Номер, 1, 11) КАК Представление

ИЗ

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

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

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

ВЫРАЗИТЬ и приведение типов: когда это работает

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

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

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

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

ПОДСТРОКА(Число, 1, N)

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

ВЫРАЗИТЬ(Число КАК СТРОКА(N))

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

Преобразование после выгрузки

Запрос возвращает число, а Строка() или Формат() применяются в коде. Самый управляемый вариант для отчётов, но требует обхода выборки.

Соединение таблиц по числу и строке

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

ВЫБРАТЬ

Заказы.Ссылка,

Оплаты.Сумма

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оплаты КАК Оплаты

ПО Оплаты.НомерЗаказа = ПОДСТРОКА(Заказы.Номер, 1, 11)

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

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

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

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

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

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

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

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

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

Полнота значений
Норма

Все числа отображаются целиком, включая дробную часть

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

Значения обрезаны — увеличьте третий параметр ПОДСТРОКА

Результат соединения
Норма

Строки обеих таблиц сопоставились, нет массовых NULL

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

Сплошные NULL — не совпадают форматы (лидирующие нули, префиксы)

NULL в исходном поле
Норма

NULL заменён через ЕСТЬNULL до преобразования

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

В склеенных строках появляются пустые значения

Типичные ошибки
01
Использование Строка() или Формат() в тексте запроса — этих функций нет в языке запросов, запрос не выполнится.
02
Слишком маленькая длина в ПОДСТРОКА — число молча обрезается, и сравнения дают ложные совпадения.
03
Конкатенация числа со строкой без приведения — ошибка несовместимости типов при выполнении.
04
Забытый ЕСТЬNULL перед ПОДСТРОКА — вся склеенная строка превращается в NULL.
05
Сравнение преобразованной строки без учёта лидирующих нулей и пробелов — соединение возвращает пустой результат.

Альтернатива: преобразование после выполнения запроса

Часто преобразовывать число в строку внутри запроса вообще не нужно. Если цель — вывести значение в отчёт, табличный документ или сообщение, запрос должен вернуть число как есть, а форматирование выполняется встроенным языком: Строка(Выборка.Количество) или Формат(Выборка.Сумма, "ЧДЦ=2").

Такой подход даёт полный контроль над форматом: разделители разрядов, число знаков после запятой, подавление нулевых значений. В СКД аналогичную задачу решает поле «Оформление» или вычисляемое поле на встроенном языке — без приёмов с ПОДСТРОКА в тексте запроса.

Итог

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

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

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

Можно ли в запросе 1С использовать функцию Строка()?

Нет. Функции Строка() и Формат() существуют только во встроенном языке. В тексте запроса их вызов приведёт к ошибке «Функция не найдена». Внутри запроса используйте ПОДСТРОКА для неявного приведения числа к строке.

Почему ПОДСТРОКА обрезает моё число?

Третий параметр функции задаёт максимальную длину результата. Если число в строковом виде длиннее (например, содержит дробную часть и разделители разрядов), оно усекается. Укажите длину с запасом — для большинства чисел достаточно 15–20 символов.

Как соединить таблицы, если в одной код числовой, а в другой строковый?

Приведите числовую сторону к строке через ПОДСТРОКА прямо в условии соединения. Предварительно сравните форматы: лидирующие нули, префиксы и пробелы в строковом поле должны быть воспроизведены в преобразованном значении, иначе соединение не найдёт совпадений.

Работает ли ВЫРАЗИТЬ(Число КАК СТРОКА) в запросе?

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

Как преобразовать строку в число в запросе?

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

Почему после склейки числа с текстом получается пустая строка?

Скорее всего, числовое поле содержит NULL — например, из-за левого соединения без совпадений. Любая операция с NULL возвращает NULL. Оберните поле в ЕСТЬNULL(Поле, 0) до применения ПОДСТРОКА.