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

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

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

Как склеить строки в запросе 1С: оператор +, функция СОЕДИНИТЬСТРОКИ, конкатенация с разделителем, работа с NULL и приведение типов. Примеры кода и ошибки.

Склейка (конкатенация) строк — одна из самых частых задач при построении запросов в 1С: собрать ФИО из трёх полей, сформировать адрес, объединить артикул и наименование товара для вывода в отчёт. Язык запросов 1С предлагает два основных инструмента: оператор сложения строк «+» и функцию СОЕДИНИТЬСТРОКИ. У каждого подхода есть свои ограничения, подводные камни с NULL и требования к типам данных.

Главная сложность заключается в том, что язык запросов 1С не выполняет неявного преобразования чисел и дат к строке — попытка сложить строку с числом приведёт к ошибке ещё на этапе проверки запроса. Поэтому перед склейкой значения часто нужно привести к строковому типу явно, а неопределённые значения NULL — обработать через ЕСТЬNULL, иначе весь результат склейки обнулится.

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

Оператор «+» — базовый способ склейки полей

Самый простой вариант — сложить строковые поля оператором «+» прямо в списке выборки. Так собирают ФИО, адреса, составные наименования:

ВЫБРАТЬ

Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО

ИЗ

Справочник.Сотрудники КАК Сотрудники

Строковые литералы в языке запросов заключаются в двойные кавычки. Разделитель (пробел, запятую, дефис) добавляют как отдельный литерал между полями. Если разделитель не нужен, поля пишут подряд: Код + Наименование.

Важно помнить: оператор «+» работает только со строками. Если хотя бы один операнд — число, дата или ссылка, конструктор запроса выдаст ошибку «Неверные параметры в операции сравнения» или аналогичную при выполнении. Ссылку на справочник тоже нельзя склеить со строкой напрямую — сначала нужно получить её строковое представление через наименование или другое строковое поле.

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

bsl
ВЫБРАТЬ
	Номенклатура.Артикул + " - " + Номенклатура.Наименование КАК Представление
ИЗ
	Справочник.Номенклатура КАК Номенклатура

Функция СОЕДИНИТЬСТРОКИ — склейка при группировке

Когда нужно объединить значения из нескольких строк таблицы в одну — например, собрать все телефоны контрагента в одно поле через запятую — используется агрегатная функция СОЕДИНИТЬСТРОКИ. Она работает только вместе с группировкой (СГРУППИРОВАТЬ ПО):

ВЫБРАТЬ

КонтактнаяИнформация.Ссылка КАК Контрагент,

СОЕДИНИТЬСТРОКИ(КонтактнаяИнформация.Представление, "; ") КАК ВсеТелефоны

ИЗ

Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация

СГРУППИРОВАТЬ ПО

КонтактнаяИнформация.Ссылка

Первый параметр функции — склеиваемое выражение, второй — разделитель, который вставляется между значениями. Разделитель указывать не обязательно, но без него значения слипнутся в одну нечитаемую строку.

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

Приведение типов: числа, даты и ссылки в строку

Язык запросов 1С не умеет автоматически превращать число или дату в строку при склейке. Прямого аналога функции Строка() из встроенного языка в запросах нет, поэтому применяют обходные приёмы.

Для чисел часто используют функцию ПРЕДСТАВЛЕНИЕ — она возвращает строковое представление значения любого типа, включая ссылки, числа и даты:

ВЫБРАТЬ

"Документ № " + ПРЕДСТАВЛЕНИЕ(Реализация.Номер) КАК Заголовок

ИЗ

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

У ПРЕДСТАВЛЕНИЕ есть ограничение: результат имеет неограниченную длину, поэтому его нельзя использовать в условиях соединений и группировках без предварительного ВЫРАЗИТЬ(... КАК Строка(N)). Кроме того, представление числа может содержать нежелательные разделители разрядов, а даты — формат, зависящий от региональных настроек сервера.

Для ссылочных полей надёжнее склеивать не саму ссылку, а её строковые реквизиты: Наименование, Код, Номер документа. Это быстрее работает и даёт предсказуемый результат без сюрпризов с представлением.

Типичные ошибки
01
Сложение строки с числом или датой без ПРЕДСТАВЛЕНИЕ — запрос падает с ошибкой типов ещё при проверке
02
Игнорирование NULL: если любое из склеиваемых полей NULL, весь результат конкатенации становится NULL
03
Использование СОЕДИНИТЬСТРОКИ без группировки — вся выборка схлопывается в одну запись
04
Попытка сгруппировать или соединить таблицы по результату ПРЕДСТАВЛЕНИЕ без ВЫРАЗИТЬ — ошибка из-за неограниченной длины строки

Обработка NULL при конкатенации

Любая операция склейки, в которой участвует NULL, возвращает NULL. Это самая коварная особенность: на тестовых данных, где все поля заполнены, запрос работает, а в реальной базе, где у части сотрудников не указано отчество, поле ФИО внезапно оказывается пустым.

Стандартное решение — обернуть каждое потенциально пустое поле в ЕСТЬNULL:

ВЫБРАТЬ

ЕСТЬNULL(Сотрудники.Фамилия, "") + " "

+ ЕСТЬNULL(Сотрудники.Имя, "") + " "

