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

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

Как добавить текст в запрос 1С: литералы, склейка строк и параметры

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

Добавить текст в запрос 1С можно несколькими способами: вставить строковый литерал прямо в текст запроса, склеить строки оператором «+», передать строку через параметр или сформировать её в коде перед выполнением. Выбор зависит от того, где рождается текст — в самом запросе, в коде модуля или у пользователя.

Чаще всего задача звучит так: нужно вывести в поле запроса фиксированную надпись, добавить к наименованию номенклатуры префикс, собрать ФИО из трёх полей в одну строку или сделать подборку по части строки. Всё это решается средствами встроенного языка запросов без изменения конфигурации.

Ниже разобраны рабочие конструкции с примерами, ограничения по длине строк, типичные ошибки с кавычками и способы проверить результат до того, как запрос попадёт в рабочий код.

Строковый литерал: как вставить фиксированный текст

Самый простой способ — указать текст прямо в запросе как строковый литерал. Строка записывается в двойных кавычках и может использоваться в списке выбираемых полей, в условиях и в операторе ВЫБОР:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Товар,

"В наличии" КАК Статус

ИЗ

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

В этом примере поле Статус для каждой строки результата будет содержать текст «В наличии». Такой приём удобен для колонок-признаков в отчётах и для пометки строк, объединяемых через ОБЪЕДИНИТЬ.

Если внутри текста нужна кавычка, её удваивают: "Номенклатура ""Услуги""" даст строку Номенклатура "Услуги". Это самая частая синтаксическая ошибка у начинающих — одна непарная кавычка ломает весь запрос, и конструктор запроса выдаёт ошибку уже на этапе проверки текста.

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

Оператор «+» в языке запросов объединяет строки. Так собирают ФИО в одну строку, добавляют префиксы и суффиксы к наименованиям, формируют представления для вывода:

ВЫБРАТЬ

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

ИЗ

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

Пробелы между частями добавляются отдельными литералами — сама склейка ничего не вставляет. Если забыть + " " +, получится «ИвановИванИванович».

При склейке с нестроковыми типами (число, дата, ссылка) запрос либо выдаст ошибку, либо вернёт NULL — поведение зависит от платформы и СУБД. Надёжное правило: сначала привести значение к строке функцией ПРЕДСТАВЛЕНИЕ() или отформатировать число в коде и передать параметром.

Склейка с NULL

Если любой из операндов равен NULL, результат всей склейки тоже будет NULL, а не частичная строка. Чтобы не потерять данные, оборачивайте потенциально пустые поля в ЕСТЬNULL:

ВЫБРАТЬ

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

ИЗ

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

Типичные ошибки
01
Склейка без ЕСТЬNULL: одно пустое поле обнуляет всю строку результата
02
Склейка строки с числом или датой без приведения типа — ошибка запроса или NULL
03
Непарные кавычки внутри литерала: запрос не проходит проверку синтаксиса
04
Склейка неограниченных строк (Строка(0)) без ВЫРАЗИТЬ — ошибка на ряде СУБД

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

Когда текст формируется в модуле, его передают через параметр — имя начинается с символа «&». Параметр можно использовать и как значение поля, и как часть условия:

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

| &Комментарий КАК Примечание

|ИЗ

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

|ГДЕ

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

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

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

Параметры предпочтительнее подстановки текста прямо в строку запроса: не нужно экранировать кавычки, код читается легче, а платформа корректно передаёт тип значения. Прямая подстановка через СтрШаблон или конкатенацию текста запроса оправдана только для имён таблиц и полей, которые нельзя параметризовать.

ВЫРАЗИТЬ и ограничение длины строки

Реквизиты типа «Строка неограниченной длины» нельзя склеивать и сравнивать на равенство — на уровне СУБД это поля типа TEXT/NTEXT. Перед операциями их приводят к строке фиксированной длины функцией ВЫРАЗИТЬ:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(100)) + " …" КАК КраткоеОписание

ИЗ

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

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

