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