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

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

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

Как сложить две строки в запросе 1С: оператор «+», функция ВЫРАЗИТЬ для неограниченных строк, объединение ФИО, типичные ошибки и примеры кода.

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

Ниже разобраны рабочие способы конкатенации: простое сложение полей, приведение типов, добавление разделителей, обработка значений NULL и числовых полей. Каждый пример можно скопировать в консоль запросов и проверить на своих данных.

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

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

ВЫБРАТЬ

ФизическиеЛица.Фамилия + " " + ФизическиеЛица.Имя + " " + ФизическиеЛица.Отчество КАК ФИО

ИЗ

Справочник.ФизическиеЛица КАК ФизическиеЛица

Этот запрос вернёт одну колонку ФИО, где части разделены пробелами. Псевдоним КАК ФИО обязателен, если поле будет использоваться дальше — в СКД, выгрузке в таблицу значений или обходе результата. Без псевдонима платформа присвоит служебное имя, к которому неудобно обращаться из кода.

Обратите внимание: конкатенация выполняется на стороне СУБД при каждом выполнении запроса. На больших таблицах это заметная нагрузка, особенно если склеенное поле потом используется в условиях соединения или отбора. Для отборов лучше использовать исходные поля, а не результат склейки.

Почему возникает ошибка и как её исправить через ВЫРАЗИТЬ

Оператор «+» для строк в запросе 1С работает только со строками фиксированной (ограниченной) длины. Если реквизит объявлен как строка неограниченной длины — например, поле «Описание», «Комментарий» или «ДополнительнаяИнформация» — запрос упадёт с ошибкой несовместимости типов.

Приведение типа функцией ВЫРАЗИТЬ

Решение — привести неограниченную строку к ограниченной с помощью ВЫРАЗИТЬ:

ВЫБРАТЬ

Товары.Наименование + " — " + ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(150)) КАК НаименованиеСОписанием

ИЗ

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

Длина в скобках выбирается под задачу: если описание длиннее указанного значения, оно будет обрезано без ошибки. Это нужно учитывать, когда склеенная строка идёт в печатную форму или выгрузку — данные могут потеряться молча.

Проверка длины данных перед склейкой

Чтобы узнать фактическую максимальную длину поля, выполните служебный запрос:

ВЫБРАТЬ

МАКСИМУМ(ДЛИНАСТРОКИ(ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(1000)))) КАК МаксДлина

ИЗ

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

Полученное значение с небольшим запасом и укажите в ВЫРАЗИТЬ. Это дешевле, чем потом искать причину обрезанных строк в отчётах.

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

Строковые литералы в запросе записываются в двойных кавычках и участвуют в конкатенации наравне с полями. Так формируют читаемые представления: «Иванов И. И.», «Товар (арт. 12345)», «г. Москва, ул. Ленина, д. 1».

ВЫБРАТЬ

Контрагенты.Наименование + " (ИНН " + Контрагенты.ИНН + ")" КАК Представление

ИЗ

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

Частая задача — перенос строки внутри склеенного значения, например для многострочного адреса в печатной форме. В тексте запроса перенос вставляется через символ перевода строки, который удобнее добавлять уже во встроенном языке после получения результата, либо через Символы.ПС при постобработке. В чистом запросе многострочный литерал можно записать с помощью вертикальной черты в начале каждой новой строки литерала — так же, как в обычном коде 1С.

Обработка NULL и пустых значений при конкатенации

Если хотя бы один из операндов равен NULL, результат всей склейки тоже будет NULL — это стандартное поведение NULL в запросах 1С. NULL появляется при левых соединениях, когда в присоединённой таблице нет подходящей записи, или при обращении к реквизиту через точку от пустой ссылки.

Защита — функция ЕСТЬNULL, которая подставляет значение по умолчанию:

ВЫБРАТЬ

Заказы.Номер + " / " + ЕСТЬNULL(Менеджеры.Наименование, "не назначен") КАК ЗаказИМенеджер

ИЗ

Документ.ЗаказКлиента КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Менеджеры

ПО Заказы.Менеджер = Менеджеры.Ссылка

