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

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

Выразить как строка в запросе 1С: синтаксис, примеры и ограничения

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

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

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

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

Синтаксис оператора ВЫРАЗИТЬ для строкового типа

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

Типичный пример — уточнение составного поля. Реквизит «Комментарий» может иметь составной тип, и чтобы отобрать только строковые значения и работать с ними как со строкой, пишут:

ВЫБРАТЬ

ВЫРАЗИТЬ(Документ.Комментарий КАК СТРОКА(200)) КАК Комментарий

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

Документ.Комментарий ССЫЛКА Документ.РеализацияТоваровУслуг = ЛОЖЬ

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

Уточнение составного типа поля

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

Приведение работает по простому правилу: если фактическое значение поля соответствует указанному типу, оно возвращается как есть; если тип другой — результатом будет NULL. Это важно учитывать в условиях: сравнение NULL с чем-либо даёт не ИСТИНУ и не ЛОЖЬ, а неопределённость, поэтому строки с несовпадающим типом просто выпадут из выборки.

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

Усечение длины строки для группировки и объединения

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

Типовой приём выглядит так:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(150)) КАК ОписаниеКратко,

СУММА(Товары.Сумма) КАК Сумма

ИЗ

Документ.Поступление.Товары КАК Товары

СГРУППИРОВАТЬ ПО

ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(150))

Длину выбирайте по смыслу данных: для наименований обычно достаточно 100–150 символов, для артикулов и кодов — по фактической размерности. Занижать длину опасно: два разных значения, совпадающие в первых N символах, после усечения сольются в одну группу, и итоги будут искажены без какой-либо ошибки. Перед выбором длины полезно проверить максимальную реальную длину значений функцией ДЛИНАСТРОКИ — она, кстати, в запросах недоступна, поэтому проверку делают выборкой с упорядочиванием по убыванию длины через временную таблицу или встроенным языком.

Почему нельзя преобразовать число или ссылку в строку напрямую

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

Для получения строкового представления числа в запросе используют обходные приёмы. Самый распространённый — соединение с заранее подготовленной таблицей цифр и сборка строки посимвольно, но это громоздко. Практичнее в большинстве случаев получить число как есть и преобразовать его уже во встроенном языке при обходе выборки: Строка(Выборка.Сумма) или Формат(Выборка.Сумма, "ЧГ=0").

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

Способы получить строку в запросе и вне его

ВЫРАЗИТЬ(Поле КАК СТРОКА(N))

Уточнение составного типа и усечение длины. Не конвертирует числа и ссылки.

ПРЕДСТАВЛЕНИЕ(Ссылка)

Строковое представление объекта ссылочного типа прямо в запросе. Не подходит для чисел и произвольного форматирования.

Обращение через точку (Ссылка.Наименование)

Получение конкретного строкового реквизита объекта. Работает только для ссылочных типов, порождает неявное соединение.

Строка() / Формат() во встроенном языке

Преобразование после выполнения запроса при обходе выборки. Универсально, но требует постобработки.

Использование ВЫРАЗИТЬ КАК СТРОКА в параметрах и временных таблицах

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

ВЫБРАТЬ

ВЫРАЗИТЬ(ТаблицаПараметр.Артикул КАК СТРОКА(30)) КАК Артикул

ПОМЕСТИТЬ ВТ_Артикулы

ИЗ

&ТаблицаПараметр КАК ТаблицаПараметр

Тот же приём применяют при объединении запросов: если в одной части ОБЪЕДИНИТЬ поле строковое, а в другой — составное, приведение обеих частей к СТРОКА(N) одинаковой длины убирает неоднозначность типа результирующей колонки. Несовпадение длин в объединении — частая причина ошибки «Типы полей не совпадают».

В параметрах условий приведение обычно не требуется — параметр уже имеет конкретный тип. Но если параметр может принимать значения разных типов (например, массив), убедитесь, что тип параметра совместим с полем сравнения, иначе сравнение молча не сработает или запрос завершится ошибкой.

