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

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

Как в запросе 1С сложить строки

Как в запросе 1С сложить строки: оператор +, функция ПОДСТРОКА, приведение типов через ВЫРАЗИТЬ, объединение ФИО и артикулов, типичные ошибки и готовые примеры кода.

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

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

Базовый синтаксис сложения строк

Простейший случай — оба поля уже имеют строковый тип. Тогда они соединяются оператором «+» прямо в списке выборки, а между ними при необходимости вставляется литерал-разделитель в кавычках.

ВЫБРАТЬ

ФизическиеЛица.Фамилия + " " + ФизическиеЛица.Имя + " " + ФизическиеЛица.Отчество КАК ФИО

ИЗ

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

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

Результат конкатенации получает строковый тип, но его длина платформой может быть вычислена как сумма длин операндов или как неограниченная строка — это зависит от контекста. Если далее поле участвует в сравнениях или группировках, лучше явно задать длину через ВЫРАЗИТЬ.

Приведение нестроковых типов к строке

Основное ограничение: оператор «+» в запросе не выполняет неявного преобразования типов. Сложить строку с числом или датой напрямую нельзя — запрос не выполнится. Поэтому нестроковое поле сначала приводят к строке функцией ВЫРАЗИТЬ.

ВЫБРАТЬ

Номенклатура.Наименование + " (арт. " + ВЫРАЗИТЬ(Номенклатура.Код КАК Строка(20)) + ")" КАК Представление

ИЗ

Справочник.Номенклатура КАК Номенклатура

Для полей неограниченной длины (например, реквизитов типа «Строка» без указания длины или полей «ХранилищеЗначения») ВЫРАЗИТЬ к строке ограниченной длины может обрезать значение. Альтернатива — функция ПОДСТРОКА, которая возвращает фрагмент строки с указанной позиции и длины и заодно выполняет приведение.

ВЫРАЗИТЬ(ПОДСТРОКА(Документ.Комментарий, 1, 100) КАК Строка(100))

Для дат и чисел часто удобнее не склеивать их в запросе, а вернуть отдельными полями и отформатировать уже в коде через функцию Формат() — там доступны форматные строки, локаль и подавление лидирующих нулей. В самом запросе форматирования нет, поэтому «01.01.2026» через приведение даты к строке вы получите не во всех случаях в ожидаемом виде.

Объединение значений из нескольких строк: типовые сценарии

ФИО с пропуском пустых частей

Если отчество может быть не заполнено, простое сложение даст лишний пробел или NULL. Управлять этим помогает конструкция ВЫБОР: для пустого поля подставляется пустая строка.

ВЫБРАТЬ

Физлица.Фамилия

+ ВЫБОР

КОГДА Физлица.Имя = ""

ТОГДА ""

ИНАЧЕ " " + Физлица.Имя

КОНЕЦ КАК ФИО

ИЗ

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

Склейка номера и даты документа

Частая задача в печатных формах — строка вида «№ 125 от 12.03.2026». Номер обычно уже строковый, дату приводят через ПОДСТРОКА и ВЫРАЗИТЬ, а итоговое красивое форматирование лучше делать в коде после запроса.

ВЫБРАТЬ

"№ " + Реализация.Номер + " от " + ПОДСТРОКА(ВЫРАЗИТЬ(Реализация.Дата КАК Строка(25)), 1, 10) КАК РеквизитыДокумента

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

Объединение значений из нескольких записей в одну строку

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

Если нужно собрать значения из нескольких строк в одну, не пытайтесь сделать это хитрой группировкой — в запросе 1С нет строковой агрегации. Выберите детальные записи и склейте их в цикле по выборке: это и быстрее, и прозрачнее для сопровождения.
ПЗ
Практическое замечание

NULL и пустые строки при сложении

Ключевая ловушка: если любой из операндов сложения равен NULL, весь результат станет NULL. Такое происходит при левых соединениях, когда у части основных записей нет связанных данных, а также при обращении к реквизитам составного типа, не заполненным для конкретного объекта.

Защита — функция ЕСТЬNULL, которая подставляет значение по умолчанию вместо NULL. Её ставят вокруг каждого потенциально пустого операнда до сложения.

ВЫБРАТЬ

ЕСТЬNULL(Контрагенты.Наименование, "") + " / " + ЕСТЬNULL(БанковскиеСчета.НомерСчета, "счёт не указан") КАК Представление

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БанковскиеСчета КАК БанковскиеСчета

