Разработка и Конфигурация · 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 + " " + Поле2 и задайте псевдоним через КАК
- 2Оберните поля, которые могут быть NULL, в ЕСТЬNULL(Поле, "")
- 3Приведите нестроковые поля через ПРЕДСТАВЛЕНИЕ()
- 4Выполните запрос в консоли и проверьте строки, где исходные поля пустые или не заполнены
- 5Убедитесь, что тип колонки результата — строка, а не NULL или значение составного типа
Отдельно проверьте граничные случаи: оба поля пустые, одно поле NULL, поле содержит только пробелы. Пробелы не равны NULL, поэтому ЕСТЬNULL их не отфильтрует — при необходимости добавьте обработку через СОКРЛП, если она доступна в вашей версии платформы, или обрежьте строку уже в коде.
Как проверить результат
Склеенная строка с разделителем
Пустое значение при заполненных полях — признак NULL в одном из операндов
Строка
NULL или неопределённый тип — выражение вернуло NULL
Обернуты в ЕСТЬNULL
Используются напрямую — при отсутствии связанной записи строка пропадёт
Типичные ошибки и ограничения
Первая группа ошибок связана с типами: попытка сложить строку с числом без приведения, использование ВЫРАЗИТЬ для ссылки (что не поддерживается) и забытый ПРЕДСТАВЛЕНИЕ для даты. Вторая группа — логические: отсутствие разделителя между полями, двойные пробелы при пустом среднем поле, склейка без ЕСТЬNULL.
Есть и ограничения платформы. Длина результата конкатенации может обрезаться, если исходные поля имеют фиксированную длину и СУБД определяет тип результата по ним — для длинных строк используйте поля неограниченной длины или приведение. Кроме того, конкатенация в условиях ГДЕ и соединениях заметно замедляет запрос: индексы по вычисляемому выражению не используются.
Если по склеенной строке планируется поиск, рассмотрите альтернативу: фильтровать по исходным полям через И/ИЛИ, а склейку выполнять только для отображения. Это сохранит возможность использования индексов и упростит оптимизацию.
Что важно запомнить
Строки в запросе 1С соединяются оператором «+» с литералом-разделителем в кавычках. Каждое поле, которое может быть NULL, оборачивайте в ЕСТЬNULL, нестроковые типы приводите через ПРЕДСТАВЛЕНИЕ. Для отчётов без фильтрации по результату склейку выносите в вычисляемые поля СКД.
Частые вопросы
Можно ли соединить строки в запросе 1С без оператора «+»?
Специальной функции конкатенации вроде СОЕДИНИТЬ в языке запросов нет — «+» является единственным штатным способом. Альтернатива — собрать строку в коде после выполнения запроса с помощью СтрСоединить или обычного сложения, что удобно при сложном форматировании.
Почему в результате склейки пусто, хотя поля заполнены?
Почти всегда причина в NULL в одном из операндов — например, поле пришло из левого соединения без совпадения. Операция с NULL возвращает NULL без сообщения об ошибке. Оберните каждое поле в ЕСТЬNULL(Поле, "") и повторите запрос.
Как добавить перенос строки между склеиваемыми полями?
В языке запросов Символы.ПС недоступен. Выполните склейку в коде после выборки: Строка1 + Символы.ПС + Строка2. В СКД перенос можно вставить в выражении вычисляемого поля через Символ(10), но отображение зависит от настроек ячейки.
Как склеить строку с датой или числом?
Используйте ПРЕДСТАВЛЕНИЕ(Поле) — оно вернёт строковое представление даты, числа или ссылки в пользовательском формате. Прямое сложение строки с числом или датой приведёт к ошибке несовместимости типов.
Влияет ли конкатенация на производительность запроса?
В списке выбираемых полей влияние небольшое, но заметно растёт при использовании ПРЕДСТАВЛЕНИЕ на больших выборках. Критично другое: склейка в условиях ГДЕ и соединениях отключает использование индексов, поэтому фильтруйте по исходным полям, а не по склеенному результату.
Работает ли склейка строк в виртуальных таблицах и параметрах?
Да, оператор «+» работает везде, где допустимы выражения: в полях выборки из виртуальных таблиц, в условиях, в параметрах СКД. Правила по NULL и типам остаются теми же, поэтому ЕСТЬNULL и ПРЕДСТАВЛЕНИЕ применяются аналогично.