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

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

Как вывести строку в запросе 1С

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

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

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

Строковый литерал в запросе: базовый синтаксис

Самый простой способ вывести строку — указать литерал в секции ВЫБРАТЬ. В отличие от встроенного языка, где строки тоже пишутся в кавычках, в тексте запроса, оформленном внутри программного кода, кавычки приходится удваивать, потому что сам текст запроса уже является строкой встроенного языка.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ""Константа"" КАК ПроизвольнаяСтрока,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

Если текст запроса пишется в консоли запросов или в СКД (в схеме компоновки данных), удвоение кавычек не требуется — там текст запроса не вложен в строковый литерал кода. Это частая причина путаницы: запрос, работающий в консоли, «ломается» при переносе в модуль именно из-за кавычек.

Чтобы вывести кавычку внутри самой строки, её нужно удвоить ещё раз. В модуле кода это выглядит как четыре кавычки подряд: """" даст в результате один символ кавычки. Проверить результат проще всего в консоли запросов, постепенно перенося выражение в код.

Склейка строк оператором «+»

Объединение строк в запросе выполняется оператором «+», как и во встроенном языке. Типичный сценарий — собрать ФИО из трёх полей или добавить к наименованию артикул:

ВЫБРАТЬ

ФизическиеЛица.Фамилия + " " + ФизическиеЛица.Имя + " " + ФизическиеЛица.Отчество КАК ФИО

ИЗ

Справочник.ФизическиеЛица КАК ФизическиеЛица

Главное ограничение: операция сложения допустима только между строками. Если одно из полей — число, дата или ссылка, запрос завершится ошибкой «Несовместимые типы». Перед склейкой нестроковое значение нужно привести к строке функцией ВЫРАЗИТЬ либо выполнить форматирование уже в коде после выборки.

Ещё один подводный камень — значение NULL. Если любое из склеиваемых полей равно NULL (например, при левом соединении без совпадения), вся результирующая строка станет NULL. Чтобы этого избежать, оборачивайте поля в ЕСТЬNULL(Поле, ""):

ВЫБРАТЬ

ЕСТЬNULL(Контрагенты.Наименование, "") + " / " + ЕСТЬNULL(Контрагенты.ИНН, "") КАК Представление

ИЗ

Справочник.Контрагенты КАК Контрагенты

Типичные ошибки
01
Склейка строки с числом или датой без ВЫРАЗИТЬ — запрос падает с ошибкой несовместимых типов
02
Игнорирование NULL в одном из полей — вся склеенная строка превращается в NULL
03
Перенос запроса из консоли в код без удвоения кавычек — синтаксическая ошибка модуля

Функция ПОДСТРОКА и работа с частью строки

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

ВЫБРАТЬ

ПОДСТРОКА(Номенклатура.НаименованиеПолное, 1, 50) КАК КраткоеНаименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

Если запрошенная длина превышает фактическую длину строки, функция вернёт строку целиком — ошибки не будет. Если начальная позиция больше длины строки, результатом будет пустая строка. Это удобно: дополнительные проверки в самом запросе обычно не нужны.

Ограничение по типам

ПОДСТРОКА работает только со строковыми значениями. Применение к полю типа ХранилищеЗначения или к неограниченной строке в некоторых СУБД может быть запрещено или работать медленно. Для полей неограниченной длины (например, многострочных текстов) надёжнее сначала привести значение через ВЫРАЗИТЬ(Поле КАК СТРОКА(200)), а затем уже извлекать подстроку.

Приведение к строке через ВЫРАЗИТЬ

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Документы.Ссылка КАК СТРОКА(36)) КАК СтрокаСсылки

ИЗ

Документ.РеализацияТоваровУслуг КАК Документы

Указывайте длину с запасом, но без фанатизма: при недостаточной длине строка будет обрезана без предупреждения, а чрезмерно большая длина увеличивает расход памяти при обработке результата. Для представления ссылки обычно достаточно 100–150 символов, для уникального идентификатора — 36.

Передача строки через параметр

Когда строка формируется в коде или приходит от пользователя, передавайте её параметром, а не подстановкой в текст запроса. Параметр обозначается символом «&», значение устанавливается методом УстановитьПараметр:

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + ИскомыйТекст + "%");

Подстановка пользовательского ввода напрямую в текст запроса через конкатенацию кода — грубая ошибка: это ломает запрос при наличии кавычек во вводе и создаёт риск инъекции в управляемых сценариях. Параметры автоматически экранируются платформой.

Спецсимволы в операторе ПОДОБНО

В шаблоне ПОДОБНО символы «%», «_», «[» имеют служебное значение. Если пользователь ищет литеральный процент или подчёркивание, их нужно экранировать через СПЕЦСИМВОЛ: ГДЕ Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~", а в самом шаблоне предварять служебные символы этим знаком.

Сравнение вариантов вывода строки

Литерал в тексте запроса

Подходит для фиксированных подписей и констант. Не годится для данных из кода

Параметр запроса

Универсальный способ для любых строк, вычисленных в коде или введённых пользователем

Выражение над полями (+, ПОДСТРОКА)

Для строк, собираемых из данных выборки. Ограничен набором функций языка запросов

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

Когда возможностей языка запросов не хватает — формула пишется на встроенном языке

Строки в СКД и вычисляемые поля

В схеме компоновки данных строковые выражения можно задавать на трёх уровнях: в тексте запроса набора данных, в вычисляемых полях и в ресурсах. Вычисляемое поле позволяет использовать функции встроенного языка — Формат(), СтрШаблон(), СокрЛП() — чего нет в языке запросов.

Например, чтобы вывести число с разделителями разрядов внутри строки, в запросе это сделать невозможно, а в вычисляемом поле СКД — элементарно: "Итого: " + Формат(Сумма, "ЧДЦ=2"). Именно поэтому сложное форматирование рекомендуется выносить из запроса в вычисляемые поля или в обработку результата в коде.

Маршрут решения

Как выбрать способ

Нужна постоянная подпись или метка в выборкеИспользуйте строковый литерал в секции ВЫБРАТЬ
Строка собирается из полей выборкиСклейка оператором + с ЕСТЬNULL для защиты от NULL
Строка приходит из кода или от пользователяПередавайте через параметр запроса
Нужны Формат(), СтрШаблон() и другие функции встроенного языкаИспользуйте вычисляемое поле СКД или обработку результата в модуле

Проверка результата и отладка

Быстрее всего отлаживать строковые выражения в консоли запросов: выполняете запрос на реальных данных и сразу видите итоговые строки. Проверяйте три вещи: не обрезалась ли строка из-за малой длины в ВЫРАЗИТЬ, не превратилась ли она в NULL из-за соединения, не потерялись ли пробелы при склейке.

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

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

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

Длина выведенной строки
Норма

Строка совпадает с ожидаемой, конец не обрезан

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

Строка усечена — увеличьте длину в ВЫРАЗИТЬ или СТРОКА(N)

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

Пустые фрагменты, строка присутствует

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

NULL вместо строки — добавьте ЕСТЬNULL

Запрос в модуле после переноса из консоли
Норма

Модуль компилируется, запрос выполняется

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

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

Частые вопросы

Как вывести перевод строки в запросе 1С?

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

Можно ли использовать функцию Формат() прямо в запросе?

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

Чем ПРЕДСТАВЛЕНИЕ отличается от ВЫРАЗИТЬ(КАК СТРОКА)?

ПРЕДСТАВЛЕНИЕ(Ссылка) возвращает пользовательское представление объекта (например, «Реализация 0001 от 12.03»), а ВЫРАЗИТЬ приводит значение к строке заданной длины. Для вывода пользователю обычно удобнее ПРЕДСТАВЛЕНИЕ, для технических операций — ВЫРАЗИТЬ.

Почему склеенная строка получилась пустой, хотя поля заполнены?

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

Как вывести строку неограниченной длины в запросе?

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

Работает ли конкатенация строк в виртуальных таблицах и итогах?

Оператор «+» применим к полям любых источников, включая виртуальные таблицы. В итогах и группировках склейка не агрегируется автоматически — для объединения строк по группе потребуется обход выборки в коде или вычисляемые ресурсы СКД.

Итог

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

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