Объединение строк в запросах 1С — одна из самых востребованных операций при работе с данными.hether вы формируете отчет с консолидированной информацией, строите аналитику по связанным записям или просто хотите вывести данные в удобном виде — умение правильно "склеивать" текстовые значения сэкономит часы работы. В этой статье разберем все актуальные способы: от стандартных функций 1С:Предприятие 8.3 до SQL-подобных конструкций и возможностей системы компоновки данных (СКД).
Особенность задачи в том, что подходы сильно зависят от контекста: нужно ли объединить строки внутри одной записи (например, ФИО из отдельных полей), сгруппировать значения из нескольких строк (как в сводных отчетах) или сформировать строку из массива в программном коде. Мы рассмотрим каждый сценарий с практическими примерами, которые можно сразу использовать в своих конфигурациях.
Важно: все примеры в статье актуальны для платформы 1С:Предприятие 8.3 (включая последние релизы 2026 года). Для устаревших версий (8.2 и ниже) часть методов может не работать — это связано с эволюцией языка запросов и встроенных функций.
1. Функция СтрокаСоединение(): базовый способ
Самый простой и универсальный метод — использование встроенной функции СтрокаСоединение(). Она доступна как в языке 1С, так и непосредственно в тексте запроса. Функция позволяет объединить любое количество строк с указанием разделителя.
Синтаксис функции:
СтрокаСоединение(Строка1, Строка2, ..., Разделитель)
Примеры использования:
- 📌 Объединение ФИО из отдельных полей:
ВЫБРАТЬСтрокаСоединение(ФизическиеЛица.Фамилия, ФизическиеЛица.Имя, ФизическиеЛица.Отчество, " ") КАК ФИО
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
- 📌 Формирование адреса из компонентов:
ВЫБРАТЬСтрокаСоединение(Адреса.Индекс, Адреса.Город, Адреса.Улица, Адреса.Дом, ", ") КАК ПолныйАдрес
ИЗ
Справочник.Адреса КАК Адреса
- 📌 Объединение с условным разделителем (если значение пустое, разделитель не добавляется):
ВЫБРАТЬСтрокаСоединение(
ЕСТЬNULL(ФизическиеЛица.Фамилия, ""),
ЕСТЬNULL(ФизическиеЛица.Имя, ""),
ЕСТЬNULL(ФизическиеЛица.Отчество, ""),
" "
) КАК ФИО
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
⚠️ Внимание: ФункцияСтрокаСоединение()в запросах не игнорирует пустые строки — если одно из значений пустое, разделитель все равно будет добавлен. Чтобы этого избежать, используйте конструкциюЕСТЬNULL(Поле, "")или проверку наЗНАЧЕНИЕЗАПОЛНЕНО().
2. GROUP_CONCAT: SQL-подобное объединение в запросах
Для случаев, когда нужно сгруппировать значения из нескольких строк в одну (например, вывести все телефоны контрагента через запятую), в 1С 8.3 реализована функция GROUP_CONCAT(). Это аналог одноименной функции из SQLite, который появился в платформе относительно недавно (начиная с версии 8.3.14).
Основные особенности GROUP_CONCAT():
- 🔹 Работает только в GROUP BY-запросах (требует группировки)
- 🔹 Позволяет указать разделитель (по умолчанию — запятая)
- 🔹 Можно отсортировать объединяемые значения с помощью
ORDER BY - 🔹 Ограничение на длину результирующей строки — 1024 символа (в некоторых версиях платформы)
Пример использования для вывода всех email-адресов контрагента:
ВЫБРАТЬ
Контрагенты.Наименование КАК Контрагент,
GROUP_CONCAT(КонтактнаяИнформация.Представление РАЗДЕЛИТЕЛЬ ", ") КАК EmailАдреса
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактнаяИнформация КАК КонтактнаяИнформация
ПО Контрагенты.Ссылка = КонтактнаяИнформация.Объект
ГДЕ
КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ЭлектроннаяПочта)
СГРУППИРОВАТЬ ПО
Контрагенты.Наименование
| Параметр | Описание | Пример |
|---|---|---|
РАЗДЕЛИТЕЛЬ |
Символ или строка, разделяющая значения | РАЗДЕЛИТЕЛЬ "; " |
ORDER BY |
Сортировка объединяемых значений | GROUP_CONCAT(Поле ORDER BY Поле) |
DISTINCT |
Исключение повторяющихся значений | GROUP_CONCAT(DISTINCT Поле) |
⚠️ Внимание: В некоторых версиях 1С:Предприятие (особенно до 8.3.16) функцияGROUP_CONCAT()может работать нестабильно с кириллическими разделителями. Если результат обрезается или содержит кракозябры, используйте латинские символы в качестве разделителя (например,РАЗДЕЛИТЕЛЬ "|").
Убедиться, что версия платформы не ниже 8.3.14|
Проверить длину результирующей строки (не более 1024 символов)|
Использовать латинские разделители при проблемах с кодировкой|
Тестировать запрос на небольшом объеме данных-->
3. Объединение строк в системе компоновки данных (СКД)
Если вы работаете с отчетами на СКД, то для объединения строк можно использовать встроенные возможности компоновщика. Этот метод удобен тем, что не требует модификации запроса — настройка выполняется непосредственно в схеме компоновки данных.
Алгоритм действий:
- Создайте отчет на основе СКД с нужным набором данных.
- В настройках поля, которое нужно объединить, перейдите на закладку
"Другие настройки". - Установите флаг
"Объединять значения"и укажите разделитель. - При необходимости настройте группировку в структуре отчета.
Пример настройки для вывода всех номера телефонов клиента:
- В запросе отчета добавьте поле с телефонами (без группировки).
- В схеме компоновки для этого поля включите опцию
"Объединять значения"с разделителем"; ". - Настройте группировку по клиенту.
Преимущества метода:
- 🎯 Не требует изменения SQL-кода запроса
- 🎯 Гибкие настройки форматирования прямо в интерфейсе
- 🎯 Автоматическая обработка больших объемов данных
Если в СКД нужно объединить значения с условной логикой (например, добавлять префиксы), создайте вычисляемое поле в схеме компоновки с формулой на языке выражений. Например: ЕСЛИ Контакт.Тип = "Мобильный" ТОГДА "Моб: " + Контакт.Номер ИНАЧЕ "Раб: " + Контакт.Номер
4. Программное объединение строк в коде 1С
Когда объединение нужно выполнить вне запроса (например, при обработке результатов выборки или формировании строк для выгрузки), удобнее использовать программные методы. В 1С 8.3 для этого есть несколько подходов:
Способ 1. Цикл по массиву с накоплением строки:
Результат = "";
МассивСтрок = Новый Массив;
МассивСтрок.Добавить("Строка1");
МассивСтрок.Добавить("Строка2");
МассивСтрок.Добавить("Строка3");
Для Каждого Строка Из МассивСтрок Цикл
Если Результат <> "" Тогда
Результат = Результат + ", " + Строка;
Иначе
Результат = Строка;
КонецЕсли;
КонецЦикла;
Способ 2. Функция СтрСоединить() (аналог СтрокаСоединение в коде):
МассивСтрок = Новый Массив;
МассивСтрок.Добавить("Иванов");
МассивСтрок.Добавить("Иван");
МассивСтрок.Добавить("Иванович");
ФИО = СтрСоединить(МассивСтрок, " ");
Способ 3. Использование СтрокаТабличныхДанных() для объединения колонки:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Телефоны КАК Телефон ИЗ Справочник.Контрагенты.Контакты";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СтрокаТелефонов = "";
Пока Выборка.Следующий() Цикл
Если СтрокаТелефонов <> "" Тогда
СтрокаТелефонов = СтрокаТелефонов + "; " + Выборка.Телефон;
Иначе
СтрокаТелефонов = Выборка.Телефон;
КонецЕсли;
КонецЦикла;
Как ускорить объединение больших массивов?
Для массивов с тысячами элементов используйте СтрокаТабличныхДанных() с предварительной загрузкой в таблицу значений:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Строка");
Для i = 1 По 10000 Цикл
ТЗ.Добавить();
ТЗ.Последний().Строка = "Элемент " + i;
КонецЦикла;
Результат = СтрокаТабличныхДанных(ТЗ, "Строка", ", ");
Этот метод работает в разы быстрее, чем поэлементное добавление в цикле.
5. Объединение строк с условной логикой
Часто требуется объединять строки не просто через разделитель, а с дополнительными условиями. Например:
- 🔸 Добавлять префиксы к значениям (
"Тел: +79991234567") - 🔸 Пропускать пустые или NULL-значения
- 🔸 Форматировать значения в зависимости от типа
Рассмотрим практические примеры:
Пример 1. Объединение с префиксами в запросе:
ВЫБРАТЬ
Контрагенты.Наименование КАК Контрагент,
GROUP_CONCAT(
"Тел: " + КонтактнаяИнформация.Представление +
ЕСЛИ КонтактнаяИнформация.Основной ТОГДА " (осн.)" ИНАЧЕ "" ЕНД
РАЗДЕЛИТЕЛЬ "; "
) КАК Телефоны
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактнаяИнформация КАК КонтактнаяИнформация
ПО Контрагенты.Ссылка = КонтактнаяИнформация.Объект
ГДЕ
КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
СГРУППИРОВАТЬ ПО
Контрагенты.Наименование
Пример 2. Программное объединение с проверкой значений:
Функция ОбъединитьАдрес(Индекс, Город, Улица, Дом, Квартира)
Адрес = "";
Если ЗначениеЗаполнено(Индекс) Тогда
Адрес = Адрес + Индекс;
КонецЕсли;
Если ЗначениеЗаполнено(Город) Тогда
Если Адрес <> "" Тогда Адрес = Адрес + ", "; КонецЕсли;
Адрес = Адрес + Город;
КонецЕсли;
// Аналогично для Улица, Дом, Квартира
...
Возврат Адрес;
КонецФункции
Пример 3. Использование ВЫРАЗИТЬ для форматирования в запросе:
ВЫБРАТЬ
ВЫРАЗИТЬ(
СтрокаСоединение(
"Индекс: " + ЕСТЬNULL(Адреса.Индекс, ""),
"Город: " + ЕСТЬNULL(Адреса.Город, ""),
"Улица: " + ЕСТЬNULL(Адреса.Улица, "")
) КАК Строка
) КАК ФорматированныйАдрес
ИЗ
Справочник.Адреса КАК Адреса
Для сложных условий объединения лучше вынести логику в отдельную функцию на встроенном языке. Это упростит поддержку кода и позволит повторно использовать алгоритм в разных местах.
6. Объединение строк в отчетах с группировкой
При формировании отчетов часто требуется вывести сгруппированные данные с объединенными строками. Например, показать все заказы клиента с перечнем товаров в одной ячейке. Для этого можно комбинировать подходы:
Способ 1. GROUP_CONCAT в запросе + СКД
Если данных немного, проще всего сделать объединение прямо в SQL-запросе отчета, а затем настроить вывод в СКД:
ВЫБРАТЬ
Клиенты.Наименование КАК Клиент,
GROUP_CONCAT(Заказы.Номер РАЗДЕЛИТЕЛЬ ", ") КАК НомераЗаказов,
GROUP_CONCAT(Заказы.Дата РАЗДЕЛИТЕЛЬ ", ") КАК ДатыЗаказов
ИЗ
Справочник.Клиенты КАК Клиенты
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК Заказы
ПО Клиенты.Ссылка = Заказы.Клиент
СГРУППИРОВАТЬ ПО
Клиенты.Наименование
Способ 2. Вложенные таблицы в СКД
Для больших объемов данных лучше использовать вложенные таблицы:
- В основной запрос отчета добавьте только группировочные поля (например, клиента).
- Создайте вложенный набор данных с детализацией (заказы клиента).
- В схеме компоновки настройте иерархию: клиент → заказы.
- Для поля с заказами установите флаг
"Объединять значения".
Способ 3. Программная обработка результата
Если нужна сложная логика объединения, можно обработать результат запроса в коде:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Результат = ДанныеРасшифровки.ПолучитьДанные();
ТаблицаРезультата = Результат.Выгрузить();
// Группируем данные и объединяем строки
Группы = Новый Структура;
Для Каждого Строка Из ТаблицаРезультата Цикл
Клиент = Строка.Клиент;
Если НЕ Группы.Свойство(Клиент) Тогда
Группы.Вставить(Клиент, Новый Массив);
КонецЕсли;
Группы[Клиент].Добавить(Строка.НомерЗаказа);
КонецЦикла;
// Формируем итоговую таблицу
ИтоговаяТаблица = Новый ТаблицаЗначений;
Для Каждого Клиент Из Группы.Ключи Цикл
НоваяСтрока = ИтоговаяТаблица.Добавить();
НоваяСтрока.Клиент = Клиент;
НоваяСтрока.Заказы = СтрСоединить(Группы[Клиент], ", ");
КонецЦикла;
ДанныеРасшифровки.Загрузить(ИтоговаяТаблица);
КонецПроцедуры
7. Типичные ошибки и как их избежать
При объединении строк в 1С программисты часто сталкиваются с типичными проблемами. Рассмотрим самые распространенные:
Ошибка 1. Превышение ограничения длины строки
Функция GROUP_CONCAT() в некоторых версиях платформы имеет ограничение в 1024 символа. Если результирующая строка длиннее, она обрезается.
⚠️ Внимание: Чтобы обойти ограничение, разбейте объединение на части или используйте программное объединение после выполнения запроса. Например, можно группировать данные по первым буквам или другим признакам, а затем объединять результаты в коде.
Ошибка 2. Проблемы с кодировкой при использовании кириллических разделителей
В версиях 1С до 8.3.16 функция GROUP_CONCAT может неправильно обрабатывать кириллические символы в разделителе. Решение — использовать латинские символы (РАЗДЕЛИТЕЛЬ "|") или обновлять платформу.
Ошибка 3. Пустые значения в результате объединения
Если не обработать NULL-значения с помощью ЕСТЬNULL(), в результирующей строке могут появиться лишние разделители. Всегда проверяйте значения на заполненность:
СтрокаСоединение(
ЕСТЬNULL(Поле1, ""),
ЕСТЬNULL(Поле2, ""),
Разделитель
)
Ошибка 4. Некорректная сортировка объединяемых значений
При использовании GROUP_CONCAT без ORDER BY порядок значений в результирующей строке может быть произвольным. Всегда указывайте сортировку:
GROUP_CONCAT(Поле ORDER BY Поле РАЗДЕЛИТЕЛЬ ", ")
Ошибка 5. Производительность при объединении больших наборов данных
Объединение тысяч строк в одну может сильно нагружать сервер. Оптимизируйте запросы:
- 🔹 Используйте фильтры для уменьшения выборки
- 🔹 Разбивайте объединение на части (например, по алфавиту)
- 🔹 Для больших объемов данных отдавайте предпочтение программному объединению после выборки
8. Альтернативные подходы: когда стандартные методы не подходят
В некоторых случаях стандартные способы объединения строк в 1С не работают или неэффективны. Рассмотрим альтернативные решения:
Способ 1. Использование временных таблиц
Если нужно объединить строки с сложной логикой, которую невозможно выразить в одном запросе, можно:
- Создать временную таблицу с промежуточными данными.
- Выполнить несколько запросов для обработки данных.
- Объединить результаты в конечном запросе.
// Создаем временную таблицу
ВременнаяТаблица = Новый ТаблицаЗначений;
ВременнаяТаблица.Колонки.Добавить("Клиент");
ВременнаяТаблица.Колонки.Добавить("ОбъединенныеДанные");
// Заполняем данными из нескольких источников
Запрос1 = Новый Запрос("ВЫБРАТЬ Клиент, Телефоны ИЗ ...");
Запрос2 = Новый Запрос("ВЫБРАТЬ Клиент, Email ИЗ ...");
// Объединяем результаты в коде
Для Каждого Строка Из Запрос1.Выполнить().Выбрать() Цикл
НоваяСтрока = ВременнаяТаблица.Добавить();
НоваяСтрока.Клиент = Строка.Клиент;
НоваяСтрока.ОбъединенныеДанные = Строка.Телефоны;
КонецЦикла;
Способ 2. Использование внешних компонент
Для сложных сценариев (например, работа с JSON или XML) можно подключить внешние компоненты:
- 🔹 1Script.String — библиотека дляadvanced работы со строками
- 🔹 JSON-парсеры для сериализации сложных структур
- 🔹 RegEx-компоненты для обработки строк по регулярным выражениям
Способ 3. Выгрузка данных и обработка во внешних системах
Если объем данных очень большой (десятки тысяч строк), иногда эффективнее:
- Выгрузить данные в Excel или CSV.
- Обработать объединение во внешней программе (например, в Python или Power Query).
- Загрузить результат обратно в 1С.
Способ 4. Использование хранимых процедур (для SQL-версий 1С)
В конфигурациях, работающих с MS SQL Server или PostgreSQL, можно создать хранимую процедуру с логикой объединения и вызывать ее из 1С:
ВЫПОЛНИТЬ НЕПОСРЕДСТВЕННЫЙ ЗАПРОС
"EXEC dbo.ОбъединитьСтроки @Параметр1, @Параметр2"
Альтернативные подходы обычно требуют больше усилий на реализацию, но позволяют решить задачи, недоступные стандартными средствами 1С. Выбор метода зависит от конкретной задачи, объема данных и требований к производительности.
Часто задаваемые вопросы
Как объединить строки в запросе 1С, если значения хранятся в разных таблицах?
Используйте СОЕДИНЕНИЕ таблиц в запросе, а затем применяйте СтрокаСоединение() или GROUP_CONCAT() к полученным полям. Пример:
ВЫБРАТЬ
ОсновнаяТаблица.Поле1,
СтрокаСоединение(ОсновнаяТаблица.Поле2, СвязаннаяТаблица.Поле3, " ") КАК ОбъединенноеПоле
ИЗ
ОсновнаяТаблица КАК ОсновнаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ СвязаннаяТаблица КАК СвязаннаяТаблица
ПО ОсновнаяТаблица.Ссылка = СвязаннаяТаблица.Ссылка
Если нужно сгруппировать данные из связанной таблицы, используйте GROUP_CONCAT с предварительным соединением.
Почему GROUP_CONCAT обрезает результат?
Это ограничение платформы 1С — в некоторых версиях максимальная длина результирующей строки для GROUP_CONCAT составляет 1024 символа. Решения:
- Разбейте данные на части (например, группируйте по первым буквам).
- Используйте программное объединение после выполнения запроса.
- Обновите платформу до последней версии (в новых релизах ограничение может быть увеличено).
Можно ли объединить строки с переносами (многострочный текст)?
Да, для этого используйте символ переноса строки Символы.ПС в качестве разделителя:
СтрокаСоединение(Строка1, Строка2, Символы.ПС)
В запросах можно использовать конструкцию:
ВЫРАЗИТЬ(СтрокаСоединение(Поле1, Поле2, Символ(10)) КАК Строка)
Где Символ(10) — это символ перевода строки (LF).
Как объединить строки с проверкой на уникальность?
Используйте модификатор DISTINCT в GROUP_CONCAT:
GROUP_CONCAT(DISTINCT Поле РАЗДЕЛИТЕЛЬ ", ")
В программном коде перед объединением удалите дубли с помощью Массив.УникальныеЗначения():
УникальныеЗначения = МассивСтрок.УникальныеЗначения();
Результат = СтрСоединить(УникальныеЗначения, ", ");
Как ускорить объединение большого количества строк (более 10 000)?
Для больших объемов данных:
- Используйте
СтрокаТабличныхДанных()вместо поэлементного объединения в цикле. - Разбивайте данные на пакеты (например, по 1000 строк) и обрабатывайте их отдельно.
- Если возможно, выполняйте объединение на стороне СУБД (например, в MS SQL с помощью
STRING_AGG). - Отключайте неиспользуемые индексы и оптимизируйте запрос