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