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

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

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

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

Склейка (конкатенация) строк в запросе 1С выполняется оператором «+» прямо в тексте запроса — без обращения к функциям встроенного языка. Это нужно, когда требуется собрать ФИО из трёх полей, сформировать полное наименование товара с артикулом или объединить адрес из отдельных реквизитов. В отличие от SQL-диалектов, в языке запросов 1С нет функций CONCAT или CONCAT_WS — только оператор сложения строк и вспомогательные функции работы с подстроками.

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

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

Простейший вариант — сложение двух строковых полей с разделителем. Разделитель (пробел, запятая, дефис) задаётся строковым литералом в двойных кавычках:

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

"ВЫБРАТЬ

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

|ИЗ

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

Обратите внимание на двойные кавычки внутри текста запроса: в модуле 1С они экранируются удвоением, поэтому литерал пробела выглядит как "" "". Если текст запроса набирается через конструктор, он подставит экранирование автоматически; при ручном наборе это самая частая причина синтаксической ошибки.

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

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

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

Попытка сложить строку с числом напрямую ("Остаток: " + Остатки.Количество) приведёт к ошибке «Несоответствие типов в операции сложения». Язык запросов 1С не выполняет неявного преобразования типов при сложении, в отличие от некоторых SQL-диалектов.

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

ВЫБРАТЬ

Номенклатура.Наименование + " (арт. " + ПРЕДСТАВЛЕНИЕ(Номенклатура.Код) + ")" КАК ПолноеНаименование

ИЗ

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

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

Функции ПОДСТРОКА и ВЫРАЗИТЬ как КАК Строка(N)

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

ВЫБРАТЬ

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

+ ПОДСТРОКА(Сотрудники.Имя, 1, 1) + "."

+ ПОДСТРОКА(Сотрудники.Отчество, 1, 1) + "." КАК ФИОКратко

ИЗ

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

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

ВЫБРАТЬ

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

ИЗ

Справочник.Товары КАК Товары

При выборе длины N ориентируйтесь на реальные данные: если обрезать описание до 50 символов, а типичная длина — 200, часть информации будет безвозвратно потеряна в результате запроса. Проверить максимальную фактическую длину можно запросом с функцией ДЛИНАСТРОКИ() и агрегатом МАКСИМУМ.

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

Оператор «+»

Основной способ склейки строковых полей и литералов. Требует, чтобы все операнды были строками.

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

Подходит для склейки с числами, датами и ссылками. Формат зависит от настроек базы, точный контроль невозможен.

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

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

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

Даёт полный контроль формата через Формат() и СтроковыеФункцииКлиентСервер, но требует обхода выборки и не работает в СКД на уровне запроса.

Склейка значений из нескольких строк в одну

Частая задача — собрать в одну строку значения из нескольких записей: список товаров документа, перечень телефонов контрагента. Язык запросов 1С не имеет агрегатной функции типа STRING_AGG, поэтому прямой склейки по группе в одном запросе нет.

Рабочие варианты такие. Первый — выгрузить детальные строки запросом и склеить их в коде, обходя выборку с группировкой по ключу. Второй — использовать СКД: в ресурсах или вычисляемых полях доступны функции встроенного языка, и там можно написать собственную функцию склейки через ОбщийМодуль.Функция() в выражении. Третий — если количество значений ограничено и известно (например, не более трёх телефонов), собрать их через несколько левых соединений с условиями на номер строки и склеить оператором «+».

Выбор зависит от объёма данных: для отчёта по сотням документов склейка в коде после выборки обычно быстрее и проще в поддержке, чем сложный запрос с множественными соединениями.

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

Как выбрать действие

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

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

Если хотя бы один операнд в сложении равен NULL, весь результат становится NULL. Это типичная ситуация при левых соединениях: у части контрагентов нет телефона, и итоговая строка «Иванов, тел. NULL» превращается просто в NULL, хотя фамилия есть.

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

ВЫБРАТЬ

Контрагенты.Наименование + ", тел. "

+ ЕСТЬNULL(Телефоны.Номер, "не указан") КАК Контакт

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Телефоны КАК Телефоны

ПО Контрагенты.Ссылка = Телефоны.Контрагент

Дополнительный нюанс — пустые строки и строки из одних пробелов. Если в поле «Отчество» хранится пробел, склейка даст двойной пробел в ФИО. Проверить такие данные можно условием ГДЕ ПОДСТРОКА(Поле, 1, 1) = " " или выборкой с ДЛИНАСТРОКИ() и последующей чисткой данных.

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

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

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

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

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

Значения итоговой колонки
Норма

Все строки заполнены, разделители на месте

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

Встречаются NULL или пустые строки там, где данные есть

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

Длина соответствует ожидаемой, текст не обрывается на полуслове

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

Значения обрезаны из-за ВЫРАЗИТЬ со слишком малой длиной

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

Одиночные пробелы и запятые, нет лишних символов

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

Двойные пробелы, запятые перед пустыми частями

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

Если склеенное значение нужно постоянно для поиска (например, полное ФИО для быстрого подбора), правильнее хранить его в отдельном реквизите и заполнять при записи объекта, а не вычислять в каждом запросе.

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

Можно ли склеить строки в запросе 1С без оператора «+»?

Специальных функций конкатенации в языке запросов 1С нет — оператор «+» единственный штатный способ. Альтернатива — выполнить склейку в коде после получения выборки или через вычисляемые поля СКД с функциями общих модулей.

Почему при склейке результат получается пустым или NULL?

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

Как склеить строку с датой в нужном формате?

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

Ошибка «несоответствие типов в операции сложения» — что делать?

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

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

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

Как склеить значения нескольких строк табличной части в одну ячейку?

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

Итог

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

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