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