Разработка и Конфигурация · 10 мин
1С запрос: ВЫРАЗИТЬ КАК СТРОКА и ошибка несовместимых типов
Как использовать ВЫРАЗИТЬ КАК СТРОКА в запросах 1С, почему возникает ошибка несовместимых типов и как её исправить: примеры кода, ограничения и типичные ошибки.
Оператор ВЫРАЗИТЬ в языке запросов 1С позволяет привести значение поля к нужному типу, в том числе к строке: ВЫРАЗИТЬ(Поле КАК СТРОКА(100)). Однако при попытке преобразовать число, дату, булево или ссылку в строку запрос часто падает с ошибкой «Несовместимые типы ВЫРАЗИТЬ» либо возвращает неожиданный результат. Причина в том, что ВЫРАЗИТЬ в 1С — это не функция преобразования значения, а оператор уточнения типа: он работает только тогда, когда исходное значение уже совместимо с целевым типом.
На практике это означает: ВЫРАЗИТЬ КАК СТРОКА корректно работает со строковыми полями (срезает длину, убирает избыточную размерность), но не превращает число 150 в строку «150» и не форматирует дату. Для таких задач нужны другие приёмы — ПОДСТРОКА, представления ссылок, вычисляемые поля на уровне СКД или обработка результата запроса на встроенном языке.
Как работает ВЫРАЗИТЬ в языке запросов 1С
Оператор ВЫРАЗИТЬ предназначен для двух задач: уточнения типа поля составного типа и изменения параметров строки (длины) или числа (разрядности). Синтаксис: ВЫРАЗИТЬ(Выражение КАК СТРОКА(Длина)), ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(15, 2)), ВЫРАЗИТЬ(Выражение КАК Справочник.Номенклатура).
Ключевой момент: ВЫРАЗИТЬ не выполняет преобразование данных. Если поле хранит число, то ВЫРАЗИТЬ(Поле КАК СТРОКА(10)) не вернёт текстовое представление числа — платформа либо выдаст ошибку несовместимых типов ещё при проверке запроса, либо вернёт NULL для несовместимых значений в составном поле. Поведение зависит от того, фиксированный это тип или составной.
Почему возникает ошибка «Несовместимые типы ВЫРАЗИТЬ»
Ошибка появляется в нескольких типовых ситуациях. Первая — попытка привести примитивный тип к другому примитивному: число к строке, дату к строке, булево к строке. Язык запросов 1С не поддерживает таких преобразований, в отличие от SQL, где CAST(123 AS VARCHAR) — рабочая конструкция.
Вторая ситуация — приведение ссылочного типа к строке. Запрос вида ВЫРАЗИТЬ(Док.Ссылка КАК СТРОКА(50)) завершится ошибкой, потому что ссылка не является строкой. Третья — составное поле, в котором целевого типа нет: если реквизит объявлен как «Число или Дата», уточнение до СТРОКА также невозможно, так как строки в составе типа нет.
Четвёртый, более коварный случай — соединение или объединение запросов, где в одной части поле строковое, а в другой — числовое. Ошибка несовместимых типов возникает уже не в самом ВЫРАЗИТЬ, а при ОБЪЕДИНИТЬ или сравнении полей разных типов, и разработчик ошибочно пытается «вылечить» её приведением к строке.
Когда ВЫРАЗИТЬ КАК СТРОКА работает правильно
Легальные сценарии использования оператора со строковым типом ограничены, но важны. Первый — усечение строки неограниченной длины: ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(100)). Это необходимо, потому что строки неограниченной длины нельзя использовать в группировках, соединениях, сравнениях и индексах временных таблиц.
Второй сценарий — уточнение составного поля, в котором строка действительно присутствует. Например, реквизит типа «Строка(50) или Справочник.Контрагенты» можно уточнить как ВЫРАЗИТЬ(Поле КАК СТРОКА(50)) — для строковых значений вернётся строка, для ссылок — NULL.
Третий сценарий — приведение строки к меньшей длине для оптимизации: при помещении данных во временную таблицу с индексом длинная строка замедляет соединение, и осознанное усечение до разумной длины ускоряет запрос.
ВЫБРАТЬ
ВЫРАЗИТЬ(Номенклатура.Описание КАК СТРОКА(100)) КАК Описание
ПОМЕСТИТЬ ВТ_Описания
ИЗ
Справочник.Номенклатура КАК Номенклатура
ИНДЕКСИРОВАТЬ ПО
ОписаниеЧем заменить преобразование в строку: рабочие приёмы
Представление ссылки
Если нужно получить текстовое представление ссылки (например, наименование контрагента или номер документа), используйте поле ПРЕДСТАВЛЕНИЕ(Ссылка) либо обращайтесь к конкретным реквизитам: Док.Номер, Контрагент.Наименование. Функция ПРЕДСТАВЛЕНИЕ возвращает строку, но её результат нельзя использовать в соединениях и группировках — только в выборке.
Преобразование числа и даты
Для чисел и дат прямого приведения к строке в запросе нет. Варианты обхода: вычислить строку на уровне СКД через выражение вычисляемого поля (там доступен весь встроенный язык, включая Формат() и Строка()), либо выгрузить результат запроса и выполнить преобразование в коде при обходе выборки.
ПОДСТРОКА и конкатенация
Для сборки строк из частей используйте оператор + (конкатенация работает только между строками) и функцию ПОДСТРОКА(Поле, Начало, Длина). Если один из операндов конкатенации — число, его нужно предварительно превратить в строку на уровне кода или СКД: в чистом запросе это снова упирается в несовместимость типов.
Способы получить строку из значения
Только для строковых полей: усечение длины, уточнение составного типа. Не конвертирует числа, даты и ссылки.
Строковое представление ссылки. Не работает в соединениях, группировках и условиях соединения.
Полный встроенный язык: Формат(), Строка(), любые преобразования. Только в отчётах на СКД.
Выгрузка запроса и преобразование при обходе. Гибко, но требует дополнительного кода и памяти.
Типичные ошибки и как их избежать
Самая распространённая ошибка — ожидание поведения, аналогичного SQL CAST. Разработчики с опытом T-SQL или PostgreSQL автоматически пишут ВЫРАЗИТЬ(Сумма КАК СТРОКА(20)) и получают ошибку. В 1С эту задачу решают вне запроса.
Вторая ошибка — попытка сравнить строку с числом через приведение: ГДЕ ВЫРАЗИТЬ(Код КАК СТРОКА(9)) = &СтрокаКода. Если Код — число, запрос не выполнится. Правильное решение — привести параметр к типу поля (передать число) или хранить код как строку в конфигурации.
Третья ошибка — игнорирование NULL при уточнении составного типа. Когда ВЫРАЗИТЬ отсекает часть значений составного поля, эти строки получают NULL, и последующие сравнения или конкатенации дают неожиданный результат. Всегда проверяйте выборку на NULL после уточнения типа.
Пошаговая диагностика и исправление запроса
Если запрос выдаёт ошибку несовместимых типов, действуйте последовательно. Сначала определите фактический тип поля: откройте конфигуратор, найдите реквизит в метаданных и посмотрите его состав типов. Часто оказывается, что поле составное, а разработчик предполагал одиночный тип, или наоборот.
Затем определите, что вы на самом деле хотите получить: усечение строки, текстовое представление ссылки, форматирование числа или даты. Для каждой цели — свой инструмент из таблицы выше. После правки проверьте запрос в консоли запросов на реальных данных, включая записи с незаполненными полями.
- 1Откройте метаданные и проверьте фактический тип поля, вызывающего ошибку
- 2Определите цель: усечение строки, представление ссылки или форматирование числа/даты
- 3Для строки — примените ВЫРАЗИТЬ КАК СТРОКА(длина); для ссылки — ПРЕДСТАВЛЕНИЕ или реквизиты; для числа/даты — СКД или код
- 4Проверьте результат на NULL и на записях с незаполненными полями
- 5Выполните запрос в консоли на копии базы и сравните количество строк до и после правки
Проверка результата и ограничения
После исправления запроса убедитесь, что результат соответствует ожиданиям. Контрольные точки: количество строк выборки не изменилось без причины; в строковых полях нет NULL там, где раньше были значения; соединения не «размножили» строки из-за усечённых ключей.
Помните об ограничениях платформы: ПРЕДСТАВЛЕНИЕ нельзя использовать в условиях соединения и группировках; строки неограниченной длины нельзя группировать и индексировать без предварительного ВЫРАЗИТЬ; уточнение типа во временных таблицах влияет на построение индексов и производительность.
Как проверить результат
Совпадает с ожидаемым набором данных
Строки пропали или появились дубли после уточнения типа
Строки усечены до заданной длины, NULL только там, где значение было пустым
NULL вместо значений — поле составное и часть типов отсечена
Запрос проходит проверку без сообщений о несовместимых типах
Ошибка указывает на поле — тип поля не совместим со СТРОКА
Каждая строка соединяется один раз
Ложные совпадения из-за слишком короткой длины усечения
FAQ: частые вопросы
Можно ли в запросе 1С преобразовать число в строку?
Нет, в языке запросов нет функции преобразования числа в строку. ВЫРАЗИТЬ только уточняет тип, а не конвертирует значение. Используйте вычисляемые поля СКД (функция Формат() или Строка()) либо преобразуйте значения при обходе результата запроса в коде.
Почему ВЫРАЗИТЬ(Ссылка КАК СТРОКА) выдаёт ошибку?
Ссылочный тип несовместим со строковым: ссылка — это не текст, а уникальный идентификатор объекта. Для получения текстового описания объекта используйте ПРЕДСТАВЛЕНИЕ(Ссылка) или обратитесь к реквизитам — Наименование, Номер и т. д.
Что вернёт ВЫРАЗИТЬ, если поле составного типа и строка в нём есть?
Для значений строкового типа вернётся сама строка (усечённая до указанной длины), для всех остальных типов состава — NULL. Поэтому после уточнения составного поля всегда проверяйте результат на NULL, особенно если поле участвует в соединениях.
Как убрать ошибку несовместимых типов при ОБЪЕДИНИТЬ?
Приведите соответствующие колонки всех частей объединения к одному типу. Если в одной части число, а в другой строка, решите, какой тип нужен на выходе: либо замените число на константную строку-заглушку, либо перенесите преобразование на уровень кода после выполнения запроса.
Почему строку неограниченной длины нужно приводить через ВЫРАЗИТЬ?
Строки неограниченной длины нельзя использовать в группировках, соединениях, условиях сравнения и индексах временных таблиц. Конструкция ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) с фиксированной длиной снимает эти ограничения, но значения длиннее N будут усечены.
Работает ли ПРЕДСТАВЛЕНИЕ в соединениях таблиц?
Нет, функцию ПРЕДСТАВЛЕНИЕ нельзя использовать в условиях соединения, группировках и упорядочивании по её результату в некоторых случаях. Она предназначена только для вывода в список полей выборки. Для соединений по тексту соединяйтесь по реквизитам объекта.
Что важно запомнить
ВЫРАЗИТЬ КАК СТРОКА в 1С уточняет тип, а не конвертирует значение: она работает только со строковыми полями и составными типами, содержащими строку. Ошибка несовместимых типов означает, что поле — число, дата, булево или ссылка. Для представления ссылок используйте ПРЕДСТАВЛЕНИЕ, для чисел и дат — СКД или обработку результата в коде. После уточнения типа проверяйте выборку на NULL и на ложные совпадения при усечении.