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

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

ВЫРАЗИТЬ в запросе 1С 8: как приводить типы полей правильно

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

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

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

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

Синтаксис и допустимые типы данных

Общий вид конструкции: ВЫРАЗИТЬ(<выражение> КАК <тип>). В качестве выражения может выступать поле таблицы, параметр, вложенная функция или литерал. Тип указывается с параметрами, если они есть у данного типа:

  • СТРОКА(длина) — строка фиксированной максимальной длины, например СТРОКА(100);
  • ЧИСЛО(длина, точность) — число с заданным количеством разрядов и знаков после запятой, например ЧИСЛО(15, 2);
  • ДАТА — приведение к типу «дата»;
  • БУЛЕВО — приведение к логическому типу;
  • Ссылочные типы — например, Справочник.Номенклатура или Документ.РеализацияТоваровУслуг.

Пример простого запроса с приведением строки:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.НаименованиеПолное КАК СТРОКА(150)) КАК Наименование

ИЗ

Справочник.Номенклатура КАК Товары

Важно понимать: ВЫРАЗИТЬ не преобразует данные физически, а лишь задаёт тип результата на уровне выборки. Если значение невозможно интерпретировать как указанный тип (например, строка «АБВ» приводится к числу), результатом будет значение по умолчанию для этого типа — ноль, пустая строка или пустая дата, а не ошибка выполнения.

Обрезка строк неограниченной длины

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

Решение — привести поле к строке конкретной длины, достаточной для задачи:

ВЫБРАТЬ

ВЫРАЗИТЬ(Задачи.Описание КАК СТРОКА(200)) КАК Описание,

КОЛИЧЕСТВО(*) КАК Количество

ИЗ

Задача.ЗадачиИсполнителя КАК Задачи

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

ВЫРАЗИТЬ(Задачи.Описание КАК СТРОКА(200))

Длину выбирайте осознанно. Если реальные значения длиннее указанного предела, строки будут обрезаны, и разные значения могут «склеиться» в одну группу. Для соединений и группировок обычно достаточно 100–200 символов, но проверяйте фактические данные.

Приведение чисел и округление в запросе

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

ВЫБРАТЬ

Продажи.Номенклатура,

ВЫРАЗИТЬ(Продажи.СуммаОборот КАК ЧИСЛО(15, 2)) КАК Сумма,

ВЫРАЗИТЬ(Продажи.КоличествоОборот КАК ЧИСЛО(10, 0)) КАК Количество

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

Ещё одна практическая задача — избавление от отрицательной разрядности. Иногда в результате вычислений платформа возвращает число с отрицательной точностью (округление до десятков или сотен), и при выводе в отчёт или передаче в СКД это приводит к неожиданным значениям. Явное приведение к ЧИСЛО(15, 2) фиксирует тип и убирает эту проблему.

Учитывайте ограничение: суммарная длина числа в 1С ограничена 32 разрядами, а если указать слишком малую длину, значение может быть обрезано или округлено сильнее, чем ожидалось. Для денежных сумм стандарт де-факто — ЧИСЛО(15, 2).

Работа с составными типами и ссылками

Когда реквизит имеет составной тип, платформа хранит значения разных видов в одном поле. Прямое сравнение такого поля со значением конкретного типа работает не всегда корректно, а обращение к реквизитам через точку возможно только после уточнения типа. ВЫРАЗИТЬ решает обе задачи:

ВЫБРАТЬ

ВЫРАЗИТЬ(Расчеты.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер КАК НомерДокумента

ИЗ

РегистрНакопления.РасчетыСКлиентами КАК Расчеты

ГДЕ

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

Здесь сначала условие ССЫЛКА отбирает только записи с нужным типом регистратора, а ВЫРАЗИТЬ позволяет обратиться к реквизиту «Номер» этого документа. Без приведения типа конструктор запроса не даст выбрать реквизит через точку, потому что поле может содержать ссылки на разные документы.

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

Приведение дат и особые случаи

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

Также ВЫРАЗИТЬ применяют к параметрам запроса. Если параметр передаётся как значение неопределённого типа (например, из списка значений или массива), явное приведение помогает платформе правильно построить план запроса: ГДЕ Таб.Ссылка = ВЫРАЗИТЬ(&Ссылка КАК Документ.ЗаказКлиента).

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

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

Типичные ошибки и ограничения

Первая распространённая ошибка — попытка привести поле к типу, которого нет среди допустимых для языка запросов. Например, привести к ХранилищуЗначения или к типу «ТаблицаЗначений» нельзя. Перечень допустимых типов ограничен: примитивные типы и ссылочные типы конфигурации.

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

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

Наконец, не стоит применять ВЫРАЗИТЬ «на всякий случай» к полям, у которых тип уже корректный. Лишние преобразования усложняют чтение запроса и добавляют вычислительную нагрузку без пользы.

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

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

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

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

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

Сравнение подходов

ВЫРАЗИТЬ в запросе

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

Обработка в коде после запроса

Гибкое округление и форматирование любой логикой. Ограничение: не помогает для группировок и соединений, требует обхода выборки.

Настройки СКД

Форматирование полей для отчётов без изменения запроса. Ограничение: влияет только на отображение, а не на логику выборки.

Часто задаваемые вопросы

Можно ли использовать ВЫРАЗИТЬ в условии ГДЕ?

Да, конструкция допустима в секции ГДЕ, в соединениях и в условиях виртуальных таблиц. Однако применение к индексированному полю в условии может отключить использование индекса, поэтому на больших таблицах предпочтительнее приводить тип параметра, а не поля таблицы.

Что произойдёт, если строка длиннее указанной в ВЫРАЗИТЬ?

Значение будет обрезано до указанной длины без каких-либо сообщений об ошибке. Это значит, что два разных длинных значения с одинаковым началом станут одинаковыми в результате, что критично для группировок и соединений.

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

Это функции с разным назначением. ВЫРАЗИТЬ меняет тип значения, а ЕСТЬNULL заменяет NULL на указанное значение. Их часто комбинируют: сначала приводят тип поля, затем подставляют значение по умолчанию вместо NULL.

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

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

Как привести составное поле к одному из нескольких ссылочных типов?

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

Почему после ВЫРАЗИТЬ к числу получаю ноль вместо значения?

Если исходное значение невозможно интерпретировать как число (например, строка с буквами или NULL), результатом будет ноль. Проверьте исходные данные и добавьте ЕСТЬNULL или фильтрацию некорректных значений.

Итог

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

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