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

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

ВЫРАЗИТЬ в запросе 1С: как привести значение к определяемому типу

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

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

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

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

Зачем нужна функция ВЫРАЗИТЬ и как она устроена

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

Формально запись выглядит так:

ВЫБРАТЬ

ВЫРАЗИТЬ(Таблица.Комментарий КАК СТРОКА(100)) КАК КомментарийКраткий

ИЗ

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

Здесь неограниченная строка реквизита «Комментарий» усекается до 100 символов. Если исходное значение длиннее, лишние символы отсекаются без ошибки. Если короче — значение возвращается как есть, без дополнения пробелами.

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

Усечение строк до заданной длины

Самый частый сценарий — приведение строки неограниченной длины к строке фиксированной длины. Это необходимо, когда результат запроса участвует в группировке, соединении или передаётся в механизм, требующий типизированной строки (например, в СКД при объединении наборов данных).

ВЫБРАТЬ

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

ИЗ

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

Обратите внимание на два ограничения. Во-первых, длина указывается целым положительным числом, параметр запроса в качестве длины подставить нельзя. Во-вторых, если поле уже имеет тип «Строка(50)», приведение к «Строка(150)» не расширит его — ВЫРАЗИТЬ только сужает, а не увеличивает фактическую длину хранимых данных.

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

Приведение чисел: разрядность и точность

Для чисел указываются общая разрядность и количество знаков после запятой: ВЫРАЗИТЬ(Сумма КАК ЧИСЛО(15, 2)). Это применяют, когда результат арифметического выражения получает слишком большую точность, а дальше значение нужно сравнивать, суммировать или выводить.

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.Количество * Продажи.Цена КАК ЧИСЛО(15, 2)) КАК Сумма

ИЗ

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

Если результат вычисления не помещается в указанную разрядность, значение усекается по правилам платформы, что может привести к потере значимых разрядов. Поэтому разрядность выбирайте с запасом относительно реальных данных, а точность — соответствующей учётным требованиям (для денежных сумм обычно 2 знака).

Приведение числа к Число(1) или подобным экстремально малым разрядностям — частая скрытая ошибка: внешне запрос работает, но все значения превращаются в 0 или 1. Всегда проверяйте результат на реальных данных с типичными и предельными значениями.

Приведение составных полей к ссылочному типу

Составные поля — реквизиты, которые могут хранить ссылки на разные объекты (например, поле «Регистратор» регистра или реквизит «Основание»). Чтобы обратиться к реквизиту конкретного объекта через точку, поле нужно предварительно привести к этому типу.

ВЫБРАТЬ

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

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

ГДЕ

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

Для строк, где регистратор — документ другого вида, результат выражения будет NULL. Поэтому такое приведение почти всегда сочетают с условием ССЫЛКА или соединением по конкретной таблице.

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

Сравнение значений разных типов и работа с NULL

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Спр

ПО ВЫРАЗИТЬ(Спр.Артикул КАК СТРОКА(25)) = ВЫРАЗИТЬ(Заказы.АртикулСтрокой КАК СТРОКА(25))

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

Ещё один сценарий — приведение параметра запроса. Если параметр объявлен как неопределённый тип, а в запросе сравнивается с типизированным полем, иногда помогает явное приведение: ВЫРАЗИТЬ(&Параметр КАК Справочник.Номенклатура). Это делает намерение явным и упрощает анализ запроса платформой.

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

Производительность и ограничения функции

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

Правила разумного применения:

  • в списке выборки — применяйте свободно, если это упрощает дальнейшую обработку результата;
  • в условиях отбора — сначала попробуйте привести тип на стороне параметра (передать параметр уже нужного типа), а не поля таблицы;
  • в соединениях — по возможности приводите поле меньшей таблицы, а не большой;
  • после изменения запроса проверьте время выполнения на данных, близких к рабочим объёмам.

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

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

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

Длина строк после ВЫРАЗИТЬ КАК СТРОКА(N)
Норма

Значения не длиннее N, осмысленные данные не обрезаны посередине

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

Ключевые значения обрезаны и перестали различаться

Приведение составного поля
Норма

Для строк нужного типа — значение реквизита, для остальных — NULL, и это учтено в логике

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

NULL попадает в соединения и итоги, искажая результат

Скорость запроса после добавления ВЫРАЗИТЬ в условие
Норма

Время выполнения сопоставимо с прежним

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

Запрос стал работать заметно дольше — вероятно, отключился индекс

Порядок действий при добавлении приведения типа

Чтобы не сломать работающий запрос, вносите ВЫРАЗИТЬ последовательно и проверяйте каждый шаг.

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

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

Итог

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

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

Частые вопросы

Можно ли через ВЫРАЗИТЬ преобразовать строку в число?

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

Почему после ВЫРАЗИТЬ к ссылочному типу поле стало пустым?

Для строк, где фактическое значение имеет другой ссылочный тип, результат приведения — NULL. Это нормальное поведение. Отфильтруйте нужные записи условием ССЫЛКА или используйте соединение с таблицей конкретного объекта.

Можно ли передать длину строки или разрядность числа параметром?

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

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

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

Работает ли ВЫРАЗИТЬ в запросах к виртуальным таблицам регистров?

Да, функция применима к полям любых таблиц, включая виртуальные. Но к параметрам виртуальной таблицы (условиям в скобках) приведение применять нужно с осторожностью: оно может повлиять на то, как платформа построит обращение к физическим таблицам.

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

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