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