Разработка и Конфигурация · 12 мин
Как преобразовать число в строку в запросе 1С
Как число преобразовать в строку в запросе 1С: ПРЕДСТАВЛЕНИЕ, ПОДСТРОКА, конкатенация, обходные приёмы, типичные ошибки и проверка результата.
В языке запросов 1С нет прямой функции преобразования числа в строку наподобие Строка() из встроенного языка. Это ограничение регулярно ставит в тупик разработчиков, которым нужно склеить числовое поле с текстом, сравнить число со строковым реквизитом или выгрузить значение в текстовом виде. Причина проста: запрос выполняется на стороне СУБД, а функции приведения типов в диалекте 1С намеренно сокращены — платформа стремится работать со строго типизированными данными.
Тем не менее задача решается несколькими рабочими способами: функцией ПРЕДСТАВЛЕНИЕ, приёмами с ПОДСТРОКА и конкатенацией, а также переносом преобразования на этап обработки результата запроса. Каждый вариант имеет свои ограничения по формату вывода, производительности и применимости в условиях отбора. Ниже разобраны все практические подходы с примерами кода, а также ситуации, когда преобразование лучше вовсе не делать в тексте запроса.
Почему в запросе 1С нет прямого преобразования числа в строку
Язык запросов 1С — это надстройка над SQL, и платформа транслирует конструкции запроса в команды конкретной СУБД (MS SQL, PostgreSQL, Oracle, DB2 или файловый вариант). Чтобы запрос работал одинаково на всех поддерживаемых базах, набор функций приведения типов ограничен теми, что можно единообразно оттранслировать. Функция ВЫРАЗИТЬ приводит значение только к указанному типу данных, но приведение Число → Строка через ВЫРАЗИТЬ не поддерживается: попытка написать ВЫРАЗИТЬ(Поле КАК Строка(20)) для числового поля вызовет ошибку или не даст ожидаемого результата.
Дополнительная причина — неоднозначность формата. Одно и то же число может быть представлено как «1000», «1 000», «1 000,00» или «1000.00» в зависимости от региональных настроек и требуемого вывода. Платформа оставляет выбор формата разработчику, предлагая делать финальное форматирование на уровне кода, а не запроса. Понимание этого помогает правильно выбрать место преобразования и не тратить время на поиск несуществующей функции.
Способ 1. Функция ПРЕДСТАВЛЕНИЕ — основной приём в запросе
Функция ПРЕДСТАВЛЕНИЕ возвращает строковое представление значения любого типа: числа, даты, ссылки, булево. Для числового поля результатом будет строка с числом в том виде, в каком его формирует платформа. Это самый простой способ получить строку прямо в выборке запроса.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| ПРЕДСТАВЛЕНИЕ(Номенклатура.Код) КАК КодСтрокой
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
ПРЕДСТАВЛЕНИЕ удобно использовать и для ссылочных полей, когда нужно получить наименование или номер документа строкой, не соединяя таблицы. Например, ПРЕДСТАВЛЕНИЕ(Документ.Контрагент) вернёт наименование контрагента, а ПРЕДСТАВЛЕНИЕ(Документ.Номер) — номер документа строкой. Это позволяет строить текстовые поля для печатных форм и выгрузок без дополнительных соединений.
У способа есть ограничения. Формат представления зависит от настроек платформы и не управляется из запроса: разделители групп разрядов, количество знаков после запятой выбрать нельзя. Кроме того, ПРЕДСТАВЛЕНИЕ нельзя использовать в секции ГДЕ для сравнения с параметром-строкой без дополнительных ухищрений — там оно применяется, но сравнение строк с представлением числа часто даёт неожиданные результаты из-за пробелов и разделителей.
Способ 2. Конкатенация и приёмы с ПОДСТРОКА
Второй практический приём — конкатенация числа с пустой строкой. В языке запросов 1С оператор «+» для строк выполняет склейку, и выражение вида "" + Поле в ряде случаев приводит результат к строковому виду. Однако поведение зависит от СУБД: на одних базах такая конструкция сработает, на других выдаст ошибку несовместимости типов. Полагаться на этот трюк в переносимом коде не стоит.
Более надёжный сценарий — когда строка нужна для склейки нескольких полей в одно текстовое значение. Здесь ПРЕДСТАВЛЕНИЕ комбинируется с конкатенацией:
Запрос.Текст =
"ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(Товары.Номенклатура) + "", кол-во: "" + ПРЕДСТАВЛЕНИЕ(Товары.Количество) КАК Описание
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары";
Функция ПОДСТРОКА пригодится, когда нужно отрезать часть строкового представления — например, взять первые символы номера или обрезать хвост. ПОДСТРОКА(ПРЕДСТАВЛЕНИЕ(Поле), 1, 10) вернёт первые десять символов представления. Учтите, что ПОДСТРОКА работает только со строками, поэтому сначала применяется ПРЕДСТАВЛЕНИЕ, а уже потом обрезка.
Если строка нужна только для вывода пользователю в отчёте на СКД, часто проще оставить поле числовым в запросе, а формат задать в настройках СКД на вкладке «Наборы данных» через «Оформление» поля — там доступна строка формата без всяких преобразований.
Способ 3. Преобразование после запроса при обходе выборки
Самый управляемый вариант — получить число из запроса как есть и преобразовать его в строку уже в коде. Для этого используются функции Строка() и Формат(). Строка(Число) даёт представление по умолчанию, а Формат() позволяет задать точный шаблон: количество знаков после запятой, разделители групп, лидирующие нули, подавление нулевого значения.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КоличествоСтрокой = Формат(Выборка.Количество, "ЧДЦ=2; ЧРГ= "); // "1 234,56"
НомерСНулями = Формат(Выборка.Номер, "ЧЦ=8; ЧВН=; ЧГ=0"); // "00000123"
КонецЦикла;
Ключевые параметры строки формата: ЧЦ — общая длина, ЧДЦ — число знаков дробной части, ЧРГ — символ разделителя групп (пустая строка убирает разделители), ЧГ=0 — отключает группировку разрядов, ЧВН= — выводит лидирующие нули, ЧН — строка для нулевого значения. Комбинируя их, можно получить практически любой вид числа, что невозможно средствами запроса.
Этот способ обязателен, когда результат идёт в обмен данными, CSV, XML или печатную форму со строгими требованиями к формату. Он же — единственный корректный вариант, если число должно быть строкой фиксированной длины с ведущими нулями: ПРЕДСТАВЛЕНИЕ такого не умеет в принципе.
- 1В запросе выберите числовое поле как есть, без преобразований
- 2Выполните запрос и получите выборку методом Выбрать() или Выгрузить()
- 3При обходе примените Формат(Значение, "параметры") с нужной строкой формата
- 4Проверьте результат на граничных значениях: ноль, отрицательное число, дробная часть
Сравнение способов: что выбрать в разных ситуациях
Выбор зависит от того, где будет использована строка и насколько строгие требования к её виду. Ниже — сопоставление основных вариантов по ключевым критериям.
| Способ | Управление форматом | Работает в условии ГДЕ | Типичное применение |
|---|---|---|---|
| ПРЕДСТАВЛЕНИЕ в запросе | Нет | Ограниченно, с рисками | Быстрый вывод номера, кода, ссылки строкой |
| Формат() после запроса | Полное | Не применимо | Обмены, печатные формы, фиксированная длина |
| Строка() после запроса | Нет | Не применимо | Простая склейка в сообщениях, журналах |
| Оформление поля в СКД | Полное | Не применимо | Отчёты без изменения запроса |
Общее правило: в запросе данные должны оставаться в своих типах как можно дольше. Преобразование в строку — это почти всегда задача представления, а не выборки, поэтому её правильное место — на выходе: в коде обработки результата, в настройках отчёта или в шаблоне печатной формы.
Как выбрать действие
Обратная задача: строка в число и сравнение с числовым полем
Частая парная ситуация — пользователь вводит число строкой (например, из поля ввода на форме), и нужно найти записи по этому значению. Правильный путь — преобразовать строку в число до запроса функцией Число() и передать в запрос уже числовой параметр. Попытка сравнить числовое поле со строковым параметром напрямую приведёт либо к ошибке, либо к пустому результату.
ЧисловоеЗначение = Число(СтрокаПоиска); // вызовет исключение при нечисловой строке
Запрос.УстановитьПараметр("Сумма", ЧисловоеЗначение);
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Ссылка
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Документ
|ГДЕ
| Документ.СуммаДокумента = &Сумма";
Перед вызовом Число() стоит проверить строку на корректность, потому что при нечисловом вводе функция выбрасывает исключение. Простой способ — обернуть вызов в Попытка/Исключение или предварительно очистить строку от пробелов и заменить запятую на точку, если ожидается дробное значение из пользовательского ввода.
Проверка результата и граничные случаи
После внедрения любого из способов проверьте вывод на краевых значениях: ноль, отрицательные числа, очень большие значения, дробная часть с разным числом знаков. Именно на них проявляются различия между ПРЕДСТАВЛЕНИЕ и Формат(): ноль через Формат можно заменить произвольной строкой (параметр ЧН), а отрицательные числа — вывести в скобках или с явным знаком.
Отдельно проверьте локальные настройки. Если база работает под разными региональными настройками (например, тонкий клиент на машинах с разными ОС), представление числа может отличаться — где-то разделитель дробной части точка, где-то запятая. Для обменов между системами всегда задавайте формат явно через Формат() с фиксированными параметрами, не полагаясь на представление по умолчанию.
Как проверить результат
Строка без неожиданных символов, разделители соответствуют заданному формату
Появляются неразрывные пробелы там, где формат их не предполагал
Отображается «0» или заданная через ЧН замещающая строка
Пустая строка там, где ожидался ноль
Значение округлено до двух знаков
Лишние знаки дробной части или обрезание без округления
Знак минуса или скобки согласно формату
Потеря знака или ошибка преобразования
Часто задаваемые вопросы
Можно ли в запросе 1С написать аналог функции Строка()?
Нет, прямого аналога нет. Ближайший вариант — ПРЕДСТАВЛЕНИЕ(Поле), которая возвращает строковое представление значения любого типа. Для управляемого форматирования используйте Формат() уже после выполнения запроса.
Почему ВЫРАЗИТЬ(Поле КАК Строка(20)) не работает для числа?
Функция ВЫРАЗИТЬ в языке запросов 1С предназначена для приведения составных типов к конкретному и для усечения строк до заданной длины. Приведение числа к строке через неё не поддерживается платформой — попытка завершится ошибкой запроса.
Как вывести число с лидирующими нулями, например «00000123»?
Только через Формат() в коде: Формат(Значение, "ЧЦ=8; ЧВН=; ЧГ=0"). Параметр ЧЦ задаёт общую длину, ЧВН= включает вывод ведущих нулей, ЧГ=0 отключает разделители разрядов. Средствами запроса это сделать нельзя.
Почему поиск по ПРЕДСТАВЛЕНИЕ(Поле) = &Строка ничего не находит?
Представление числа может содержать неразрывные пробелы как разделители групп разрядов, а также отличаться по числу знаков после запятой. Строка поиска редко совпадает с этим форматом. Правильное решение — преобразовать строку поиска в число через Число() и сравнивать числовые поля.
Как склеить в запросе наименование и количество в одну строку?
Используйте оператор «+» с ПРЕДСТАВЛЕНИЕ: ПРЕДСТАВЛЕНИЕ(Номенклатура) + ", кол-во: " + ПРЕДСТАВЛЕНИЕ(Количество). Каждое нестроковое поле оборачивайте в ПРЕДСТАВЛЕНИЕ, иначе получите ошибку несовместимости типов.
Что лучше для отчёта на СКД — ПРЕДСТАВЛЕНИЕ в запросе или оформление поля?
Оформление поля предпочтительнее: число остаётся числом, корректно работают итоги, сортировка и группировки, а вид настраивается строкой формата в настройках. ПРЕДСТАВЛЕНИЕ превращает поле в строку, и сортировка станет лексикографической — «10» окажется раньше «2».
Что важно запомнить
Прямого преобразования числа в строку в запросе 1С нет. В запросе используйте ПРЕДСТАВЛЕНИЕ для простого вывода, а для строгого формата — Формат() при обходе выборки. Не сравнивайте строковые представления с числами в условиях отбора и держите данные в исходных типах как можно дольше.