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

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

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

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

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

Ключевая особенность: язык запросов 1С работает не так, как встроенный язык. В модуле можно написать Строка(Число1) + Строка(Число2), а в тексте запроса функции СТРОКА() нет — приведение типов выполняется иначе, и это часто становится источником ошибок. Ниже разобраны рабочие способы склейки полей, их ограничения и типовые проблемы.

Материал применим к запросам в консоли запросов, в схеме компоновки данных (СКД), в динамических списках и в программно создаваемых объектах Запрос.

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

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

ВЫБРАТЬ

Фамилия + " " + Имя + " " + Отчество КАК ФИО

ИЗ

Справочник.ФизическиеЛица

Именованный результат задаётся через ключевое слово КАК — именно под этим псевдонимом поле будет доступно в выборке, в СКД или в результирующей таблице значений. Без псевдонима платформа сформирует имя автоматически, и обращаться к колонке станет неудобно.

Разделитель можно делать условным. Например, запятую ставить только если оба поля заполнены:

ВЫБРАТЬ

Город + ВЫБОР

КОГДА Город <> "" И Улица <> ""

ТОГДА ", "

ИНАЧЕ ""

КОНЕЦ + Улица КАК Адрес

ИЗ

РегистрСведений.Адреса

Объединение полей разных типов

Оператор «+» в запросе работает только с однородными типами: строка со строкой, число с числом. Попытка сложить строку с числом или строку с датой приведёт к ошибке исполнения запроса. Поэтому нестроковое значение сначала нужно превратить в строку.

Основные приёмы приведения:

  • ПРЕДСТАВЛЕНИЕ(Поле) — возвращает строковое представление значения любого типа. Для ссылок это наименование или представление объекта, для чисел и дат — их текстовый вид. Подходит для большинства задач склейки.
  • ПОДСТРОКА(Поле, 1, N) — когда поле уже строковое, но его нужно обрезать или «зафиксировать» длину, например при приведении строки неограниченной длины к ограниченной.
  • ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) — приведение к строке заданной длины, работает только для значений, уже имеющих строковый тип (например, для составного поля).
ВЫБРАТЬ

Товар.Наименование + " (остаток: " + ПРЕДСТАВЛЕНИЕ(Остаток) + ")" КАК Описание

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки

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

Проблема NULL при объединении полей

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

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

ВЫБРАТЬ

ЕСТЬNULL(Контрагенты.Наименование, "") + " / " +

ЕСТЬNULL(Контрагенты.ИНН, "") КАК КонтрагентСИНН

ИЗ

Справочник.Контрагенты КАК Контрагенты

Обрабатывать через ЕСТЬNULL нужно каждое поле, которое потенциально может быть NULL. Проверка ЕСТЬ NULL в условии ГДЕ отфильтрует записи, но не исправит склейку — это разные задачи.

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

Объединение полей в СКД и динамических списках

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

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

В динамических списках с произвольным запросом склейка работает так же, но помните: поле, по которому пользователь сортирует список, должно быть проиндексировано логически — сортировка по склеенной строке будет лексикографической, а не по смыслу. «Товар10» окажется раньше «Товар2».

Проверка результата и ограничения

После написания запроса проверьте результат в консоли запросов до переноса в код или СКД. Контрольные точки:

  • Количество строк в результате совпадает с ожидаемым — склейка не должна менять число записей, если изменилось, проблема в соединениях, а не в объединении полей.
  • Нет пустых значений там, где исходные поля заполнены, — признак необработанного NULL.
  • Длина результирующей строки не превышает ограничение приёмника (реквизита, колонки таблицы значений).
  • Разделители стоят корректно: нет двойных пробелов и висячих запятых при пустых полях.

Отдельное ограничение — производительность. Склейка строк в больших выборках выполняется на сервере СУБД и обычно не критична, но если объединённое поле участвует в соединении таблиц, это почти гарантированно отключит использование индексов. Для соединений всегда используйте исходные поля по отдельности, а не их конкатенацию.

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

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

Значения объединённого поля
Норма

Все заполненные исходные поля присутствуют в строке с разделителем

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

Строка пустая или содержит только часть данных — вероятен NULL

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

Отображаются без лишних разделителей

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

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

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

Запрос отрабатывает за то же время, что и без склейки

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

Резкое замедление — проверьте, не участвует ли склейка в соединении

Альтернатива: объединение уже после запроса

Не всегда склейку нужно делать в самом запросе. Если объединённое значение требуется только для вывода пользователю, проще выбрать поля по отдельности и склеить их в цикле обхода выборки на встроенном языке:

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

ПолноеИмя = СокрЛП(Выборка.Фамилия + " " + Выборка.Имя + " " + Выборка.Отчество);

КонецЦикла;

Такой подход даёт полный контроль над форматированием: функции СокрЛП, Формат, СтрШаблон недоступны в языке запросов. Минус — объединённое поле нельзя использовать в отборах и группировках запроса, его придётся формировать для каждой строки отдельно.

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

Склейка в запросе оператором +

Подходит для группировок, отборов, СКД и динамических списков. Ограничение: нет функций форматирования, нужны ЕСТЬNULL и ПРЕДСТАВЛЕНИЕ

Вычисляемое поле СКД

Подходит для отчётов, где объединённое поле нужно только для показа. Ограничение: недоступно в отборах на уровне запроса

Склейка в коде после запроса

Максимальная гибкость форматирования. Ограничение: нельзя сортировать и группировать по результату на уровне СУБД

FAQ

Как объединить поле строки с полем даты в запросе 1С?

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

Почему объединённое поле пустое, хотя одно из полей заполнено?

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

Можно ли объединить больше двух полей?

Да, оператор «+» можно цепочкой применять к любому количеству полей: Поле1 + " " + Поле2 + " " + Поле3. Ограничений по числу операндов нет, но чем длиннее выражение, тем важнее обработать NULL для каждого участника.

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

Вставьте в строку символ переноса через СИМВОЛ(10) или используйте конструкцию с вертикальной чертой в многострочной строке запроса. В СКД для многострочного вывода дополнительно проверьте настройки оформления поля.

Работает ли объединение полей в параметрах виртуальных таблиц?

Нет, в параметрах виртуальных таблиц выражения со склейкой и ПРЕДСТАВЛЕНИЕ не поддерживаются. Сначала выберите данные во временную таблицу, выполните объединение там, затем используйте результат в основном запросе.

Чем отличается ВЫРАЗИТЬ от ПОДСТРОКА при работе со строками?

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

Итог

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

Строковые поля склеиваются оператором «+» с явным разделителем, нестроковые — после ПРЕДСТАВЛЕНИЕ. Каждое потенциально пустое поле оборачивайте в ЕСТЬNULL, иначе вся строка станет NULL. Не используйте склеенное поле в соединениях — это отключает индексы. Для сложного форматирования выносите объединение в код или вычисляемые поля СКД.