Разработка и Конфигурация · 9 мин
Выразить как строка в запросе 1С: полное руководство по функции ВЫРАЗИТЬ
Как использовать ВЫРАЗИТЬ КАК СТРОКА в запросе 1С: синтаксис, приведение типов, ограничение длины, работа с NULL и типичные ошибки разработчиков.
Функция ВЫРАЗИТЬ в языке запросов 1С предназначена для явного приведения значения к указанному типу данных. Конструкция «выразить как строка» применяется, когда нужно преобразовать число, дату, ссылку или составное поле в строковый тип — например, для объединения с другими строками, сравнения по части значения или группировки.
Типичная ситуация: в регистре хранится составное поле, в котором могут лежать и ссылки, и числа, и строки. При попытке объединить такое поле со строковым литералом запрос вернёт ошибку несовместимости типов. Явное приведение через ВЫРАЗИТЬ решает задачу: запрос получает однозначный тип и корректно выполняется на СУБД.
Важно понимать, что ВЫРАЗИТЬ не является функцией форматирования. Она не превращает дату в читаемое представление и не добавляет разделители разрядов в число — она лишь меняет тип значения на уровне запроса. Для красивого вывода результата используется функция ПРЕДСТАВЛЕНИЕ или обработка уже на стороне кода.
Синтаксис функции ВЫРАЗИТЬ для строкового типа
Общий вид конструкции: ВЫРАЗИТЬ(Выражение КАК СТРОКА(Длина)). Первый аргумент — поле, параметр или вложенное выражение, второй — целевой тип с обязательным указанием максимальной длины в символах. В отличие от типов ЧИСЛО или ДАТА, для СТРОКА длина является обязательным параметром — без неё конструктор запроса выдаст ошибку.
Пример простого запроса, где числовой код приводится к строке для последующего объединения:
ВЫБРАТЬ
Номенклатура.Наименование,
ВЫРАЗИТЬ(Номенклатура.Код КАК СТРОКА(20)) КАК КодСтрокой
ИЗ
Справочник.Номенклатура КАК Номенклатура
Длина строки выбирается исходя из реальных данных. Если указать СТРОКА(10), а значение содержит 15 символов, результат будет усечён без предупреждения — это частый источник скрытых ошибок в отчётах и обменах данными.
Когда приведение к строке действительно нужно
Первая группа задач — объединение значений разных типов в одно поле. Оператор «+» для строк в запросе требует, чтобы оба операнда были строковыми, поэтому числа и даты приводят через ВЫРАЗИТЬ. Например, формирование ключа вида «Код-Год» из двух числовых полей.
Вторая группа — сравнение и поиск по подстроке. Функция ПОДСТРОКА и оператор ПОДОБНО работают только со строками. Если нужно найти документы, у которых номер заканчивается на определённые цифры, а поле номера имеет составной тип, предварительное приведение к строке становится обязательным.
Третья группа — нормализация составных полей. Когда измерение регистра допускает несколько типов, группировка по нему без приведения даст отдельные строки для каждого типа-представления. Приведение к строке объединяет результаты в единую группу.
Пример: объединение кода и наименования
ВЫБРАТЬ
ВЫРАЗИТЬ(Товары.Код КАК СТРОКА(11)) + " — " + Товары.Наименование КАК ПредставлениеТовара
ИЗ
Справочник.Номенклатура КАК Товары
Приведение чисел, дат и ссылок: особенности каждого типа
Числа приводятся к строке в том виде, в каком их вернёт СУБД: без разделителей групп разрядов, с точкой в качестве разделителя дробной части. Если для отчёта нужен формат «1 234,56», делать это нужно уже в модуле через функцию Формат(), а не в запросе.
Даты при приведении к строке дают внутреннее представление, которое зависит от платформы и СУБД, и почти никогда не совпадает с привычным «ДД.ММ.ГГГГ». Поэтому для дат конструкция ВЫРАЗИТЬ КАК СТРОКА практически не применяется — вместо неё используют ПРЕДСТАВЛЕНИЕ или извлечение частей даты функциями ГОД, МЕСЯЦ, ДЕНЬ с последующей сборкой строки.
Ссылки при приведении к строке дают не наименование объекта, а техническое представление. Чтобы получить читаемое название контрагента или документа, применяйте функцию ПРЕДСТАВЛЕНИЕ(Ссылка) — она возвращает именно то, что видит пользователь в интерфейсе.
Сравнение вариантов
Подходит для чисел и составных полей, когда важен тип на уровне СУБД. Для ссылок и дат даёт техническое, а не пользовательское представление.
Возвращает читаемое представление ссылки или значения. Удобно для отчётов, но результат нельзя надёжно сравнивать и индексировать.
Применяется после выполнения запроса. Даёт полный контроль над выводом, но требует обхода выборки в модуле.
Работа с NULL и составными типами
Если исходное поле содержит NULL, результат ВЫРАЗИТЬ также будет NULL, а не пустой строкой. Это критично при объединении: «строка» + NULL даст NULL, и поле в отчёте окажется пустым. Перед приведением обрабатывайте такие значения функцией ЕСТЬNULL(Поле, "").
Для составного поля ВЫРАЗИТЬ выполняет ещё одну важную функцию — сужение типа. Если измерение регистра может хранить ссылки на два разных справочника, конструкция ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты) оставит только значения нужного типа, остальные превратит в NULL. Аналогично приведение к СТРОКА отбрасывает несовместимые значения.
Пошаговый пример: поиск документов по окончанию номера
Задача: найти реализации, номер которых оканчивается на «/25». Номер документа строковый, но в некоторых конфигурациях имеет составной тип, поэтому рассмотрим вариант с явным приведением.
- 1Откройте консоль запросов и выберите таблицу документа.
- 2Добавьте поле номера с приведением: ВЫРАЗИТЬ(Док.Номер КАК СТРОКА(20)).
- 3В секции ГДЕ задайте условие: ВЫРАЗИТЬ(Док.Номер КАК СТРОКА(20)) ПОДОБНО "%/25".
- 4Выполните запрос на тестовой копии базы и сверьте количество строк с ожиданием.
- 5Проверьте, что в результат не попали документы с похожим окончанием в середине номера.
ВЫБРАТЬ
Реализация.Ссылка,
ВЫРАЗИТЬ(Реализация.Номер КАК СТРОКА(20)) КАК НомерСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
ВЫРАЗИТЬ(Реализация.Номер КАК СТРОКА(20)) ПОДОБНО "%/25"
Обратите внимание: символ процента в шаблоне ПОДОБНО означает любую последовательность символов. Если в самом номере могут встречаться спецсимволы шаблона, их нужно экранировать через параметр СПЕЦСИМВОЛ.
Типичные ошибки и как их избежать
Отдельно стоит упомянуть попытку привести строку к числу «на всякий случай» и обратно в одном запросе. Каждое лишнее преобразование типов усложняет план запроса и затрудняет отладку. Приводите значение ровно один раз и сохраняйте результат в именованное поле через КАК.
Проверка результата и ограничения
Как проверить результат
Все строки целиком, без обрезанных окончаний
Часть значений усечена — увеличьте длину в СТРОКА(N)
Пусто только там, где данных нет изначально
Пусто там, где значение есть — проверьте NULL и составной тип
Запрос отрабатывает за приемлемое время на рабочем объёме
Резкое замедление — уберите приведение из условий соединения
Помните об ограничении: максимальная длина строки в запросе ограничена возможностями платформы и СУБД, а строки неограниченной длины (тип СТРОКА(0) в метаданных) в запросах приводятся с конкретной длиной и могут усекаться. Поля типа ХранилищеЗначения и строки неограниченной длины нельзя напрямую сравнивать и группировать — предварительно приводите их к фиксированной длине.
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)) приводит значение к строке фиксированной длины; длина обязательна, лишнее усекается. Для читаемого представления ссылок используйте ПРЕДСТАВЛЕНИЕ, для форматирования — Формат() в коде. NULL обрабатывайте через ЕСТЬNULL, а поля соединений не приводите к строке, чтобы не потерять индексы.
Частые вопросы
Можно ли выразить значение как строку неограниченной длины в запросе?
Нет, в языке запросов длина строки указывается явно числом, например СТРОКА(150). Конструкция СТРОКА(0), допустимая в метаданных, в запросе не используется. Если реальная длина данных неизвестна, задайте значение с запасом и проверьте результат на усечение.
Чем ВЫРАЗИТЬ отличается от ПРЕДСТАВЛЕНИЕ?
ВЫРАЗИТЬ меняет тип значения на уровне запроса и для ссылок возвращает техническое представление. ПРЕДСТАВЛЕНИЕ возвращает строку так, как её видит пользователь: наименование справочника, номер и дату документа. Для вывода в отчёт обычно нужен именно второй вариант.
Почему после приведения к строке поле стало пустым?
Наиболее вероятные причины — исходное значение NULL или несовместимый тип в составном поле. Оберните выражение в ЕСТЬNULL(ВЫРАЗИТЬ(Поле КАК СТРОКА(50)), "") и проверьте, какие типы реально хранятся в поле.
Как преобразовать дату в строку формата ДД.ММ.ГГГГ прямо в запросе?
Надёжного способа сделать это одной функцией в запросе нет. Варианты: собрать строку из ГОД(), МЕСЯЦ() и ДЕНЬ() с дополнением нулями, либо получить дату в выборке и отформатировать её функцией Формат() уже в модуле при обходе результата.
Влияет ли приведение к строке на производительность запроса?
Да, если приведение применяется к полям в условиях соединения или отбора по большим таблицам: СУБД не сможет использовать индекс по исходному полю. В списке выбираемых полей влияние минимально, поэтому приводите типы в секции ВЫБРАТЬ, а не в ГДЕ и соединениях.
Можно ли использовать ВЫРАЗИТЬ КАК СТРОКА для поля типа ХранилищеЗначения?
Нет, значения типа ХранилищеЗначения нельзя напрямую приводить к строке в запросе. Данные из хранилища извлекаются в коде методом Получить() после выполнения запроса, и уже там преобразуются в нужное представление.