Порядок действий при приведении к строке
  1. 1
    Определите тип исходного поля: примитивное строковое, составное или несовместимое (число, ссылка).
  2. 2
    Для составного поля напишите ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) с длиной, достаточной для реальных значений.
  3. 3
    Для поля неограниченной длины выберите длину по максимальному реальному значению с запасом.
  4. 4
    Для числа или ссылки замените подход: ПРЕДСТАВЛЕНИЕ(), обращение через точку или преобразование во встроенном языке.
  5. 5
    Выполните запрос в консоли запросов и проверьте, что в результате нет неожиданных NULL и усечённых значений.

Типичные ошибки и как их проверить

Первая ошибка — попытка привести несовместимый тип. Симптом: ошибка запроса «Несовместимые типы ВЫРАЗИТЬ» при выполнении или NULL во всех строках результата. Лечится сменой подхода: ПРЕДСТАВЛЕНИЕ() для ссылок, постобработка для чисел.

Вторая ошибка — заниженная длина. Симптом: в отчёте появляются «склеенные» группы, итоги завышены, строки с разными исходными значениями объединены. Проверка: сравните количество групп при длине 50 и при длине 200 — если число групп выросло, усечение склеивало значения.

Третья ошибка — забытый ЕСТЬNULL. После приведения составного поля часть строк содержит NULL, и конкатенация или вывод в отчёт показывает пустоту там, где разработчик ожидал значение. Оберните выражение: ЕСТЬNULL(ВЫРАЗИТЬ(Поле КАК СТРОКА(200)), "").

Типичные ошибки
01
ВЫРАЗИТЬ(Число КАК СТРОКА) — ошибка несовместимых типов; числа преобразуют через Формат() во встроенном языке.
02
Слишком маленькая длина — разные значения склеиваются при группировке, итоги искажаются без ошибки.
03
Отсутствие ЕСТЬNULL — значения нестрокового типа превращаются в NULL и пропадают из выборки.
04
Разная длина строк в частях ОБЪЕДИНИТЬ — ошибка несовпадения типов колонок.
05
Группировка по полю неограниченной длины без приведения — ошибка исполнения запроса.

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

После написания запроса проверьте его в консоли запросов на реальных данных, а не только на тестовой копии с парой документов. Обратите внимание на три вещи: отсутствие NULL там, где ожидаются значения; отсутствие обрезанных строк (видно по характерному «обрыву» на границе длины); совпадение количества строк и итогов с контрольной выборкой без приведения типа.

Для составных полей полезно выполнить вспомогательный запрос с ТИПЗНАЧЕНИЯ(Поле), чтобы понять, какие типы реально встречаются в данных. Если в поле, которое вы приводите к строке, оказались ссылки или числа, решите осознанно: исключить их условием, обработать отдельно или вывести через ПРЕДСТАВЛЕНИЕ.

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

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

Значения в результирующей колонке
Норма

Строки полные, без обрыва на границе заданной длины

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

Строки одинаково обрезаны на N символах — длина занижена

Наличие NULL
Норма

NULL только там, где исходное поле пустое или другого типа

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

NULL во всех строках — приведён несовместимый тип

Количество групп при группировке
Норма

Совпадает с числом различных полных значений

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

Групп меньше, чем различных значений — усечение склеивает данные

FAQ

Можно ли в запросе 1С преобразовать число в строку?

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

Что вернёт ВЫРАЗИТЬ(Поле КАК СТРОКА(100)), если в поле хранится ссылка?

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

Какую длину указывать в СТРОКА(N)?

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

Почему запрос с ОБЪЕДИНИТЬ ругается на типы после ВЫРАЗИТЬ?

В объединении типы и размерности соответствующих колонок всех частей должны совпадать. Если в одной части СТРОКА(100), а в другой СТРОКА(150), возникнет ошибка. Приведите обе части к одинаковой длине — берите максимальную из необходимых.

Работает ли ВЫРАЗИТЬ КАК СТРОКА в СКД и динамических списках?

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

Чем ВЫРАЗИТЬ отличается от ПРЕДСТАВЛЕНИЕ?

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

Итог

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

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