Разработка и Конфигурация · 9 мин
Выразить как в запросе 1С: как работает оператор ВЫРАЗИТЬ КАК
Как работает оператор ВЫРАЗИТЬ КАК в запросах 1С: синтаксис, приведение типов строк, чисел и ссылок, типичные ошибки и проверка результата.
Оператор ВЫРАЗИТЬ КАК в языке запросов 1С приводит значение поля к указанному типу данных. Чаще всего его применяют, чтобы убрать лишнюю длину у строки, задать точность числа или сузить составной тип ссылки до одного конкретного вида. Без этого приведения запрос может вернуть неожиданный результат: строки соединятся с «хвостами» пробелов, числа потеряют нужную разрядность, а соединение таблиц по составному полю замедлится.
Конструкция выглядит так: ВЫРАЗИТЬ(Поле КАК ТипДанных). В качестве типа указывают примитивные типы — СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО — или ссылочный тип, например Справочник.Номенклатура или Документ.РеализацияТоваровУслуг. Для строк и чисел обязательно задаются параметры: длина строки, а для числа — общая разрядность и число знаков после запятой.
Важно понимать: ВЫРАЗИТЬ не преобразует данные физически, а лишь сообщает платформе, как интерпретировать значение. Если приведение невозможно (например, строку «АБВ» к числу), результатом будет NULL. Поэтому оператор требует аккуратности: ошибка не всегда видна сразу, а проявляется уже в отчёте или при обмене данными.
Синтаксис оператора ВЫРАЗИТЬ и допустимые типы
Общая форма записи: ВЫРАЗИТЬ(<выражение> КАК <тип>). Выражением может быть поле таблицы, параметр запроса или результат другой функции. Тип записывается без кавычек, для ссылочных типов — с полным именем объекта метаданных.
Примеры корректных объявлений типов:
ВЫРАЗИТЬ(Товары.Наименование КАК СТРОКА(50))
ВЫРАЗИТЬ(Продажи.Сумма КАК ЧИСЛО(15, 2))
ВЫРАЗИТЬ(Регистр.Регистратор КАК Документ.РеализацияТоваровУслуг)
ВЫРАЗИТЬ(Параметры.ДатаНачала КАК ДАТА)
Для СТРОКИ длина указывается в скобках и обязательна: СТРОКА(100). Для ЧИСЛА задаются две цифры через запятую: общее количество разрядов и количество знаков дробной части, например ЧИСЛО(10, 3). Для ДАТЫ можно дополнительно указать состав: ДАТА, ВРЕМЯ или ДАТАВРЕМЯ — по умолчанию используется ДАТАВРЕМЯ.
Приведение строк: зачем обрезать длину и как не потерять данные
Самый частый сценарий — приведение строки неограниченной или избыточной длины к фиксированному размеру. Это нужно при объединении запросов (ОБЪЕДИНИТЬ), где типы колонок должны совпадать, при группировке по строковому полю и при выводе в СКД, где длинные строки раздувают результат.
ВЫБРАТЬ
ВЫРАЗИТЬ(Комментарий КАК СТРОКА(150)) КАК КомментарийКратко
ИЗ
Документ.ЗаказПокупателя
Главный риск здесь — безвозвратное усечение. Если в поле хранится текст длиной 300 символов, а вы привели его к СТРОКА(100), остаток будет отброшен уже на уровне запроса. Перед выбором длины проверьте фактическую максимальную длину значений в базе, например через запрос с функцией ДЛИНАСТРОКИ и МАКСИМУМ.
Обратная ситуация — приведение короткой строки к более длинной — безопасно: значения не изменятся, изменится только описание типа колонки. Это приём используют для выравнивания типов при объединении наборов данных.
Приведение чисел: разрядность, округление и NULL
Для чисел ВЫРАЗИТЬ задаёт целевую разрядность. Типичная задача — привести сумму к ЧИСЛО(15, 2), чтобы в объединении или временной таблице колонка имела строгий тип. Если исходное значение не помещается в заданную разрядность, платформа вернёт NULL, а не ошибку — и это частая причина «пропавших» сумм в отчётах.
ВЫБРАТЬ
ВЫРАЗИТЬ(СУММА(Продажи.СуммаОборот) КАК ЧИСЛО(15, 2)) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Дробная часть при приведении округляется по правилам арифметического округления до указанного числа знаков. Если нужно отбросить дробную часть без округления, ВЫРАЗИТЬ не подойдёт — используйте вычисления на встроенном языке до передачи данных в запрос.
Приведение ссылочных типов и оптимизация соединений
Когда реквизит имеет составной тип, соединение по нему заставляет СУБД проверять все возможные таблицы. Приведение ссылки к конкретному типу сужает проверку до одной таблицы и заметно ускоряет выполнение запроса, особенно на больших регистрах.
ВЫБРАТЬ
ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер КАК НомерДокумента
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК Движения
ГДЕ
Движения.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
Обратите внимание на пару приёмов в примере: условие ССЫЛКА отфильтровывает записи с «чужими» типами документов, а ВЫРАЗИТЬ позволяет обратиться к реквизиту Номер через точку. Без фильтра по типу обращение к реквизиту после приведения вернёт NULL для записей других видов — это корректное поведение, но его нужно учитывать в логике отчёта.
ВЫРАЗИТЬ в объединениях, временных таблицах и СКД
При объединении запросов через ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ платформа требует совместимости типов одноимённых колонок. Если в одном наборе колонка — СТРОКА(50), а в другом — СТРОКА(200), результат может получить непредсказуемый тип. Явное приведение обеих колонок к одному типу снимает проблему.
Во временных таблицах ВЫРАЗИТЬ фиксирует тип поля на момент помещения. Это критично, когда временная таблица затем соединяется с другими данными: совпадение типов полей соединения позволяет СУБД использовать индексы, а различие типов приводит к полному сканированию.
В схеме компоновки данных приведение типов в тексте запроса набора данных определяет тип поля отчёта. Если поле оставить составным, пользователь не сможет нормально отбирать и сортировать по нему, а вычисляемые поля и ресурсы могут вести себя непредсказуемо.
- 1Определите фактические типы и максимальные размеры значений в исходном поле
- 2Выберите целевой тип с запасом по длине или разрядности
- 3Добавьте ВЫРАЗИТЬ в запрос и, для ссылок, условие ССЫЛКА для отбора
- 4Выполните запрос на копии базы и сравните количество строк и итоги с исходным вариантом
- 5Проверьте, что в результате нет неожиданных NULL в приведённой колонке
Типичные ошибки и как их проверить
Первая ошибка — приведение к слишком короткой строке или малому числу. Симптом: обрезанные наименования, NULL вместо сумм, расхождение итогов отчёта с данными документов. Лечится увеличением параметров типа после анализа реальных значений.
Вторая ошибка — попытка привести значение к несовместимому типу, например строковый код к числу, когда в данных встречаются буквы. Результатом будет NULL для таких записей, и запрос молча «потеряет» часть данных. Перед таким приведением отфильтруйте значения или обработайте их на встроенном языке.
Третья ошибка — использование ВЫРАЗИТЬ вместо фильтра. Оператор меняет тип, но не отбирает записи; для отбора по виду документа или справочника всегда добавляйте условие ССЫЛКА или сравнение по типу.
Как проверить результат
Совпадает с запросом без приведения типов
Строк меньше — вероятно, значения превратились в NULL и отфильтровались
Тексты выводятся полностью, без обрывов
Наименования и комментарии обрезаны на границе заданной длины
Сходятся с контрольным запросом по исходным полям
Итоги занижены — часть значений не поместилась в разрядность
Ответы на частые вопросы
Чем ВЫРАЗИТЬ отличается от оператора ССЫЛКА?
ВЫРАЗИТЬ меняет тип значения поля и позволяет обращаться к реквизитам конкретного объекта через точку. ССЫЛКА — это логический оператор проверки типа, который возвращает Истина или Ложь и используется только для отбора записей в условии ГДЕ. На практике их применяют вместе: ССЫЛКА фильтрует, ВЫРАЗИТЬ даёт доступ к реквизитам.
Что будет, если привести строку с буквами к числу?
Запрос не выдаст ошибку, но для таких значений результатом приведения будет NULL. Если приведение стоит в списке полей, вы просто увидите пустые значения; если оно участвует в соединении или условии — записи могут исчезнуть из результата. Перед приведением очищайте данные или отбирайте только числовые значения.
Можно ли привести значение к типу перечисления?
Да, ссылочные типы перечислений поддерживаются: ВЫРАЗИТЬ(Поле КАК Перечисление.СтавкиНДС). Это полезно, когда поле имеет составной тип или получено из строкового представления через ссылку. Для произвольной строки приведение к перечислению напрямую не сработает — сначала нужно получить ссылку.
Нужно ли указывать длину для СТРОКА при приведении?
Да, длина обязательна: запись СТРОКА без параметров в операторе ВЫРАЗИТЬ вызовет ошибку синтаксиса. Указывайте длину с запасом относительно реальных данных, чтобы избежать усечения значений.
Почему после приведения типа обращение к реквизиту возвращает NULL?
Потому что часть записей относится к другому виду объекта, чем указано в ВЫРАЗИТЬ. Для них приведённое поле равно NULL, и любой реквизит, взятый через точку, тоже будет NULL. Добавьте в условие запроса отбор Поле ССЫЛКА НужныйТип, чтобы оставить только совместимые записи.
Ускоряет ли ВЫРАЗИТЬ выполнение запроса?
Само по себе приведение не ускоряет запрос, но сужение составного типа до одного вида позволяет СУБД обращаться к одной таблице вместо нескольких и эффективнее использовать индексы при соединениях. На больших регистрах с составными измерениями выигрыш может быть заметным, на малых данных разница незначительна.
Что важно запомнить
ВЫРАЗИТЬ КАК приводит поле запроса к нужному типу: обязательно задавайте длину строки и разрядность числа с запасом, сочетайте приведение ссылок с условием ССЫЛКА и проверяйте результат на NULL и расхождение итогов — оператор не сообщает об ошибках приведения, а молча возвращает NULL.