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