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