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