ПО Контрагенты.Ссылка = БанковскиеСчета.Владелец

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

Типичные ошибки
01
Сложение строки с числом или датой без ВЫРАЗИТЬ — запрос падает с ошибкой несовместимых типов
02
Отсутствие ЕСТЬNULL при левом соединении — в результате появляются пустые ячейки там, где ожидалась строка
03
ВЫРАЗИТЬ к Строка(10) для длинных наименований — данные молча обрезаются
04
Ожидание, что запрос отформатирует дату как Формат() в коде — в языке запросов форматирования нет

Проверка результата и отладка в консоли запросов

Перед переносом выражения в рабочий код отладьте его в консоли запросов: выведите исходные поля и итоговое склеенное поле рядом. Так сразу видно, где теряются пробелы, где приходит NULL и где ВЫРАЗИТЬ обрезает значение.

Порядок действий
  1. 1
    Откройте консоль запросов и напишите выборку с исходными полями без склейки
  2. 2
    Добавьте выражение конкатенации с оператором «+» и разделителями
  3. 3
    Нестроковые поля оберните в ВЫРАЗИТЬ(.. КАК Строка(N)) или ПОДСТРОКА
  4. 4
    Поля из левых соединений оберните в ЕСТЬNULL
  5. 5
    Выполните запрос и сравните итоговое поле с исходными значениями по нескольким записям, включая записи с незаполненными данными
Контрольные точки

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

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

Склеенная строка содержит значение по умолчанию или просто пропуск фрагмента

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

Ячейка результата пустая полностью — сработал NULL

Длинные наименования
Норма

Строка передаётся целиком

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

Конец строки обрезан — увеличьте N в ВЫРАЗИТЬ

Даты и числа в составе строки
Норма

Значения читаемы и соответствуют исходным

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

Неожиданный формат — форматируйте в коде через Формат()

Когда лучше склеивать строки вне запроса

Конкатенация в запросе оправдана, когда результат нужен как единое поле выборки: для СКД, для динамического списка, для выгрузки. Но есть ситуации, где проще и надёжнее вернуть поля по отдельности и собрать строку во встроенном языке.

  • Нужно форматирование дат и чисел — в коде есть Формат() с форматными строками.
  • Требуется склейка значений из нескольких строк таблицы — в запросе такой агрегации нет.
  • Логика сборки сложная, с условиями и локализацией — в коде её проще читать и тестировать.
  • Строка собирается один раз для сообщения пользователю — СтрШаблон() читается лучше, чем длинная цепочка «+».

Во встроенном языке аналогичная склейка выглядит так: ФИО = СокрЛП(Выборка.Фамилия + " " + Выборка.Имя + " " + Выборка.Отчество); либо через СтрШаблон: СтрШаблон("%1 %2", Выборка.Фамилия, Выборка.Имя).

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

Оператор «+» в запросе

Подходит для простой склейки строковых полей в выборке и СКД; требует приведения типов и ЕСТЬNULL

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

Даёт Формат(), СтрШаблон и гибкие условия; требует обхода выборки

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

Удобно для отчётов без изменения запроса; выражения пишутся на языке выражений СКД со своими ограничениями

Итог

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

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

Частые вопросы

Можно ли сложить строку и число в запросе без ВЫРАЗИТЬ?

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

Почему результат сложения пустой, хотя поля заполнены?

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

Как ограничить длину склеенной строки?

Оберните всё итоговое выражение в ВЫРАЗИТЬ(.. КАК Строка(N)) — значение будет обрезано до N символов. Учтите, что обрезка происходит без предупреждения, поэтому для важных данных лучше контролировать длину заранее.

Как собрать в одну строку значения из нескольких записей, например все телефоны контрагента?

В языке запросов 1С нет агрегатной функции для склейки строк. Выберите детальные записи запросом, а объединение выполните в цикле по выборке во встроенном языке, накапливая строку через разделитель.

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

ВЫРАЗИТЬ меняет тип значения и может обрезать его до указанной длины. ПОДСТРОКА возвращает фрагмент строки с заданной позиции и длины и часто используется как способ привести длинное или неограниченное строковое поле к нужному виду.

Можно ли использовать конкатенацию в условии ГДЕ?

Да, выражение со сложением строк допустимо в условиях, например ГДЕ Фамилия + " " + Имя = &ФИО. Но такой фильтр не сможет использовать индексы по отдельным полям, поэтому на больших таблицах предпочтительнее сравнивать поля по отдельности.