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