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