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

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

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

Как соединить две строки в запросе 1С: оператор +, функция ПОДСТРОКА, склейка с разделителем, работа с NULL и типами. Примеры кода и типичные ошибки.

Объединение строк — одна из самых частых задач при написании запросов 1С: собрать ФИО из трёх полей, склеить артикул с наименованием, сформировать адрес в одну строку. В языке запросов 1С для этого используется оператор + (конкатенация), а для более сложных сценариев — функции ПОДСТРОКА, РАЗНОСТЬДАТ и приёмы обработки значений NULL.

Главная особенность: в запросе 1С нет отдельной функции CONCAT, как в чистом SQL. Оператор + работает и для чисел, и для строк, поэтому результат зависит от типов операндов. Если оба операнда — строки, получится склейка; если хотя бы один — число, выполнится сложение. Это источник большинства ошибок у начинающих разработчиков.

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

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

Базовая конструкция выглядит просто: в секции ВЫБРАТЬ поля соединяются знаком плюс. Пробелы и другие символы-разделители добавляются как строковые литералы в двойных кавычках.

ВЫБРАТЬ

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

ИЗ

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

Количество операндов не ограничено — можно склеивать три, пять и больше полей в одном выражении. Результату принято давать псевдоним через КАК, чтобы удобно обращаться к нему при обходе выборки.

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

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

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

Пробел, запятая, дефис

ВЫБРАТЬ

Номенклатура.Артикул + " — " + Номенклатура.Наименование КАК Представление

ИЗ

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

Литерал записывается в двойных кавычках прямо в тексте запроса. Если внутри разделителя нужна сама кавычка, она удваивается: "Код ""Т""".

Перенос строки

Для многострочного результата (например, адреса в печатной форме) используется символ перевода строки. В тексте запроса его можно вставить через функцию СИМВОЛ(10) — но этой функции в языке запросов нет, поэтому перенос обычно добавляют уже в коде при обработке результата, либо передают в запрос параметром:

Запрос.УстановитьПараметр("ПС", Символы.ПС);

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Город + &ПС + Контрагенты.Улица КАК Адрес

|ИЗ

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

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

Если склеенное представление нужно в нескольких запросах конфигурации, вынесите формирование строки в общий модуль и передавайте готовое выражение или собирайте представление после выборки. Так проще поддерживать единый формат ФИО или адреса.
ПЗ
Практическое замечание

Обработка NULL при склейке строк

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

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

ВЫБРАТЬ

ЕСТЬNULL(Контрагенты.Наименование, "") + " (" + ЕСТЬNULL(Контрагенты.ИНН, "без ИНН") + ")" КАК Представление

ИЗ

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

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

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

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

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

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Реализация.Контрагент) + ", договор: " + ПРЕДСТАВЛЕНИЕ(Реализация.Договор) КАК Описание

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

Для чисел и дат универсальной функции преобразования в строку в языке запросов нет. Практические варианты: привести число к строке через ВЫРАЗИТЬ нельзя, поэтому число форматируют уже в коде через Формат(), либо используют ПОДСТРОКА над строковым полем, если исходник строковый. Даты при необходимости собирают из частей через ДЕНЬ, МЕСЯЦ, ГОД — но чаще форматирование даты делают после запроса.

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

Ограничение длины и функция ПОДСТРОКА

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

Решение — явно привести результат к строке нужной длины через ВЫРАЗИТЬ:

ВЫБРАТЬ

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

ИЗ

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

Обратная задача — взять часть строки — решается функцией ПОДСТРОКА(Строка, Начало, Длина). Например, склеить инициалы: ПОДСТРОКА(Имя, 1, 1) + "." + ПОДСТРОКА(Отчество, 1, 1) + ". " + Фамилия.

Учтите: если исходная строка короче указанной позиции, ПОДСТРОКА вернёт пустую строку, а не ошибку — это безопасно для склейки, но стоит проверять на коротких значениях вроде однобуквенных имён.

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

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

Значение в выборке
Норма

Строка содержит оба поля с разделителем

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

Пустая строка или NULL — не обработаны пустые поля

Длинные значения
Норма

Текст выводится целиком

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

Строка обрезана — добавьте ВЫРАЗИТЬ ... КАК СТРОКА(N)

Числовые поля
Норма

Число отображается как текст в составе строки

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

Ошибка типов или сумма вместо склейки

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

Не всегда строки нужно соединять именно в запросе. Если требуется сложное форматирование — Формат(), Символы.ПС, условная логика по нескольким полям — проще выбрать поля по отдельности и собрать строку при обходе выборки:

Выборка = Запрос.Выполнить().Выбрать();

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

ФИО = СокрЛП(Выборка.Фамилия + " " + Выборка.Имя + " " + Выборка.Отчество);

КонецЦикла;

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

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

Конкатенация в запросе (+)

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

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

Быстрый способ вывести ссылку текстом; не используйте в соединениях и условиях из-за производительности

Склейка в коде после выборки

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

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

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

Если запрос строится динамически в коде, выведите итоговый текст через Сообщить() или в журнал регистрации перед выполнением — так видно, какой именно текст ушёл в СУБД. Для СКД проверяйте выражение на закладке «Наборы данных», там же виден тип результата.

Порядок действий
  1. 1
    Определите типы склеиваемых полей: строки соединяйте напрямую, ссылки — через ПРЕДСТАВЛЕНИЕ
  2. 2
    Оберните поля, которые могут быть NULL, в ЕСТЬNULL(Поле, "")
  3. 3
    Добавьте разделители строковыми литералами между полями
  4. 4
    При работе с длинными текстами примените ВЫРАЗИТЬ(... КАК СТРОКА(N))
  5. 5
    Проверьте запрос в консоли на записях с пустыми и длинными значениями

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

Как соединить больше двух строк в запросе 1С?

Тем же оператором +, перечисляя операнды подряд: Поле1 + " " + Поле2 + " " + Поле3. Количество операндов не ограничено, но при склейке многих полей каждое потенциально пустое стоит обернуть в ЕСТЬNULL.

Почему вместо склейки строк получилось число?

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

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

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

Результат склейки обрезался — что делать?

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

Можно ли использовать склеенную строку в условии ГДЕ?

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

Чем ПРЕДСТАВЛЕНИЕ отличается от обращения к полю Наименование?

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

Итог

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

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