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

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

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

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

Соединение строк (конкатенация) в запросах 1С выполняется оператором «+» прямо в тексте запроса: Товары.Наименование + " (" + Товары.Артикул + ")". Это стандартный приём, когда нужно собрать представление объекта из нескольких полей — например, склеить фамилию, имя и отчество сотрудника или добавить к наименованию номенклатуры её артикул. Язык запросов 1С автоматически приводит присоединяемые значения к строковому типу, если они не являются NULL.

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

Ниже рассмотрены синтаксис оператора «+», работа с NULL, соединение полей из разных таблиц, склейка нескольких строк в одну через СОЕДИНИТЬСТРОКИ в коде, а также типичные ошибки и способы проверки результата.

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

В языке запросов 1С конкатенация выполняется знаком плюс между строковыми выражениями. Простейший пример — объединение наименования и артикула номенклатуры:

ВЫБРАТЬ

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

ИЗ

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

Литеральные строки в тексте запроса заключаются в двойные кавычки. Если внутри литерала нужна сама кавычка, она удваивается: "Иван ""Иваныч""". Пробелы, разделители, скобки и дефисы добавляются как обычные литералы между полями.

Числа и даты при сложении со строкой автоматически приводятся к строковому представлению. Однако формат такого представления зависит от платформы и может не совпадать с ожидаемым: например, число 1500 может вывестись как «1500» или «1 500». Если нужен строго контролируемый формат, надёжнее выполнить форматирование в коде после выполнения запроса через функцию Формат().

bsl
ВЫБРАТЬ
	Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО
ИЗ
	Справочник.Сотрудники КАК Сотрудники

Обработка NULL перед соединением

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

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

ВЫБРАТЬ

Заказы.Номер КАК Номер,

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

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

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

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

Оборачивайте в ЕСТЬNULL каждое поле, которое теоретически может быть пустым, особенно поля из соединяемых таблиц и необязательные реквизиты. Пропуск хотя бы одного поля — самая частая причина «пустых» строк в отчётах.

Соединение полей из разных таблиц

Конкатенация работает с полями любых таблиц, участвующих в запросе, в том числе соединённых через ЛЕВОЕ, ВНУТРЕННЕЕ или ПОЛНОЕ СОЕДИНЕНИЕ. Типичный сценарий — сборка адреса или представления документа из шапки и связанного справочника:

ВЫБРАТЬ

Реализация.Номер + " от " + Реализация.Дата + ", " + Контрагенты.Наименование КАК Описание

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО Реализация.Контрагент = Контрагенты.Ссылка

При соединении таблиц следите за дублированием строк: если к одному документу присоединяется несколько записей (например, несколько контактных лиц контрагента), склеенное представление повторится в каждой строке. Для получения одной строки сгруппируйте результат или выберите одно значение через подзапрос с условием МАКСИМУМ/МИНИМУМ.

Разделители и переносы строк

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

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

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

ВЫБРАТЬ

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

ИЗ

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

Обратите внимание: ВЫРАЗИТЬ обрезает содержимое до указанной длины. Если описание длиннее заданного лимита, хвост будет без предупреждения отсечён. Выбирайте длину с запасом под реальные данные, а если потеря недопустима — выполняйте склейку в коде после запроса, где ограничений на длину строки нет.

Обрезка строки функцией ПОДСТРОКА

Если нужно взять только начало длинного текста, используйте ПОДСТРОКА: ПОДСТРОКА(ВЫРАЗИТЬ(Описание КАК СТРОКА(1000)), 1, 100) + "...". Такой приём удобен для компактных списков, где полное описание не помещается.

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

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

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

Порядок такой: запрос возвращает детальные строки, а в модуле значения накапливаются в массив и соединяются функцией СтрСоединить():

МассивТелефонов = Новый Массив;

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

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

Если ЗначениеЗаполнено(Выборка.Телефон) Тогда

МассивТелефонов.Добавить(Выборка.Телефон);

КонецЕсли;

КонецЦикла;

ВсеТелефоны = СтрСоединить(МассивТелефонов, ", ");

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

Альтернатива через СКД

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

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

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

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

СтрСоединить в коде

Подходит для объединения значений из нескольких строк выборки и строк любой длины. Требует обхода выборки в модуле.

Функция в общем модуле для СКД

Подходит для отчётов на СКД, когда склейка нужна только в представлении. Сложнее в настройке и отладке.

Типичные ошибки и как их избежать

Первая и самая распространённая ошибка — игнорирование NULL. Запрос выполняется без ошибок, но в части строк представление пустое, и разработчик долго ищет причину в другом месте. Всегда проверяйте результат на записи, где связанное поле заведомо не заполнено.

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

Типичные ошибки
01
Сложение полей без ЕСТЬNULL — вся склеенная строка становится NULL при одном пустом поле
02
Сложение строк неограниченной длины без ВЫРАЗИТЬ — запрос завершается ошибкой несовместимости типов
03
Ожидание склейки нескольких строк одним запросом — в языке запросов нет агрегатной функции конкатенации, нужна обработка в коде
04
Дубли строк из-за соединения «один ко многим» — представление повторяется, нужна группировка или выбор одного значения

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

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

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

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

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

Записи с незаполненными связанными полями
Норма

Представление собрано, вместо пустого поля подставлено значение по умолчанию

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

Вся склеенная строка пустая — не обработан NULL

Длинные текстовые поля
Норма

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

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

Ошибка несовместимости типов при выполнении

Разделители между полями
Норма

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

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

Двойные пробелы или запятые в начале/конце строки

Итог

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

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

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

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

Нет, оператор «+» — единственный способ конкатенации внутри языка запросов. Альтернативы существуют только вне запроса: СтрСоединить в коде модуля или вычисляемые выражения в СКД.

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

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

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

В языке запросов 1С нет агрегатной функции для склейки строк. Выполните запрос, обойдите выборку в коде, соберите значения в массив и соедините их функцией СтрСоединить(Массив, ", ").

Как соединить поле типа «строка неограниченной длины»?

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

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

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

Почему число в склеенной строке выглядит не так, как ожидалось?

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