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

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

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

Как объединить два поля в запросе 1С через оператор «+», приведение типов, разделители, работа с NULL и типичные ошибки конкатенации строк.

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

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

Базовый синтаксис объединения полей

Простейший вариант — сложение двух строковых реквизитов через оператор +. Между полями обычно вставляют разделитель: пробел, запятую, дефис или перенос строки. Разделитель задаётся строковым литералом в кавычках.

ВЫБРАТЬ

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

Номенклатура.Артикул + " / " + Номенклатура.Наименование КАК ТоварПредставление

ИЗ

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

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

Оператор + в языке запросов 1С перегружен: для чисел это арифметическое сложение, для строк — конкатенация. Платформа определяет поведение по типам операндов. Если сложить строку и число напрямую, запрос не выполнится — будет ошибка несовместимости типов на этапе исполнения.

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

bsl
ВЫБРАТЬ Контрагенты.Наименование + " (" + Контрагенты.ИНН + ")" КАК КонтрагентСИНН ИЗ Справочник.Контрагенты КАК Контрагенты

Объединение полей разных типов

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

Приведение через ВЫРАЗИТЬ

Оператор ВЫРАЗИТЬ(... КАК Строка(N)) приводит значение к строке заданной длины. Он подходит для чисел и некоторых примитивных типов. Длину указывайте с запасом: если значение не помещается, оно будет обрезано без предупреждения.

ВЫБРАТЬ

Товары.Наименование + ", остаток: " + ВЫРАЗИТЬ(Остатки.Количество КАК Строка(15)) КАК Описание

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

Получение представления через ПРЕДСТАВЛЕНИЕ

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

ВЫБРАТЬ

"Реализация № " + Реализация.Номер + " от " + ПРЕДСТАВЛЕНИЕ(Реализация.Дата) КАК Заголовок

ИЗ

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

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

Способы приведения к строке

ВЫРАЗИТЬ(... КАК Строка(N))

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

ПРЕДСТАВЛЕНИЕ()

Работает с любыми типами, включая ссылки и даты. Дает строку неограниченной длины, результат зависит от настроек объекта и локали.

ПОДСТРОКА + ВЫРАЗИТЬ

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

Обработка NULL при объединении

Это самая частая причина «пропадающих» данных. Если запрос использует левое соединение и одно из склеиваемых полей пришло из присоединённой таблицы, при отсутствии сопоставленной записи поле будет NULL. Любая операция сложения с NULL даёт NULL — и вся объединённая строка исчезнет, даже если второе поле заполнено.

Решение — функция ЕСТЬNULL(Поле, ""), которая подставляет пустую строку вместо NULL. Оборачивайте ею каждое поле, которое потенциально может быть пустым.

ВЫБРАТЬ

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

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Адреса КАК Адреса

ПО Контрагенты.Ссылка = Адреса.Контрагент

Разделители, переносы строк и форматирование

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

Типовые разделители и их назначение:

  • " " — пробел: ФИО, составные наименования;
  • ", " — запятая с пробелом: адреса, перечисления характеристик;
  • " / " или " - " — визуальное отделение кода от наименования;
  • перенос строки — многострочные адреса в печатных формах.

Для чисел и дат внутри склеенной строки помните о форматировании: ВЫРАЗИТЬ выдаст число в «сыром» виде, без разделителей групп и нужного количества знаков. Если требуется красивое представление суммы или даты, форматируйте её уже на уровне встроенного языка функцией Формат() после выполнения запроса, а не внутри него.

Ограничения и влияние на производительность

Объединённые строки имеют ограничения, о которых нужно помнить при проектировании запроса:

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

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

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

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

После написания запроса проверьте его в консоли запросов на реальных данных, включая «плохие» случаи: записи с пустыми полями, отсутствующие связанные данные, длинные значения. Убедитесь, что объединённая строка выглядит ожидаемо во всех сценариях.

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

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

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

Виден разделитель и заполненная часть, строка не пустая целиком

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

Вся объединённая строка пуста — значит, NULL не обработан через ЕСТЬNULL

Поля с числами и датами
Норма

Значения читаемы и полностью помещаются

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

Числа обрезаны или запрос не выполняется — проверьте длину в ВЫРАЗИТЬ и типы операндов

Длинные наименования
Норма

Строка не усечена

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

Конец строки отсутствует — увеличьте длину или используйте неограниченную строку

Если конкатенация нужна не в запросе, а при построчной обработке, альтернатива — склейка на встроенном языке через функцию СтрШаблон() или шаблоны с Строка(). Для отчётов на СКД ещё один вариант — вычисляемое поле в схеме компоновки, где доступны функции встроенного языка, включая Формат(). Это удобно, когда форматирование сложное и в запросе его не выразить.

Маршрут решения

Как выбрать подход

Нужно просто склеить строковые поля для выводаИспользуйте оператор «+» с разделителем прямо в запросе
Одно из полей — число, дата или ссылкаПриведите через ВЫРАЗИТЬ или ПРЕДСТАВЛЕНИЕ
Поля приходят из левого соединенияОберните каждое поле в ЕСТЬNULL(Поле, "")
Требуется сложное форматирование суммы или датыСклеивайте в коде через СтрШаблон или в вычисляемом поле СКД
По значению нужно фильтровать или соединять таблицыНе склеивайте — работайте с исходными полями

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

Есть ли в языке запросов 1С функция CONCAT?

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

Почему объединённое поле пустое, хотя исходные поля заполнены?

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

Как объединить более двух полей?

Оператор «+» применяется последовательно: Поле1 + " " + Поле2 + ", " + Поле3 и так далее. Количество операндов не ограничено, но каждый нестроковый нужно приводить к строке, а потенциально пустые — оборачивать в ЕСТЬNULL.

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

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

Можно ли сортировать или группировать по объединённому полю?

Технически да — по псевдониму поля в предложениях УПОРЯДОЧИТЬ ПО и СГРУППИРОВАТЬ ПО. Но это медленнее сортировки по исходным полям и не использует индексы. По возможности сортируйте по исходным реквизитам в том же порядке, что и в склейке.

Чем отличается ВЫРАЗИТЬ от ПРЕДСТАВЛЕНИЕ при склейке?

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

Итог

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

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