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

Разработка и Конфигурация · 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(Поле, ""). Это самый частый приём при сцеплении адресов, ФИО и комментариев, где часть полей может быть не заполнена.

Типичные ошибки
01
Сцепление поля из левого соединения без ЕСТЬNULL — в результате получаются пустые строки там, где соединение не нашло пару.
02
Сложение строки с числом без ВЫРАЗИТЬ — запрос падает с ошибкой несоответствия типов.
03
Сцепление неограниченной строки (Строка(0)) — платформа отказывает в выполнении; сначала приведите поле к Строка(N).
04
Слишком короткая длина в ВЫРАЗИТЬ(... КАК Строка(5)) — значение молча обрезается.

Сцепление неограниченных строк и полей составного типа

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

Поле составного типа (например, реквизит, который может хранить строку или ссылку) при сцеплении ведёт себя непредсказуемо: если фактическое значение не строка, результат будет NULL или ошибкой. Надёжный шаблон — сначала привести поле к строке фиксированной длины, затем обработать NULL:

ЕСТЬNULL(ВЫРАЗИТЬ(СоставноеПоле КАК Строка(150)), "")

Для ссылочных значений (контрагент, договор, склад) сцепляйте не саму ссылку, а её строковые реквизиты — Наименование, Код, Номер. Платформа позволяет писать Документ.Контрагент.Наименование через точку, но помните, что каждое разыменование — это скрытое соединение, которое также может дать NULL.

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

Практические сценарии сцепления

ФИО из трёх полей с разделителями

Классическая задача — собрать полное имя из фамилии, имени и отчества, где отчество может быть не заполнено:

ВЫБРАТЬ

ФИО.Фамилия + " " + ФИО.Имя

+ ВЫБОР

КОГДА ФИО.Отчество = "" ТОГДА ""

ИНАЧЕ " " + ФИО.Отчество

КОНЕЦ КАК ФИОПолное

ИЗ

РегистрСведений.ФИОФизическихЛиц.СрезПоследних() КАК ФИО

Конструкция ВЫБОР позволяет не добавлять лишний пробел, когда отчество пустое. Это общий приём для «опциональных» частей строки: разделитель присоединяется вместе со значением, а не отдельно.

Адрес из нескольких полей через запятую

При сборке адреса поля соединяются через ", ", и каждое потенциально пустое поле оборачивается в ЕСТЬNULL. Если нужно пропускать пустые части без лишних запятых, комбинируйте ЕСТЬNULL и ВЫБОР по тому же принципу, что и в примере с ФИО.

Сцепление в группировке и итогах

Сцеплять строки можно и в агрегатных выражениях, но помните: сцепленное поле нельзя суммировать, а группировка по длинной сцепленной строке работает медленнее, чем по исходным полям. Если строка нужна только для вывода, группируйте по исходным полям, а сцепление выполняйте в списке выборки.

Порядок действий при сцеплении
  1. 1
    Определите типы всех сцепляемых полей через консоль запросов или конструктор.
  2. 2
    Приведите нестроковые поля: ВЫРАЗИТЬ(Поле КАК Строка(N)) с запасом по длине.
  3. 3
    Ограничьте неограниченные строки до фиксированной длины.
  4. 4
    Оберните поля из левых соединений и необязательные реквизиты в ЕСТЬNULL(Поле, "").
  5. 5
    Добавьте разделители строковыми литералами, опциональные части — через ВЫБОР.
  6. 6
    Выполните запрос в консоли и проверьте результат на записях с пустыми полями.

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

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

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

Если строка собирается для поиска (например, полнотекстовое представление контрагента), рассмотрите альтернативу: хранить сцепленное представление в отдельном реквизите, заполняемом при записи объекта. Это убирает вычисления из запросов и ускоряет отчёты.

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

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

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

Пустые части заменены значением по умолчанию, лишних разделителей нет

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

Пустые строки там, где ожидался текст, или двойные запятые/пробелы

Сцепление чисел
Норма

Число отображается полностью, без обрезки

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

Значение усечено — увеличьте длину в Строка(N)

Скорость запроса
Норма

Отбор выполняется по исходным полям, сцепление только в ВЫБРАТЬ

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

В условии ГДЕ стоит ВЫРАЗИТЬ или сцепление — индекс не используется

Частые вопросы о сцеплении строк в запросе 1С

Можно ли сцепить строки функцией, как CONCAT в SQL?

Нет, в языке запросов 1С нет функции конкатенации. Используйте только оператор «+». Если нужно собрать строку из многих значений выборки (как GROUP_CONCAT), это делается уже в коде при обходе результата запроса.

Почему запрос выдаёт ошибку при сцеплении с числом?

Запрос 1С не выполняет неявное приведение типов. Число или дату нужно явно привести: ВЫРАЗИТЬ(Поле КАК Строка(20)). Без этого платформа сообщает о несоответствии типов операндов.

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

Наиболее вероятная причина — одно из слагаемых равно NULL, тогда весь результат становится NULL. Это типично для полей из левых соединений. Оберните такие поля в ЕСТЬNULL(Поле, "") и проверьте запрос повторно.

Как сцепить многострочное поле (комментарий)?

Сначала ограничьте его длину: ВЫРАЗИТЬ(Комментарий КАК Строка(500)) — неограниченные строки в сцеплении запрещены. Затем используйте обычный оператор «+», при необходимости добавив ЕСТЬNULL.

Как вставить перенос строки в сцепляемый текст?

В тексте запроса допустим строковый литерал с фактическим переводом строки внутри кавычек. На практике удобнее сцеплять части в коде встроенного языка с использованием Символы.ПС — так перенос гарантированно корректен в любой среде.

Что быстрее: сцепление в запросе или в коде?

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

Итог

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

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