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