+ ЕСТЬNULL(Сотрудники.Отчество, "") КАК ФИО

ИЗ

Справочник.Сотрудники КАК Сотрудники

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

Альтернатива — конструкция ВЫБОР КОГДА ... ТОГДА, если для пустых значений нужен не просто пробел, а осмысленная замена, например текст «не указано».

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

Склейка с разделителем только между заполненными значениями

Простая склейка с разделителем даёт лишние пробелы и запятые, когда часть полей пуста: «Иванов Петрович» с двойным пробелом или «, Москва» с висячей запятой. Чтобы разделитель появлялся только между заполненными частями, его добавляют условно через ВЫБОР:

ВЫБРАТЬ

ЕСТЬNULL(Адреса.Город, "")

+ ВЫБОР

КОГДА Адреса.Город ЕСТЬ NULL ИЛИ Адреса.Улица ЕСТЬ NULL

ТОГДА ""

ИНАЧЕ ", "

КОНЕЦ

+ ЕСТЬNULL(Адреса.Улица, "") КАК Адрес

ИЗ

РегистрСведений.Адреса КАК Адреса

Такой подход делает запрос громоздким, но результат получается чистым, без двойных разделителей. Альтернатива — собрать строку «как есть» в запросе, а финальную чистку (удаление лишних пробелов, замену двойных запятых) выполнить уже в коде на встроенном языке функциями СтрЗаменить и СокрЛП.

Если данных много и логика разделителей сложная, часто рациональнее вообще вынести сборку представления из запроса в код обработки: запрос возвращает отдельные поля, а склейка выполняется в цикле. Это упрощает отладку и не перегружает СУБД строковыми операциями.

Сравнение способов склейки

Оператор «+»

Подходит для склейки полей внутри одной записи. Быстро и наглядно, но требует строковых типов и обработки NULL

СОЕДИНИТЬСТРОКИ

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

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

Когда логика разделителей сложная или платформа старая. Запрос проще, но нужна дополнительная обработка результата в цикле

Проверка результата и ограничения

После написания запроса результат стоит проверить на «грязных» данных: записях с пустыми полями, длинными наименованиями, спецсимволами. Консоль запросов в режиме предприятия позволяет выполнить запрос на реальных данных и сразу увидеть, где склейка дала NULL или лишние разделители.

Обратите внимание на длину результата. Если склеенное поле дальше используется в группировке, соединении или помещается во временную таблицу, платформа должна знать его длину — приведите результат через ВЫРАЗИТЬ(... КАК Строка(150)) с запасом. Слишком маленькая длина молча обрежет строку, слишком большая — замедлит запрос.

При работе с СОЕДИНИТЬСТРОКИ учитывайте, что порядок значений внутри склеенной строки не гарантирован: без дополнительных ухищрений значения собираются в произвольном порядке группировки. Если порядок критичен (например, товары в том же порядке, что в документе), надёжнее выполнить склейку в коде после запроса с упорядочиванием.

Контрольные точки

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

Поле ФИО у записи без отчества
Норма

Отображаются фамилия и имя без лишних пробелов

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

Поле полностью пустое — сработал NULL

Склейка адреса с пустым городом
Норма

Нет висячей запятой в начале строки

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

Строка начинается с ", " — разделитель добавлен безусловно

Результат СОЕДИНИТЬСТРОКИ
Норма

Значения перечислены через разделитель у каждой группы

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

Одна строка на всю выборку — забыта группировка

Использование результата в соединении
Норма

Запрос выполняется, результат приведён через ВЫРАЗИТЬ

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

Ошибка о невозможности сравнения строк неограниченной длины

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

Можно ли склеить строки в запросе 1С без функции СОЕДИНИТЬСТРОКИ?

Да. Для полей одной записи достаточно оператора «+»: Фамилия + " " + Имя. Функция СОЕДИНИТЬСТРОКИ нужна только для объединения значений из разных строк при группировке. Если её нет в вашей версии платформы, агрегатную склейку выполняют в коде после выгрузки результата запроса.

Почему при склейке полей результат получается пустым?

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

Как склеить строку с числом или датой в запросе?

Напрямую — никак, язык запросов не преобразует типы автоматически. Используйте ПРЕДСТАВЛЕНИЕ(ЧисловоеПоле) для получения строкового представления. Учтите, что формат числа и даты будет зависеть от настроек сервера, а результат будет строкой неограниченной длины.

Почему СОЕДИНИТЬСТРОКИ выдаёт ошибку в конструкторе запросов?

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

Как убрать лишние пробелы при склейке ФИО, если отчество не заполнено?

Добавляйте разделитель условно через ВЫБОР КОГДА: пробел вставляется только если следующее поле заполнено. Более простой вариант — склеить с пробелами как есть, а в коде обработки удалить двойные пробелы функцией СтрЗаменить в цикле и применить СокрЛП.

Влияет ли склейка строк на производительность запроса?

Строковые операции в запросе выполняются на стороне СУБД и при больших объёмах данных заметно нагружают сервер, особенно ПРЕДСТАВЛЕНИЕ по ссылочным полям — оно может порождать дополнительные обращения к таблицам. Если склейка нужна только для вывода пользователю, часто эффективнее вернуть отдельные поля и собрать строку в коде.

Итог

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

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