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

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

1С запрос: ВЫРАЗИТЬ КАК СТРОКА и ошибка несовместимых типов

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

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

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

Как работает ВЫРАЗИТЬ в языке запросов 1С

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

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

Почему возникает ошибка «Несовместимые типы ВЫРАЗИТЬ»

Ошибка появляется в нескольких типовых ситуациях. Первая — попытка привести примитивный тип к другому примитивному: число к строке, дату к строке, булево к строке. Язык запросов 1С не поддерживает таких преобразований, в отличие от SQL, где CAST(123 AS VARCHAR) — рабочая конструкция.

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

Четвёртый, более коварный случай — соединение или объединение запросов, где в одной части поле строковое, а в другой — числовое. Ошибка несовместимых типов возникает уже не в самом ВЫРАЗИТЬ, а при ОБЪЕДИНИТЬ или сравнении полей разных типов, и разработчик ошибочно пытается «вылечить» её приведением к строке.

Когда ВЫРАЗИТЬ КАК СТРОКА работает правильно

Легальные сценарии использования оператора со строковым типом ограничены, но важны. Первый — усечение строки неограниченной длины: ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(100)). Это необходимо, потому что строки неограниченной длины нельзя использовать в группировках, соединениях, сравнениях и индексах временных таблиц.

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

Третий сценарий — приведение строки к меньшей длине для оптимизации: при помещении данных во временную таблицу с индексом длинная строка замедляет соединение, и осознанное усечение до разумной длины ускоряет запрос.

bsl
ВЫБРАТЬ
	ВЫРАЗИТЬ(Номенклатура.Описание КАК СТРОКА(100)) КАК Описание
ПОМЕСТИТЬ ВТ_Описания
ИЗ
	Справочник.Номенклатура КАК Номенклатура

ИНДЕКСИРОВАТЬ ПО
	Описание

Чем заменить преобразование в строку: рабочие приёмы

Представление ссылки

Если нужно получить текстовое представление ссылки (например, наименование контрагента или номер документа), используйте поле ПРЕДСТАВЛЕНИЕ(Ссылка) либо обращайтесь к конкретным реквизитам: Док.Номер, Контрагент.Наименование. Функция ПРЕДСТАВЛЕНИЕ возвращает строку, но её результат нельзя использовать в соединениях и группировках — только в выборке.

Преобразование числа и даты

Для чисел и дат прямого приведения к строке в запросе нет. Варианты обхода: вычислить строку на уровне СКД через выражение вычисляемого поля (там доступен весь встроенный язык, включая Формат() и Строка()), либо выгрузить результат запроса и выполнить преобразование в коде при обходе выборки.

ПОДСТРОКА и конкатенация

Для сборки строк из частей используйте оператор + (конкатенация работает только между строками) и функцию ПОДСТРОКА(Поле, Начало, Длина). Если один из операндов конкатенации — число, его нужно предварительно превратить в строку на уровне кода или СКД: в чистом запросе это снова упирается в несовместимость типов.

Способы получить строку из значения

ВЫРАЗИТЬ КАК СТРОКА

Только для строковых полей: усечение длины, уточнение составного типа. Не конвертирует числа, даты и ссылки.

ПРЕДСТАВЛЕНИЕ(Ссылка)

Строковое представление ссылки. Не работает в соединениях, группировках и условиях соединения.

Вычисляемое поле СКД

Полный встроенный язык: Формат(), Строка(), любые преобразования. Только в отчётах на СКД.

Обработка в коде

Выгрузка запроса и преобразование при обходе. Гибко, но требует дополнительного кода и памяти.

Типичные ошибки и как их избежать

Самая распространённая ошибка — ожидание поведения, аналогичного SQL CAST. Разработчики с опытом T-SQL или PostgreSQL автоматически пишут ВЫРАЗИТЬ(Сумма КАК СТРОКА(20)) и получают ошибку. В 1С эту задачу решают вне запроса.

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

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

Типичные ошибки
01
ВЫРАЗИТЬ(Число КАК СТРОКА) по аналогии с SQL CAST — ошибка несовместимых типов при проверке запроса
02
Использование ПРЕДСТАВЛЕНИЕ() в соединении таблиц — запрос падает или работает медленно
03
Игнорирование NULL после уточнения составного типа — в выборке пропадают или «портятся» строки
04
Усечение строки до слишком малой длины перед соединением — ложные совпадения и дубли в результате

Пошаговая диагностика и исправление запроса

Если запрос выдаёт ошибку несовместимых типов, действуйте последовательно. Сначала определите фактический тип поля: откройте конфигуратор, найдите реквизит в метаданных и посмотрите его состав типов. Часто оказывается, что поле составное, а разработчик предполагал одиночный тип, или наоборот.

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

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

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

После исправления запроса убедитесь, что результат соответствует ожиданиям. Контрольные точки: количество строк выборки не изменилось без причины; в строковых полях нет NULL там, где раньше были значения; соединения не «размножили» строки из-за усечённых ключей.

Помните об ограничениях платформы: ПРЕДСТАВЛЕНИЕ нельзя использовать в условиях соединения и группировках; строки неограниченной длины нельзя группировать и индексировать без предварительного ВЫРАЗИТЬ; уточнение типа во временных таблицах влияет на построение индексов и производительность.

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

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

Количество строк в выборке
Норма

Совпадает с ожидаемым набором данных

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

Строки пропали или появились дубли после уточнения типа

Значения строкового поля
Норма

Строки усечены до заданной длины, NULL только там, где значение было пустым

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

NULL вместо значений — поле составное и часть типов отсечена

Текст запроса в консоли
Норма

Запрос проходит проверку без сообщений о несовместимых типах

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

Ошибка указывает на поле — тип поля не совместим со СТРОКА

Соединения по усечённой строке
Норма

Каждая строка соединяется один раз

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

Ложные совпадения из-за слишком короткой длины усечения

FAQ: частые вопросы

Можно ли в запросе 1С преобразовать число в строку?

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

Почему ВЫРАЗИТЬ(Ссылка КАК СТРОКА) выдаёт ошибку?

Ссылочный тип несовместим со строковым: ссылка — это не текст, а уникальный идентификатор объекта. Для получения текстового описания объекта используйте ПРЕДСТАВЛЕНИЕ(Ссылка) или обратитесь к реквизитам — Наименование, Номер и т. д.

Что вернёт ВЫРАЗИТЬ, если поле составного типа и строка в нём есть?

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

Как убрать ошибку несовместимых типов при ОБЪЕДИНИТЬ?

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

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

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

Работает ли ПРЕДСТАВЛЕНИЕ в соединениях таблиц?

Нет, функцию ПРЕДСТАВЛЕНИЕ нельзя использовать в условиях соединения, группировках и упорядочивании по её результату в некоторых случаях. Она предназначена только для вывода в список полей выборки. Для соединений по тексту соединяйтесь по реквизитам объекта.

Итог

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

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