Тот же приём работает в условиях соединения и сравнения: ГДЕ ВЫРАЗИТЬ(Таб.Комментарий КАК СТРОКА(200)) = &Текст. Без приведения такое сравнение на неограниченной строке вызовет ошибку.

Способы добавить текст

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

Подходит для фиксированных надписей и меток. Ограничение: текст нельзя изменить из кода без правки запроса

Склейка через «+»

Сборка строк из полей и литералов. Ограничение: нужны ЕСТЬNULL и приведение типов

Параметр &Текст

Текст формируется в коде модуля. Самый гибкий и безопасный вариант для переменных данных

ПОДСТРОКА и ПРЕДСТАВЛЕНИЕ

Обрезка и преобразование существующих значений. Не создают новый текст, а меняют вывод существующего

Текст в условиях: ПОДОБНО и спецсимволы

Для поиска по части строки используется оператор ПОДОБНО с шаблоном: «%» — любая последовательность символов, «_» — ровно один символ. Шаблон обычно передают параметром, чтобы спецсимволы собирались в коде:

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

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

Сравнение строк в запросе регистронезависимое на большинстве настроек СУБД, но зависит от collation базы. Если поведение критично, проверяйте на реальных данных, а не полагайтесь на предположения.

Порядок действий
  1. 1
    Определите, откуда берётся текст: константа — литерал, из полей — склейка, из кода — параметр
  2. 2
    Напишите конструкцию в консоли запросов и проверьте на тестовых данных
  3. 3
    Добавьте ЕСТЬNULL к полям, которые могут быть пустыми
  4. 4
    Приведите неограниченные строки через ВЫРАЗИТЬ с достаточной длиной
  5. 5
    Перенесите текст в модуль, параметры задайте через УстановитьПараметр

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

Перед переносом в рабочий код запрос удобно проверить в консоли запросов (внешней обработке) или через временный код в модуле. Смотрите не только на отсутствие ошибки, но и на содержимое колонок: склейка может «молча» дать NULL или обрезанный текст.

Полезная практика — вывести рядом исходные поля и собранную строку. Так сразу видно, где потерялся пробел, где сработал NULL, а где ВЫРАЗИТЬ отрезал хвост длинного описания.

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

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

Текстовая колонка в выборке
Норма

Строка собрана полностью, с пробелами и без обрезки

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

NULL, слипшиеся слова или обрезанный хвост

Строки с пустыми полями
Норма

Текст формируется с заменой по умолчанию

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

Вся строка NULL из-за одного пустого поля

Поиск по ПОДОБНО
Норма

Находятся только ожидаемые записи

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

Лишние строки из-за % или _ в искомом тексте

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

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

Удвойте кавычку внутри литерала: "Товар ""Акция""" даст строку Товар "Акция". Если текст с кавычками приходит из кода, передавайте его параметром — тогда экранировать ничего не нужно.

Почему при склейке строк получается NULL?

Потому что один из операндов равен NULL, а любая операция с NULL даёт NULL. Оберните поля в ЕСТЬNULL(Поле, "") или используйте значение по умолчанию.

Можно ли склеить строку с числом или датой?

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

Как добавить перенос строки в текст запроса?

Литерал с переносом в тексте запроса неудобен. Надёжнее сформировать строку в коде с Символы.ПС или Символы.ВК + Символы.ПС и передать параметром — запрос сохранит переносы в значении поля.

Почему ВЫРАЗИТЬ(... КАК СТРОКА(50)) обрезает текст?

Это штатное поведение: приведение к фиксированной длине отсекает всё сверх неё. Увеличьте длину или выгружайте поле без ВЫРАЗИТЬ, если нужен полный неограниченный текст.

Чем параметр лучше подстановки текста в строку запроса?

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

Итог

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

Фиксированный текст добавляется литералом в двойных кавычках, строки из полей склеиваются оператором «+» с ЕСТЬNULL, переменный текст из кода передаётся параметром. Неограниченные строки перед операциями приводите через ВЫРАЗИТЬ, помня об обрезке, и всегда проверяйте результат в консоли запросов.