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

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

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

Как соединить две строки в запросе 1С: оператор «+», ВЫРАЗИТЬ, работа с NULL, соединение полей с разделителем, типичные ошибки и примеры кода.

Соединение строк в запросе 1С — типовая задача при формировании представлений ссылок, сборке ФИО из отдельных полей, склейке адреса или подготовке данных для печатных форм. В языке запросов 1С для этого используется оператор сложения «+», который для строковых операндов работает как конкатенация.

В отличие от SQL, где применяются функции CONCAT или оператор «||», в запросах 1С синтаксис предельно прост: Строка1 + Строка2. Однако есть нюансы: поведение при значении NULL, ограничения на длину строки, необходимость приведения типов и отличия в работе с неограниченными строками. Именно эти тонкости чаще всего становятся причиной ошибок «Несовместимые типы» или пустого результата.

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

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

Простейший вариант — сложение двух строковых полей или поля со строковым литералом. Литералы в языке запросов заключаются в двойные кавычки.

ВЫБРАТЬ

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

ИЗ

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

Оба операнда должны иметь строковый тип. Если попытаться сложить строку с числом или датой напрямую, конструктор запроса выдаст ошибку несовместимости типов. Псевдоним поля после ключевого слова КАК задаёт имя колонки в результате — это удобно при дальнейшей обработке выборки в коде.

Количество соединяемых фрагментов не ограничено: можно склеивать три, пять и более строк в одном выражении, последовательно перечисляя их через «+».

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

На практике редко нужно просто «слипнуть» две строки — обычно между ними требуется пробел, запятая, дефис или перенос. Разделитель добавляется как строковый литерал между полями.

ВЫБРАТЬ

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

ИЗ

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

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

При сборке адреса из нескольких полей (индекс, город, улица, дом) заранее решите, как обрабатывать пустые части: иначе получите двойные запятые или висячие разделители. Запрос не умеет «умно» пропускать пустые фрагменты — это придётся делать через ВЫБОР или постобработку.

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

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

ВЫБРАТЬ

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

ИЗ

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

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

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

Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) подставляет указанное значение, если поле равно NULL. Для строк подставляйте пустую строку "" или осмысленный текст-заменитель.

Приведение типов: числа, даты и ограничение длины

Соединение строки с числом или датой

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

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

Ограничение длины и ВЫРАЗИТЬ

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

ВЫБРАТЬ

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

ИЗ

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

Строки неограниченной длины (СТРОКА(0)) нельзя использовать в группировках, сравнениях и соединениях — это ограничение платформы. Если планируете группировать по склеенному полю, приведите его к конкретной длине через ВЫРАЗИТЬ.

Типичные ошибки
01
Сложение строки с числом без преобразования — запрос не выполняется с ошибкой несовместимых типов
02
Игнорирование NULL в одном из полей — вся склеенная строка становится NULL
03
Группировка по строке неограниченной длины — ошибка построения запроса
04
Ожидание, что пустые части адреса будут автоматически пропущены — получаются лишние разделители

Альтернатива: склейка в коде вместо запроса

Не всегда конкатенацию нужно делать именно в запросе. Если требуется сложное форматирование — числа с разделителями разрядов, даты в нужном формате, условные разделители — надёжнее выбрать поля отдельными колонками и собрать строку в модуле.

Пока Выборка.Следующий() Цикл

Представление = СтрШаблон("%1, ИНН %2, заказ от %3",

Выборка.Наименование,

Выборка.ИНН,

Формат(Выборка.ДатаЗаказа, "ДЛФ=D"));

КонецЦикла;

Такой подход даёт полный контроль над форматом, не упирается в ограничения языка запросов и проще отлаживается. В запросе оставляйте конкатенацию только там, где склеенное значение нужно для фильтрации, соединения или группировки на уровне СУБД.

Сравнение вариантов

Оператор «+» в запросе

Подходит для простой склейки строк и использования результата в фильтрах и группировках; не работает с числами и датами напрямую

ПРЕДСТАВЛЕНИЕ() в запросе

Удобно для ссылочных полей; не применяется к примитивным типам

Склейка в модуле через СтрШаблон

Максимальная гибкость форматирования; результат нельзя использовать в условиях запроса

Проверка результата в консоли запросов

Перед внедрением выражения в рабочий код проверьте его в консоли запросов (встроенной в конфигураторе через «Конструктор запроса» или в типовых инструментах разработчика). Выполните запрос и убедитесь, что колонка заполнена, разделители стоят корректно, а строк с NULL нет.

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

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

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

Заполненность колонки
Норма

Все строки содержат склеенное значение

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

Часть строк пуста — вероятен NULL в одном из полей

Разделители
Норма

Один пробел или запятая между частями

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

Двойные разделители из-за пустых реквизитов

Длина результата
Норма

Длинные значения отображаются полностью

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

Строка обрезана — увеличьте длину через ВЫРАЗИТЬ

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

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

Нет. В языке запросов 1С конкатенация выполняется только оператором «+». Попытка написать CONCAT приведёт к ошибке разбора запроса.

Почему в результате склейки пусто, хотя оба поля заполнены?

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

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

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

Можно ли сгруппировать результат по склеенному полю?

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

Как добавить перенос строки между склеиваемыми частями?

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

Обрезается ли результат, если поле имеет фиксированную длину?

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

Итог

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

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