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