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