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

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

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

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

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

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

Синтаксис функции одинаков во всех конфигурациях на платформе 1С:Предприятие 8, поэтому приёмы из этой статьи работают и в «Управлении торговлей», и в «Бухгалтерии», и в самописных решениях. Различия касаются только конкретных типов объектов, доступных в вашей конфигурации.

Синтаксис и общие правила функции ВЫРАЗИТЬ

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

Для чисел указываются длина и точность: ЧИСЛО(15,2) — максимум 15 знаков, из них 2 после запятой. Для строк — длина: СТРОКА(150). Для типа ДАТА можно указать состав: ДАТА, ВРЕМЯ или ДАТАВРЕМЯ. Если параметры типа не указаны, платформа применяет значения по умолчанию, что часто приводит к неожиданному усечению строк или потере дробной части.

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

Приведение чисел: точность и округление

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

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

Отдельный случай — приведение строки с числом к типу ЧИСЛО. Это работает, только если строка содержит корректное числовое представление. Пробелы, буквы и разделители тысяч приводят к NULL или ошибке. Перед таким приведением данные стоит очистить либо отфильтровать условием.

bsl
ВЫБРАТЬ
	ВЫРАЗИТЬ(Платежи.Сумма КАК ЧИСЛО(15, 2)) КАК СуммаОкругленная,
	ВЫРАЗИТЬ(Платежи.Контрагент КАК Справочник.Контрагенты) КАК Контрагент
ИЗ
	Документ.ПлатежноеПоручение КАК Платежи

Приведение строк: длина и усечение

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

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

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

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

Если реквизит имеет составной тип, приведение к конкретному ссылочному типу выполняет две задачи. Во-первых, оно позволяет обратиться через точку к реквизитам этого типа: ВЫРАЗИТЬ(Документ.Контрагент КАК Справочник.Контрагенты).ИНН. Без приведения запрос не даст выбрать ИНН, потому что поле может содержать ссылку другого вида.

Во-вторых, приведение отфильтровывает несовпадающие значения: если в поле лежит ссылка другого типа, результатом будет NULL. Это удобно использовать как мягкий фильтр — в сочетании с условием «НЕ ЕСТЬ NULL» вы получите только записи нужного вида без соединений.

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

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

Приведение дат и значения NULL

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

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

Пустые ссылки — отдельный случай. Приведение пустой ссылки к её же типу сохраняет пустую ссылку, а не NULL. Поэтому проверки «Поле ЕСТЬ NULL» и «Поле = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)» не взаимозаменяемы, и в условиях часто нужны обе.

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

Самая частая ошибка — приведение к строке без указания длины. Платформа применяет длину по умолчанию, и длинные значения молча обрезаются, что искажает группировки и соединения. Всегда указывайте длину явно и сверяйте её с реальными данными.

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

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

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

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

Проверять приведение удобнее всего в консоли запросов: выполните запрос на ограниченной выборке и сравните исходное и приведённое значения рядом. Для чисел проверьте округление на граничных значениях (0,005; 9,999), для строк — на самых длинных значениях, для составных типов — на записях с разными видами ссылок.

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

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

Маршрут решения

Как выбрать подход

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

Частые вопросы о ВЫРАЗИТЬ в 1С 8

Чем ВЫРАЗИТЬ отличается от оператора ССЫЛКА?

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

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

Не указана длина строки или она меньше реальной длины данных. Укажите длину явно, например СТРОКА(250), и проверьте максимальную длину значений пробным запросом с функцией ДЛИНАСТРОКИ.

Можно ли привести строку с текстом к числу?

Только если строка содержит корректное числовое значение без лишних символов. Буквы, пробелы и разделители приводят к NULL или ошибке выполнения. Перед приведением очистите данные или отфильтруйте некорректные значения.

Как привести поле к дате без времени?

Используйте ВЫРАЗИТЬ(Поле КАК ДАТА) — время будет отсечено, останется календарная дата. Это удобно для группировки по дням. Для обратной задачи укажите состав типа ДАТАВРЕМЯ.

Влияет ли ВЫРАЗИТЬ на скорость запроса?

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

Что вернёт ВЫРАЗИТЬ от NULL?

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

Итог

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

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