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

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

Как соединить две строки в запросе 1С

Как соединить две строки в запросе 1С: оператор +, работа с NULL через ЕСТЬNULL, приведение типов, объединение строк в СКД и частые ошибки с примерами кода.

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

В языке запросов 1С для соединения (конкатенации) строк используется оператор «+». Базовый синтаксис выглядит так: ВЫБРАТЬ Сотрудники.Фамилия + " " + Сотрудники.Имя КАК ФИО. Между полями добавляется строковый литерал-разделитель — пробел, запятая или любой другой символ, заключённый в кавычки.

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

Базовый синтаксис: оператор «+» в языке запросов

Оператор «+» в языке запросов 1С работает как конкатенация, если оба операнда имеют строковый тип. Простейший пример — сборка ФИО из трёх реквизитов справочника:

ВЫБРАТЬ

Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО

ИЗ

Справочник.Сотрудники КАК Сотрудники

Строковые литералы в языке запросов заключаются в двойные кавычки. Если внутри литерала нужна сама кавычка, она удваивается: "Код ""ТНВЭД"": ". Разделитель может быть любым — пробел, запятая с пробелом, дефис, перенос строки через Символы.ПС недоступен напрямую в запросе, поэтому для многострочного результата склейку лучше выполнять уже в коде после выборки.

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

Защита от NULL: функция ЕСТЬNULL

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

Решение — обернуть каждое потенциально пустое поле в функцию ЕСТЬNULL:

ВЫБРАТЬ

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

ИЗ

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

Обратите внимание: ЕСТЬNULL применяется к каждому операнду отдельно, а не ко всему выражению. Обернуть всю склейку целиком бессмысленно — NULL внутри уже «отравит» результат до того, как сработает внешняя функция.

Соединение строк с нестроковыми типами

Оператор «+» для конкатенации требует, чтобы оба операнда были строками. Если попытаться сложить строку с числом, датой или ссылкой, запрос либо не выполнится с ошибкой несовместимости типов, либо вернёт неожиданный результат — поведение зависит от конкретных типов и платформы.

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

ВЫБРАТЬ

"Документ: " + ПРЕДСТАВЛЕНИЕ(Реализация.Ссылка) + " на сумму " + ПРЕДСТАВЛЕНИЕ(Реализация.СуммаДокумента) КАК Описание

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

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

Объединение строк в СКД

В системе компоновки данных конкатенация встречается в трёх местах: в тексте запроса набора данных, в вычисляемых полях и в выражениях ресурсов. В тексте запроса действуют те же правила, что описаны выше: оператор «+», ЕСТЬNULL и ПРЕДСТАВЛЕНИЕ.

В вычисляемых полях СКД используется собственный язык выражений, где строки тоже складываются оператором «+», но функции отличаются: вместо ЕСТЬNULL применяется конструкция с проверкой через ЕСТЬ NULL в функции Выбор, а представление ссылки можно получить просто обратившись к полю. Например: Фамилия + " " + Имя — корректное выражение вычисляемого поля, если оба поля строковые.

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

Где выполнять склейку

В тексте запроса

Подходит, когда по результату нужна фильтрация, группировка или соединение. Минус — нагрузка на СУБД и усложнение запроса.

Вычисляемое поле СКД

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

В коде после выборки

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

Пошаговая проверка результата

После написания выражения конкатенации его стоит проверить на реальных данных, а не только на синтаксис. Консоль запросов покажет итоговое значение и его тип сразу после выполнения.

Порядок действий
  1. 1
    Напишите выражение вида Поле1 + " " + Поле2 и задайте псевдоним через КАК
  2. 2
    Оберните поля, которые могут быть NULL, в ЕСТЬNULL(Поле, "")
  3. 3
    Приведите нестроковые поля через ПРЕДСТАВЛЕНИЕ()
  4. 4
    Выполните запрос в консоли и проверьте строки, где исходные поля пустые или не заполнены
  5. 5
    Убедитесь, что тип колонки результата — строка, а не NULL или значение составного типа

Отдельно проверьте граничные случаи: оба поля пустые, одно поле NULL, поле содержит только пробелы. Пробелы не равны NULL, поэтому ЕСТЬNULL их не отфильтрует — при необходимости добавьте обработку через СОКРЛП, если она доступна в вашей версии платформы, или обрежьте строку уже в коде.

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

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

Значение колонки в выборке
Норма

Склеенная строка с разделителем

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

Пустое значение при заполненных полях — признак NULL в одном из операндов

Тип колонки результата
Норма

Строка

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

NULL или неопределённый тип — выражение вернуло NULL

Поля из левых соединений
Норма

Обернуты в ЕСТЬNULL

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

Используются напрямую — при отсутствии связанной записи строка пропадёт

Типичные ошибки и ограничения

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

Есть и ограничения платформы. Длина результата конкатенации может обрезаться, если исходные поля имеют фиксированную длину и СУБД определяет тип результата по ним — для длинных строк используйте поля неограниченной длины или приведение. Кроме того, конкатенация в условиях ГДЕ и соединениях заметно замедляет запрос: индексы по вычисляемому выражению не используются.

Типичные ошибки
01
Склейка без ЕСТЬNULL — одно пустое поле обнуляет всю строку без какой-либо ошибки
02
Сложение строки с числом или ссылкой без ПРЕДСТАВЛЕНИЕ — ошибка несовместимости типов при выполнении
03
Конкатенация в условии соединения — резкое падение производительности на больших таблицах
04
Отсутствие разделителя между полями — ФИО сливается в одно слово
05
Ожидание, что Символы.ПС работает в запросе — в языке запросов он недоступен, перенос добавляйте в коде

Если по склеенной строке планируется поиск, рассмотрите альтернативу: фильтровать по исходным полям через И/ИЛИ, а склейку выполнять только для отображения. Это сохранит возможность использования индексов и упростит оптимизацию.

Итог

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

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

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

Можно ли соединить строки в запросе 1С без оператора «+»?

Специальной функции конкатенации вроде СОЕДИНИТЬ в языке запросов нет — «+» является единственным штатным способом. Альтернатива — собрать строку в коде после выполнения запроса с помощью СтрСоединить или обычного сложения, что удобно при сложном форматировании.

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

Почти всегда причина в NULL в одном из операндов — например, поле пришло из левого соединения без совпадения. Операция с NULL возвращает NULL без сообщения об ошибке. Оберните каждое поле в ЕСТЬNULL(Поле, "") и повторите запрос.

Как добавить перенос строки между склеиваемыми полями?

В языке запросов Символы.ПС недоступен. Выполните склейку в коде после выборки: Строка1 + Символы.ПС + Строка2. В СКД перенос можно вставить в выражении вычисляемого поля через Символ(10), но отображение зависит от настроек ячейки.

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

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

Влияет ли конкатенация на производительность запроса?

В списке выбираемых полей влияние небольшое, но заметно растёт при использовании ПРЕДСТАВЛЕНИЕ на больших выборках. Критично другое: склейка в условиях ГДЕ и соединениях отключает использование индексов, поэтому фильтруйте по исходным полям, а не по склеенному результату.

Работает ли склейка строк в виртуальных таблицах и параметрах?

Да, оператор «+» работает везде, где допустимы выражения: в полях выборки из виртуальных таблиц, в условиях, в параметрах СКД. Правила по NULL и типам остаются теми же, поэтому ЕСТЬNULL и ПРЕДСТАВЛЕНИЕ применяются аналогично.