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

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

Как в запросе 1С сложить строковые значения

Как в запросе 1С сложить строковые значения: оператор +, соединение полей с разделителем, работа с NULL и неограниченными строками, типовые ошибки и примеры кода.

Задача сложить (конкатенировать) строковые значения прямо в запросе встречается постоянно: собрать ФИО из трёх полей, склеить адрес, сформировать представление номенклатуры «Артикул — Наименование» для отчёта или выгрузки. В языке запросов 1С для этого используется оператор «+», но у него есть ограничения по типам, длине и поведению с NULL, о которых нужно знать до написания текста запроса.

Ниже разобраны рабочие приёмы: простое сложение полей, добавление разделителей, обработка NULL через ЕСТЬNULL, приведение чисел и дат к строке, а также ограничения платформы, из-за которых запрос иногда падает с ошибкой или возвращает пустую строку вместо ожидаемого результата.

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

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

ВЫБРАТЬ

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

ИЗ

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

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

Важно понимать: оператор «+» в запросе работает только когда все операнды — строки. Смешение типов («строка + число», «строка + дата») приводит к ошибке исполнения запроса, а не к автоматическому преобразованию, как в некоторых других СУБД.

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

Защита от NULL: почему результат внезапно пустой

Самая частая причина «не работает сложение строк» — значение NULL в одном из полей. В языке запросов любая операция с NULL даёт NULL: если у сотрудника не заполнено отчество, всё склеенное ФИО станет NULL, а в отчёте вы увидите пустую ячейку.

Стандартное решение — функция ЕСТЬNULL(Поле, ""), которая заменяет NULL пустой строкой до сложения:

ВЫБРАТЬ

ЕСТЬNULL(Сотрудники.Фамилия, "") + " "

+ ЕСТЬNULL(Сотрудники.Имя, "") + " "

+ ЕСТЬNULL(Сотрудники.Отчество, "") КАК ФИО

ИЗ

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

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

Сложение строк с числами и датами

Напрямую склеить строку с числом или датой в запросе нельзя — платформа выдаст ошибку несовместимости типов. Есть два рабочих пути в зависимости от того, какой результат нужен.

Приведение через ВЫРАЗИТЬ

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

ВЫБРАТЬ

"Заказ № " + ВЫРАЗИТЬ(Заказы.Номер КАК Строка(20)) КАК Представление

ИЗ

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

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

Функция ПРЕДСТАВЛЕНИЕ

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

Сравнение способов приведения к строке

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

Подходит для чисел и явного контроля длины. Не работает для дат и ссылок, формат чисел платформенный.

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

Даёт пользовательское представление ссылок, дат, перечислений. Нельзя использовать в условиях ГДЕ и соединениях.

Склейка на встроенном языке после запроса

Максимальная гибкость форматирования (Формат(), СтрШаблон), но требует обхода выборки в коде и неприменима внутри СКД на уровне запроса.

Ограничения по длине и типу строки

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

ВЫБРАТЬ

ВЫРАЗИТЬ(ЕСТЬNULL(Товары.Артикул, "") + " / " + ЕСТЬNULL(Товары.Наименование, "") КАК Строка(200)) КАК Представление

ИЗ

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

Отдельная тонкость — неограниченные строки (Строка(0)), например реквизиты типа «Строка неограниченной длины» или поля типа ХранилищеЗначения с текстом. С ними операции сравнения и группировки в запросе ограничены, а сложение может быть недоступно в части СУБД. Практический выход — привести такое поле к строке фиксированной длины через ВЫРАЗИТЬ до конкатенации, осознанно принимая возможное обрезание.

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

Конкатенация в СКД и динамических списках

В схеме компоновки данных вычисляемое поле со сложением строк можно описать прямо в запросе набора данных — тогда оно ведёт себя как обычное поле. Альтернатива — вычисляемое поле СКД с выражением на языке выражений компоновки, где конкатенация также выполняется оператором «+». Разница в том, что выражение СКД вычисляется на этапе формирования отчёта и не попадает в SQL-запрос к базе.

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

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

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

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

Быстрее всего отладить конкатенацию в консоли запросов: выполните запрос на небольшой выборке (добавьте РАЗНЫЕ и ПЕРВЫЕ 20) и проверьте три вещи — нет ли пустых значений там, где должны быть данные, не обрезались ли длинные строки, корректно ли выглядят приведённые числа и даты.

Если запрос используется в отчёте СКД, сравните результат до и после изменения на одном и том же наборе данных. Для регламентных выгрузок проверку стоит выполнять на копии базы, особенно если текст запроса меняется в типовом модуле обмена.

Альтернатива конкатенации в запросе — склейка на встроенном языке после выборки: Выборка.Фамилия + " " + Выборка.Имя или СтрШаблон("%1 %2", ...). Этот вариант даёт полный контроль над форматированием через Формат(), но не работает внутри СКД, динамических списков и виртуальных таблиц, где доступен только язык запросов.

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

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

Склеенное поле в выборке
Норма

Строка собрана из всех частей, разделители на месте

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

Пустые значения при заполненных реквизитах — где-то NULL без обработки

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

Длинные наименования выводятся полностью

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

Конец строки обрезан — не хватает явного ВЫРАЗИТЬ к большей длине

Числа и даты в строке
Норма

Значения читаемы и в ожидаемом формате

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

Ошибка запроса или нечитаемый формат — нужен ВЫРАЗИТЬ, ПРЕДСТАВЛЕНИЕ или склейка в коде

Итог

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

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

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

Можно ли склеить строки из разных таблиц в одном запросе?

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

Почему запрос с оператором «+» выдаёт ошибку «Несовместимые типы»?

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

Как склеить строки с переносом строки внутри?

В языке запросов нет прямого аналога Символы.ПС. Практический приём — вставить литерал с фактическим переводом строки в тексте запроса (в конструкторе это работает не всегда корректно) либо выполнить склейку с переносом уже на встроенном языке после выборки, где доступен Символы.ПС.

Есть ли в запросах 1С функция СОЕДИНИТЬ или CONCAT, как в SQL?

Отдельной функции конкатенации в языке запросов 1С нет — используется только оператор «+». При генерации SQL платформа сама преобразует его в соответствующий синтаксис конкретной СУБД, разработчику об этом думать не нужно.

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

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

Влияет ли конкатенация в запросе на производительность?

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