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