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