Разработка и Конфигурация · 10 мин
Как в запросе 1С сцепить строки
Как сцепить строки в запросе 1С: оператор «+», ВЫРАЗИТЬ, работа с NULL и неограниченными строками. Примеры кода, ошибки и проверка результата.
Конкатенация (сцепление) строк в запросе 1С — одна из самых частых задач при формировании отчётов, представлений объектов и выгрузок. В отличие от SQL, в языке запросов 1С нет функций CONCAT или оператора «||»: сцепление выполняется только оператором «+» с соблюдением строгих правил типизации.
Главная сложность в том, что запрос 1С не приводит типы автоматически. Если попытаться сложить строку с числом, датой или значением NULL, запрос либо не выполнится, либо вернёт неожиданный результат. Поэтому корректная сцепка почти всегда требует приведения типов через ВЫРАЗИТЬ и обработки NULL через ЕСТЬNULL.
Ниже разобраны рабочие приёмы: сцепление строковых полей, добавление разделителей, приведение чисел и дат к строке, ограничения неограниченных строк и типичные ошибки с пояснениями, как их исправить.
Базовый синтаксис: оператор «+» для сцепления строк
В языке запросов 1С единственный способ сцепить строки — бинарный оператор «+». Он складывает два строковых значения в одно. Сцеплять можно поля выборки, строковые литералы в двойных кавычках и параметры запроса.
ВЫБРАТЬ
Номенклатура.Наименование + " (" + Номенклатура.Артикул + ")" КАК Представление
ИЗ
Справочник.Номенклатура КАК Номенклатура
Здесь к наименованию товара добавляется артикул в скобках. Разделитель — пробел, дефис, запятая — всегда задаётся строковым литералом, например ", ". Если нужен перенос строки, используйте символ перевода строки через конструкцию Символы.ПС недоступна в запросе — вместо этого вставьте в литерал символ с кодом через функцию Символ() только на уровне встроенного языка, а в самом запросе перенос задают литералом с фактическим переводом строки внутри кавычек.
Оператор «+» можно применять цепочкой: Поле1 + " " + Поле2 + " " + Поле3. Количество слагаемых не ограничено, но каждое из них обязано иметь строковый тип — иначе платформа вернёт ошибку «Неверные параметры в операции сравнения» или аналогичную ошибку типизации при выполнении.
Приведение чисел и дат к строке через ВЫРАЗИТЬ
Числовые поля и даты нельзя сцеплять со строкой напрямую — запрос завершится ошибкой несоответствия типов. Перед сцеплением значение нужно явно привести к строке оператором ВЫРАЗИТЬ с указанием длины строки.
ВЫБРАТЬ
"Документ № " + ВЫРАЗИТЬ(Реализация.Номер КАК Строка(11))
+ " от " + ВЫРАЗИТЬ(Реализация.Дата КАК Строка(10)) КАК Описание
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Длина в Строка(N) должна быть достаточной для значения: если указать слишком короткую строку, значение обрежется без предупреждения. Для чисел учитывайте знак минуса и разделитель дробной части. Для дат результат приведения зависит от региональных настроек информационной базы, поэтому для строгого формата дату лучше обрабатывать уже после запроса функцией Формат() в коде.
Учтите, что приведение числа к строке в запросе часто добавляет неразрывные пробелы-разделители групп разрядов (например, «1 234,56»). Если нужна «чистая» строка без разделителей, надёжнее выполнить сцепление не в запросе, а при обходе выборки: Строка(Число) или Формат(Число, "ЧГ=0").
Обработка NULL при сцеплении
Если любое из слагаемых равно NULL, весь результат сцепления станет NULL — это стандартное поведение арифметики со значениями NULL. Такое происходит при левом соединении, когда в присоединённой таблице нет подходящей записи, или при обращении к реквизиту составного типа, не заполненному строкой.
Решение — обернуть каждое потенциально пустое поле в ЕСТЬNULL со строковым значением по умолчанию:
ВЫБРАТЬ
Контрагенты.Наименование + " / "
+ ЕСТЬNULL(Контакты.Телефон, "телефон не указан") КАК Описание
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактнаяИнформация КАК Контакты
ПО Контрагенты.Ссылка = Контакты.Объект
Если значение по умолчанию должно быть пустой строкой, пишите ЕСТЬNULL(Поле, ""). Это самый частый приём при сцеплении адресов, ФИО и комментариев, где часть полей может быть не заполнена.
Сцепление неограниченных строк и полей составного типа
Поля с неограниченной длиной строки (Строка(0)), например многострочные комментарии и описания, нельзя использовать в операции сцепления напрямую — запрос выдаст ошибку «Операция не допускает использование строк неограниченной длины». Перед сцеплением такое поле нужно ограничить: ВЫРАЗИТЬ(Комментарий КАК Строка(200)).
Поле составного типа (например, реквизит, который может хранить строку или ссылку) при сцеплении ведёт себя непредсказуемо: если фактическое значение не строка, результат будет NULL или ошибкой. Надёжный шаблон — сначала привести поле к строке фиксированной длины, затем обработать NULL:
ЕСТЬNULL(ВЫРАЗИТЬ(СоставноеПоле КАК Строка(150)), "")
Для ссылочных значений (контрагент, договор, склад) сцепляйте не саму ссылку, а её строковые реквизиты — Наименование, Код, Номер. Платформа позволяет писать Документ.Контрагент.Наименование через точку, но помните, что каждое разыменование — это скрытое соединение, которое также может дать NULL.
Если сцепленная строка нужна только для показа пользователю, а не для отбора или группировки, часто выгоднее собрать её в коде при обходе выборки: там доступны Формат(), СокрЛП() и СтрШаблон(), и запрос остаётся простым и быстрым.
Практические сценарии сцепления
ФИО из трёх полей с разделителями
Классическая задача — собрать полное имя из фамилии, имени и отчества, где отчество может быть не заполнено:
ВЫБРАТЬ
ФИО.Фамилия + " " + ФИО.Имя
+ ВЫБОР
КОГДА ФИО.Отчество = "" ТОГДА ""
ИНАЧЕ " " + ФИО.Отчество
КОНЕЦ КАК ФИОПолное
ИЗ
РегистрСведений.ФИОФизическихЛиц.СрезПоследних() КАК ФИО
Конструкция ВЫБОР позволяет не добавлять лишний пробел, когда отчество пустое. Это общий приём для «опциональных» частей строки: разделитель присоединяется вместе со значением, а не отдельно.
Адрес из нескольких полей через запятую
При сборке адреса поля соединяются через ", ", и каждое потенциально пустое поле оборачивается в ЕСТЬNULL. Если нужно пропускать пустые части без лишних запятых, комбинируйте ЕСТЬNULL и ВЫБОР по тому же принципу, что и в примере с ФИО.
Сцепление в группировке и итогах
Сцеплять строки можно и в агрегатных выражениях, но помните: сцепленное поле нельзя суммировать, а группировка по длинной сцепленной строке работает медленнее, чем по исходным полям. Если строка нужна только для вывода, группируйте по исходным полям, а сцепление выполняйте в списке выборки.
- 1Определите типы всех сцепляемых полей через консоль запросов или конструктор.
- 2Приведите нестроковые поля: ВЫРАЗИТЬ(Поле КАК Строка(N)) с запасом по длине.
- 3Ограничьте неограниченные строки до фиксированной длины.
- 4Оберните поля из левых соединений и необязательные реквизиты в ЕСТЬNULL(Поле, "").
- 5Добавьте разделители строковыми литералами, опциональные части — через ВЫБОР.
- 6Выполните запрос в консоли и проверьте результат на записях с пустыми полями.
Проверка результата и производительность
Проверять сцепление удобнее всего в консоли запросов на тестовой копии базы. Обязательно протестируйте три набора данных: полностью заполненные поля, частично пустые поля и записи, где левое соединение не нашло пару. Именно на втором и третьем наборах проявляются NULL и лишние разделители.
По производительности: сцепление само по себе недорогое, но ВЫРАЗИТЬ по индексированному полю в условии ГДЕ отключает использование индекса. Поэтому никогда не фильтруйте по сцепленной строке — фильтруйте по исходным полям, а сцепление оставьте только в секции ВЫБРАТЬ.
Если строка собирается для поиска (например, полнотекстовое представление контрагента), рассмотрите альтернативу: хранить сцепленное представление в отдельном реквизите, заполняемом при записи объекта. Это убирает вычисления из запросов и ускоряет отчёты.
Как проверить результат
Пустые части заменены значением по умолчанию, лишних разделителей нет
Пустые строки там, где ожидался текст, или двойные запятые/пробелы
Число отображается полностью, без обрезки
Значение усечено — увеличьте длину в Строка(N)
Отбор выполняется по исходным полям, сцепление только в ВЫБРАТЬ
В условии ГДЕ стоит ВЫРАЗИТЬ или сцепление — индекс не используется
Частые вопросы о сцеплении строк в запросе 1С
Можно ли сцепить строки функцией, как CONCAT в SQL?
Нет, в языке запросов 1С нет функции конкатенации. Используйте только оператор «+». Если нужно собрать строку из многих значений выборки (как GROUP_CONCAT), это делается уже в коде при обходе результата запроса.
Почему запрос выдаёт ошибку при сцеплении с числом?
Запрос 1С не выполняет неявное приведение типов. Число или дату нужно явно привести: ВЫРАЗИТЬ(Поле КАК Строка(20)). Без этого платформа сообщает о несоответствии типов операндов.
Почему в результате сцепления пустые строки?
Наиболее вероятная причина — одно из слагаемых равно NULL, тогда весь результат становится NULL. Это типично для полей из левых соединений. Оберните такие поля в ЕСТЬNULL(Поле, "") и проверьте запрос повторно.
Как сцепить многострочное поле (комментарий)?
Сначала ограничьте его длину: ВЫРАЗИТЬ(Комментарий КАК Строка(500)) — неограниченные строки в сцеплении запрещены. Затем используйте обычный оператор «+», при необходимости добавив ЕСТЬNULL.
Как вставить перенос строки в сцепляемый текст?
В тексте запроса допустим строковый литерал с фактическим переводом строки внутри кавычек. На практике удобнее сцеплять части в коде встроенного языка с использованием Символы.ПС — так перенос гарантированно корректен в любой среде.
Что быстрее: сцепление в запросе или в коде?
Для небольших выборок разница незаметна. На больших объёмах сцепление в запросе обычно быстрее, так как не требует построчной обработки в коде, но приведение типов и разыменования могут замедлить сам запрос. Если строка нужна только для отображения, оба варианта допустимы — выбирайте по читаемости решения.
Что важно запомнить
Строки в запросе 1С сцепляются только оператором «+». Нестроковые значения приводите через ВЫРАЗИТЬ с запасом длины, неограниченные строки ограничивайте, NULL убирайте через ЕСТЬNULL, а фильтрацию выполняйте по исходным полям, а не по сцепленной строке.