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