Разработка и Конфигурация · 10 мин
Как вывести строку в запросе 1С
Как вывести строку в запросе 1С: строковые литералы, конкатенация, ПОДСТРОКА, ВЫРАЗИТЬ, параметры строкового типа и типичные ошибки с примерами кода.
Строка в запросе 1С встречается в трёх ролях: как литерал (постоянный текст прямо в тексте запроса), как результат вычисления над полями (склейка, подстрока, замена) и как параметр, переданный из кода. Во всех трёх случаях синтаксис отличается от привычного по встроенному языку, и именно здесь возникает большинство ошибок у начинающих разработчиков.
Язык запросов 1С не выполняет произвольные выражения встроенного языка: в нём есть собственный ограниченный набор операций над строками. Понимание этого набора — кавычки, оператор «+», функции ПОДСТРОКА, ВЫРАЗИТЬ, РАЗНОСТЬДАТ и другие — позволяет формировать нужные строки прямо в запросе, не прибегая к постобработке результата в коде.
Строковый литерал в запросе: базовый синтаксис
Самый простой способ вывести строку — указать литерал в секции ВЫБРАТЬ. В отличие от встроенного языка, где строки тоже пишутся в кавычках, в тексте запроса, оформленном внутри программного кода, кавычки приходится удваивать, потому что сам текст запроса уже является строкой встроенного языка.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ""Константа"" КАК ПроизвольнаяСтрока,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Если текст запроса пишется в консоли запросов или в СКД (в схеме компоновки данных), удвоение кавычек не требуется — там текст запроса не вложен в строковый литерал кода. Это частая причина путаницы: запрос, работающий в консоли, «ломается» при переносе в модуль именно из-за кавычек.
Чтобы вывести кавычку внутри самой строки, её нужно удвоить ещё раз. В модуле кода это выглядит как четыре кавычки подряд: """" даст в результате один символ кавычки. Проверить результат проще всего в консоли запросов, постепенно перенося выражение в код.
Склейка строк оператором «+»
Объединение строк в запросе выполняется оператором «+», как и во встроенном языке. Типичный сценарий — собрать ФИО из трёх полей или добавить к наименованию артикул:
ВЫБРАТЬ
ФизическиеЛица.Фамилия + " " + ФизическиеЛица.Имя + " " + ФизическиеЛица.Отчество КАК ФИО
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
Главное ограничение: операция сложения допустима только между строками. Если одно из полей — число, дата или ссылка, запрос завершится ошибкой «Несовместимые типы». Перед склейкой нестроковое значение нужно привести к строке функцией ВЫРАЗИТЬ либо выполнить форматирование уже в коде после выборки.
Ещё один подводный камень — значение NULL. Если любое из склеиваемых полей равно NULL (например, при левом соединении без совпадения), вся результирующая строка станет NULL. Чтобы этого избежать, оборачивайте поля в ЕСТЬNULL(Поле, ""):
ВЫБРАТЬ
ЕСТЬNULL(Контрагенты.Наименование, "") + " / " + ЕСТЬNULL(Контрагенты.ИНН, "") КАК Представление
ИЗ
Справочник.Контрагенты КАК Контрагенты
Функция ПОДСТРОКА и работа с частью строки
Функция ПОДСТРОКА(Строка, НачальнаяПозиция, Длина) извлекает фрагмент строки. Нумерация символов начинается с единицы, как и во встроенном языке. Типичное применение — обрезка длинного наименования для компактного отчёта или извлечение префикса номера документа:
ВЫБРАТЬ
ПОДСТРОКА(Номенклатура.НаименованиеПолное, 1, 50) КАК КраткоеНаименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
Если запрошенная длина превышает фактическую длину строки, функция вернёт строку целиком — ошибки не будет. Если начальная позиция больше длины строки, результатом будет пустая строка. Это удобно: дополнительные проверки в самом запросе обычно не нужны.
Ограничение по типам
ПОДСТРОКА работает только со строковыми значениями. Применение к полю типа ХранилищеЗначения или к неограниченной строке в некоторых СУБД может быть запрещено или работать медленно. Для полей неограниченной длины (например, многострочных текстов) надёжнее сначала привести значение через ВЫРАЗИТЬ(Поле КАК СТРОКА(200)), а затем уже извлекать подстроку.
Приведение к строке через ВЫРАЗИТЬ
Функция ВЫРАЗИТЬ(Значение КАК СТРОКА(Длина)) приводит значение к строковому типу указанной длины. Это основной способ получить строку из ссылки, числа или другого поля, когда дальше требуется строковая операция — склейка, сравнение по ПОДОБНО или обрезка.
ВЫБРАТЬ
ВЫРАЗИТЬ(Документы.Ссылка КАК СТРОКА(36)) КАК СтрокаСсылки
ИЗ
Документ.РеализацияТоваровУслуг КАК Документы
Указывайте длину с запасом, но без фанатизма: при недостаточной длине строка будет обрезана без предупреждения, а чрезмерно большая длина увеличивает расход памяти при обработке результата. Для представления ссылки обычно достаточно 100–150 символов, для уникального идентификатора — 36.
Передача строки через параметр
Когда строка формируется в коде или приходит от пользователя, передавайте её параметром, а не подстановкой в текст запроса. Параметр обозначается символом «&», значение устанавливается методом УстановитьПараметр:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + ИскомыйТекст + "%");
Подстановка пользовательского ввода напрямую в текст запроса через конкатенацию кода — грубая ошибка: это ломает запрос при наличии кавычек во вводе и создаёт риск инъекции в управляемых сценариях. Параметры автоматически экранируются платформой.
Спецсимволы в операторе ПОДОБНО
В шаблоне ПОДОБНО символы «%», «_», «[» имеют служебное значение. Если пользователь ищет литеральный процент или подчёркивание, их нужно экранировать через СПЕЦСИМВОЛ: ГДЕ Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~", а в самом шаблоне предварять служебные символы этим знаком.
Сравнение вариантов вывода строки
Подходит для фиксированных подписей и констант. Не годится для данных из кода
Универсальный способ для любых строк, вычисленных в коде или введённых пользователем
Для строк, собираемых из данных выборки. Ограничен набором функций языка запросов
Когда возможностей языка запросов не хватает — формула пишется на встроенном языке
Строки в СКД и вычисляемые поля
В схеме компоновки данных строковые выражения можно задавать на трёх уровнях: в тексте запроса набора данных, в вычисляемых полях и в ресурсах. Вычисляемое поле позволяет использовать функции встроенного языка — Формат(), СтрШаблон(), СокрЛП() — чего нет в языке запросов.
Например, чтобы вывести число с разделителями разрядов внутри строки, в запросе это сделать невозможно, а в вычисляемом поле СКД — элементарно: "Итого: " + Формат(Сумма, "ЧДЦ=2"). Именно поэтому сложное форматирование рекомендуется выносить из запроса в вычисляемые поля или в обработку результата в коде.
Как выбрать способ
Проверка результата и отладка
Быстрее всего отлаживать строковые выражения в консоли запросов: выполняете запрос на реальных данных и сразу видите итоговые строки. Проверяйте три вещи: не обрезалась ли строка из-за малой длины в ВЫРАЗИТЬ, не превратилась ли она в NULL из-за соединения, не потерялись ли пробелы при склейке.
После переноса в модуль выполните запрос программно и выведите первые строки через Сообщить() или посмотрите результат в отладчике. Помните, что выборка из результата запроса возвращает строки в исходном виде — без автоматического сокращения пробелов, поэтому СокрЛП при необходимости применяйте в коде.
Как проверить результат
Строка совпадает с ожидаемой, конец не обрезан
Строка усечена — увеличьте длину в ВЫРАЗИТЬ или СТРОКА(N)
Пустые фрагменты, строка присутствует
NULL вместо строки — добавьте ЕСТЬNULL
Модуль компилируется, запрос выполняется
Синтаксическая ошибка — проверьте удвоение кавычек
Частые вопросы
Как вывести перевод строки в запросе 1С?
В языке запросов нет символа переноса строки. Передайте его параметром: Запрос.УстановитьПараметр("ПС", Символы.ПС) и используйте в склейке. В СКД перенос можно добавить в вычисляемом поле через Символ(10) или Символы.ПС.
Можно ли использовать функцию Формат() прямо в запросе?
Нет, Формат() — функция встроенного языка, в языке запросов она недоступна. Альтернативы: вычисляемое поле СКД, постобработка выборки в коде или представление ссылки через ПРЕДСТАВЛЕНИЕ().
Чем ПРЕДСТАВЛЕНИЕ отличается от ВЫРАЗИТЬ(КАК СТРОКА)?
ПРЕДСТАВЛЕНИЕ(Ссылка) возвращает пользовательское представление объекта (например, «Реализация 0001 от 12.03»), а ВЫРАЗИТЬ приводит значение к строке заданной длины. Для вывода пользователю обычно удобнее ПРЕДСТАВЛЕНИЕ, для технических операций — ВЫРАЗИТЬ.
Почему склеенная строка получилась пустой, хотя поля заполнены?
Чаще всего причина в NULL: одно из полей пришло из соединения без совпадения, и сумма со строкой дала NULL. Оберните каждое поле в ЕСТЬNULL(Поле, ""). Реже причина — обрезка до нулевой длины в ВЫРАЗИТЬ или ПОДСТРОКА с позицией за пределами строки.
Как вывести строку неограниченной длины в запросе?
Поле типа «строка неограниченной длины» можно выбрать напрямую, но с ним нельзя выполнять группировку, сравнение и часть строковых операций. Если нужны такие операции, приведите поле через ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) с достаточной длиной, понимая, что хвост будет отсечён.
Работает ли конкатенация строк в виртуальных таблицах и итогах?
Оператор «+» применим к полям любых источников, включая виртуальные таблицы. В итогах и группировках склейка не агрегируется автоматически — для объединения строк по группе потребуется обход выборки в коде или вычисляемые ресурсы СКД.
Что важно запомнить
Строка в запросе 1С выводится литералом в двойных кавычках (в коде — с удвоением), склейкой через +, обрезкой через ПОДСТРОКА и приведением через ВЫРАЗИТЬ. Пользовательские данные передавайте только параметрами, от NULL защищайтесь через ЕСТЬNULL, а сложное форматирование выносите в вычисляемые поля СКД или в код.