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