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