Для полей, где вместо NULL возможна пустая строка, ЕСТЬNULL не поможет — пустая строка не равна NULL. Тогда используйте конструкцию ВЫБОР:

ВЫБОР

КОГДА Контрагенты.Телефон = ""

ТОГДА Контрагенты.Наименование

ИНАЧЕ Контрагенты.Наименование + ", тел. " + Контрагенты.Телефон

КОНЕЦ КАК Представление

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

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

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

ВЫБРАТЬ

"Заказ № " + ПРЕДСТАВЛЕНИЕ(Заказы.Номер) + " от " + ПРЕДСТАВЛЕНИЕ(Заказы.Дата) КАК Описание

ИЗ

Документ.ЗаказКлиента КАК Заказы

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

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

Способы получить строковое значение

Оператор «+»

Прямая конкатенация строк ограниченной длины. Быстро и просто, но не работает с неограниченными строками и другими типами.

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

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

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

Преобразует число, дату или ссылку в строку. Формат зависит от настроек сервера, результат — неограниченная строка.

Склейка во встроенном языке

СтрШаблон() или «+» в коде после выполнения запроса. Гибче и без ограничений на длину, но требует обхода результата и не подходит для СКД.

Когда лучше склеивать строки не в запросе, а в коде

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

СтрокаРезультата = СтрШаблон("%1 %2 %3",

Выборка.Фамилия, Выборка.Имя, Выборка.Отчество);

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

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

Как выбрать способ

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

Проверка результата и отладка

Перед внедрением склейки в рабочий запрос проверьте её в консоли запросов на реальных данных. Обращайте внимание на три вещи: нет ли значений NULL в итоговой колонке, не обрезаны ли строки (сравните длину результата с суммой длин исходных полей), корректно ли выглядят записи с пустыми исходными полями.

Быстрый способ найти проблемные записи — добавить в отбор условие на длину результата или на NULL:

ВЫБРАТЬ

Товары.Наименование + " — " + ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(150)) КАК Результат

ИЗ

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

ГДЕ

Товары.Наименование + " — " + ВЫРАЗИТЬ(Товары.Описание КАК СТРОКА(150)) ЕСТЬ NULL

Если запрос возвращает строки — значит, где-то в данных встречается NULL, и нужно добавить ЕСТЬNULL. Такая проверка занимает минуту, но избавляет от сюрпризов в отчётах и печатных формах.

Итог

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

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

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

Почему запрос с оператором «+» выдаёт ошибку «Несовместимые типы»?

Почти всегда причина в том, что одно из полей — строка неограниченной длины. Оператор сложения строк в языке запросов работает только с ограниченными строками. Приведите поле функцией ВЫРАЗИТЬ(Поле КАК Строка(N)) — и ошибка исчезнет.

Как склеить ФИО, если отчество может быть не заполнено?

Если отчество — пустая строка, склейка даст лишний пробел в конце. Используйте ВЫБОР КОГДА Отчество = "" ТОГДА Фамилия + " " + Имя ИНАЧЕ Фамилия + " " + Имя + " " + Отчество КОНЕЦ. Если поле может быть NULL (например, после соединения), добавьте ЕСТЬNULL.

Как вставить перенос строки в склеенное значение?

В тексте запроса литерал с переносом записывается с вертикальной чертой в начале каждой новой строки. Практичнее альтернатива: склеить части в запросе с символом-маркером, а в коде заменить его на Символы.ПС перед выводом в макет.

Можно ли склеить строки из нескольких строк таблицы в одну?

Оператор «+» работает только внутри одной строки выборки. Для объединения значений из нескольких строк (например, всех товаров документа в одну строку) в языке запросов штатной агрегатной функции нет — это делается обходом результата в коде или настройкой ресурсов в СКД с вычисляемым выражением.

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

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

Чем отличается склейка в запросе от СтрСоединить() в коде?

СтрСоединить() во встроенном языке склеивает массив строк с разделителем и не имеет ограничений на длину и типы (значения приводятся автоматически). В запросе разделитель нужно вставлять вручную между каждой парой полей, а типы контролировать самостоятельно. Для сложного форматирования код удобнее, для отчётов на СКД — склейка в запросе.