Разработка и Конфигурация · 10 мин
1С запрос: число как строка — способы преобразования
Как в запросе 1С преобразовать число в строку: приём через ПОДСТРОКА, ВЫРАЗИТЬ, соединение со строковыми полями, типичные ошибки и готовые примеры кода.
В языке запросов 1С нет функции Строка() или Формат(), поэтому привычное для встроенного языка преобразование числа в строку напрямую недоступно. Когда в запросе нужно сравнить числовое поле со строкой, склеить число с текстом или вывести число в составе строкового представления, приходится использовать обходные приёмы.
Самый распространённый рабочий приём — воспользоваться тем, что функция ПОДСТРОКА неявно приводит свой первый аргумент к строковому типу. Передав туда числовое поле, вы получаете строковое представление числа, которое дальше можно объединять с текстом через оператор + или сравнивать с другими строками.
Ниже разобраны основные сценарии: преобразование через ПОДСТРОКА, соединение числового и строкового полей, приведение типов через ВЫРАЗИТЬ, ограничения приёма и типичные ошибки, которые приводят к ошибкам СУБД или неверным результатам.
Почему в запросе 1С нельзя просто написать Строка(Число)
Язык запросов 1С — это самостоятельный язык, ориентированный на выборку данных, а не на их форматирование. В нём отсутствуют функции Строка(), Формат(), Число() из встроенного языка. Попытка использовать их в тексте запроса приведёт к ошибке «Функция не найдена» ещё на этапе проверки запроса.
Преобразование типов в запросе возможно только двумя путями: явным — через ВЫРАЗИТЬ(... КАК ...) и неявным — когда функция или операция сама приводит аргумент к нужному типу. При этом ВЫРАЗИТЬ с приведением числа к строке работает не на всех СУБД одинаково, поэтому универсальным остаётся приём с ПОДСТРОКА.
Важно понимать: преобразование числа в строку в запросе почти всегда означает, что по этому полю нельзя будет корректно сортировать и сравнивать как числа. Строка «10» меньше строки «2» при лексикографическом сравнении. Если цель — только вывод в отчёт, преобразование допустимо; если цель — фильтрация или сортировка, лучше оставить числовой тип.
Основной приём: ПОДСТРОКА для приведения числа к строке
Функция ПОДСТРОКА(Выражение, НачальнаяПозиция, Длина) ожидает строку в первом аргументе. Когда туда передаётся числовое поле, платформа неявно преобразует его в строковое представление, и результат функции уже имеет строковый тип. Это стандартный, широко используемый приём.
ВЫБРАТЬ
ПОДСТРОКА(Товары.Количество, 1, 12) КАК КоличествоСтрокой
ИЗ
Справочник.Товары КАК Товары
Третий параметр — длину — нужно указывать с запасом, чтобы число не обрезалось. Для целых чисел обычно достаточно 10–12 символов, для чисел с дробной частью учитывайте разрядность: целая часть, разделитель и дробная часть вместе могут занять больше символов. Если указать слишком малую длину, получите усечённое значение без какого-либо предупреждения.
Обратите внимание: строковое представление числа зависит от региональных настроек сервера СУБД. Дробный разделитель может быть точкой или запятой, а в некоторых случаях в строку попадают разделители групп разрядов. Если результат используется для сравнения, проверьте фактический формат на тестовых данных.
ВЫБРАТЬ
ПОДСТРОКА(Док.Номер, 1, 11) КАК НомерСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокСклейка числа с текстом в запросе
Типичная задача — сформировать в запросе строку вида «Заказ № 123 от покупателя». Оператор + в языке запросов требует, чтобы оба операнда были строками, поэтому числовую часть сначала приводят через ПОДСТРОКА.
ВЫБРАТЬ
"Заказ № " + ПОДСТРОКА(Заказы.Номер, 1, 11) КАК Представление
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Если в конкатенации участвует несколько числовых полей, каждое из них приводится отдельно. Пропуск приведения хотя бы одного операнда вызовет ошибку несовместимости типов при выполнении запроса — на этапе конструктора такая ошибка не всегда очевидна.
Для полей, которые могут содержать NULL (например, при левом соединении), применяйте ЕСТЬNULL до преобразования: ПОДСТРОКА(ЕСТЬNULL(Таблица.Количество, 0), 1, 12). Иначе вместо строки получите NULL, и вся склеенная строка тоже станет NULL.
ВЫРАЗИТЬ и приведение типов: когда это работает
Конструкция ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)) формально существует в языке запросов, но её поведение при приведении числа к строке зависит от используемой СУБД. На файловой базе и в ряде клиент-серверных конфигураций такое выражение может вернуть ошибку или неожиданный результат.
Надёжное применение ВЫРАЗИТЬ — это уточнение типа составного поля (например, привести составную дату к дате) или сужение длины строки. Для задачи «число как строка» полагаться на ВЫРАЗИТЬ не стоит — используйте ПОДСТРОКА как переносимый вариант.
Обратное преобразование — строки в число — в языке запросов вообще не предусмотрено штатными средствами. Если нужно сравнить строковый код с числом, правильный путь — привести число к строке через ПОДСТРОКА и сравнивать строки, либо выполнить преобразование уже на стороне встроенного языка после выгрузки результата.
Сравнение вариантов
Универсальный переносимый приём, работает на всех СУБД. Ограничение — нужно задавать длину с запасом и учитывать региональный формат числа.
Выглядит очевиднее, но поведение зависит от СУБД и может дать ошибку. Подходит только после проверки на целевой базе.
Запрос возвращает число, а Строка() или Формат() применяются в коде. Самый управляемый вариант для отчётов, но требует обхода выборки.
Соединение таблиц по числу и строке
На практике приём нужен чаще всего для соединений: в одной таблице код хранится как число, в другой — как строка. Условие соединения записывают, приводя числовую сторону к строке.
ВЫБРАТЬ
Заказы.Ссылка,
Оплаты.Сумма
ИЗ
Документ.ЗаказПокупателя КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оплаты КАК Оплаты
ПО Оплаты.НомерЗаказа = ПОДСТРОКА(Заказы.Номер, 1, 11)
Здесь критично совпадение форматов: если строковое поле содержит лидирующие нули, префиксы или пробелы, а число преобразуется без них, соединение не найдёт ни одной пары. Перед написанием запроса посмотрите реальные значения обоих полей в консоли запросов и при необходимости дополните строку нулями через конкатенацию и ПОДСТРОКА.
Проверка результата и типичные ошибки
После написания запроса убедитесь, что преобразование дало именно тот результат, который ожидался. Быстрый способ — выполнить запрос в консоли и посмотреть тип колонки: у строкового поля значения выравниваются влево и не суммируются при группировке.
Как проверить результат
В консоли запросов колонка отображается как строка, значения выровнены влево
Колонка осталась числовой — приведение не сработало
Все числа отображаются целиком, включая дробную часть
Значения обрезаны — увеличьте третий параметр ПОДСТРОКА
Строки обеих таблиц сопоставились, нет массовых NULL
Сплошные NULL — не совпадают форматы (лидирующие нули, префиксы)
NULL заменён через ЕСТЬNULL до преобразования
В склеенных строках появляются пустые значения
Альтернатива: преобразование после выполнения запроса
Часто преобразовывать число в строку внутри запроса вообще не нужно. Если цель — вывести значение в отчёт, табличный документ или сообщение, запрос должен вернуть число как есть, а форматирование выполняется встроенным языком: Строка(Выборка.Количество) или Формат(Выборка.Сумма, "ЧДЦ=2").
Такой подход даёт полный контроль над форматом: разделители разрядов, число знаков после запятой, подавление нулевых значений. В СКД аналогичную задачу решает поле «Оформление» или вычисляемое поле на встроенном языке — без приёмов с ПОДСТРОКА в тексте запроса.
Что важно запомнить
В языке запросов 1С число приводят к строке через ПОДСТРОКА(Поле, 1, N) с запасом по длине. ВЫРАЗИТЬ к СТРОКА зависит от СУБД и ненадёжен. Для соединений проверяйте совпадение форматов, для отчётов предпочтительнее преобразование после выгрузки результата.
Частые вопросы
Можно ли в запросе 1С использовать функцию Строка()?
Нет. Функции Строка() и Формат() существуют только во встроенном языке. В тексте запроса их вызов приведёт к ошибке «Функция не найдена». Внутри запроса используйте ПОДСТРОКА для неявного приведения числа к строке.
Почему ПОДСТРОКА обрезает моё число?
Третий параметр функции задаёт максимальную длину результата. Если число в строковом виде длиннее (например, содержит дробную часть и разделители разрядов), оно усекается. Укажите длину с запасом — для большинства чисел достаточно 15–20 символов.
Как соединить таблицы, если в одной код числовой, а в другой строковый?
Приведите числовую сторону к строке через ПОДСТРОКА прямо в условии соединения. Предварительно сравните форматы: лидирующие нули, префиксы и пробелы в строковом поле должны быть воспроизведены в преобразованном значении, иначе соединение не найдёт совпадений.
Работает ли ВЫРАЗИТЬ(Число КАК СТРОКА) в запросе?
Поведение этой конструкции зависит от СУБД и версии платформы: на одних базах она выполняется, на других возвращает ошибку. Для переносимого кода надёжнее приём с ПОДСТРОКА, который работает везде одинаково.
Как преобразовать строку в число в запросе?
Штатной функции для этого в языке запросов нет. Варианты: привести противоположную сторону сравнения к строке через ПОДСТРОКА и сравнивать строки, либо выполнить преобразование во встроенном языке после выгрузки результата запроса.
Почему после склейки числа с текстом получается пустая строка?
Скорее всего, числовое поле содержит NULL — например, из-за левого соединения без совпадений. Любая операция с NULL возвращает NULL. Оберните поле в ЕСТЬNULL(Поле, 0) до применения ПОДСТРОКА.