Объединение строк в запросах 1С — одна из самых востребованных операций при работе с данными.hether вы формируете отчет с консолидированной информацией, строите аналитику по связанным записям или просто хотите вывести данные в удобном виде — умение правильно "склеивать" текстовые значения сэкономит часы работы. В этой статье разберем все актуальные способы: от стандартных функций 1С:Предприятие 8.3 до SQL-подобных конструкций и возможностей системы компоновки данных (СКД).

Особенность задачи в том, что подходы сильно зависят от контекста: нужно ли объединить строки внутри одной записи (например, ФИО из отдельных полей), сгруппировать значения из нескольких строк (как в сводных отчетах) или сформировать строку из массива в программном коде. Мы рассмотрим каждый сценарий с практическими примерами, которые можно сразу использовать в своих конфигурациях.

Важно: все примеры в статье актуальны для платформы 1С:Предприятие 8.3 (включая последние релизы 2026 года). Для устаревших версий (8.2 и ниже) часть методов может не работать — это связано с эволюцией языка запросов и встроенных функций.

1. Функция СтрокаСоединение(): базовый способ

Самый простой и универсальный метод — использование встроенной функции СтрокаСоединение(). Она доступна как в языке , так и непосредственно в тексте запроса. Функция позволяет объединить любое количество строк с указанием разделителя.

Синтаксис функции:

СтрокаСоединение(Строка1, Строка2, ..., Разделитель)

Примеры использования:

  • 📌 Объединение ФИО из отдельных полей:
    ВЫБРАТЬ
    

    СтрокаСоединение(ФизическиеЛица.Фамилия, ФизическиеЛица.Имя, ФизическиеЛица.Отчество, " ") КАК ФИО

    ИЗ

    Справочник.ФизическиеЛица КАК ФизическиеЛица

  • 📌 Формирование адреса из компонентов:
    ВЫБРАТЬ
    

    СтрокаСоединение(Адреса.Индекс, Адреса.Город, Адреса.Улица, Адреса.Дом, ", ") КАК ПолныйАдрес

    ИЗ

    Справочник.Адреса КАК Адреса

  • 📌 Объединение с условным разделителем (если значение пустое, разделитель не добавляется):
    ВЫБРАТЬ
    

    СтрокаСоединение(

    ЕСТЬNULL(ФизическиеЛица.Фамилия, ""),

    ЕСТЬNULL(ФизическиеЛица.Имя, ""),

    ЕСТЬNULL(ФизическиеЛица.Отчество, ""),

    " "

    ) КАК ФИО

    ИЗ

    Справочник.ФизическиеЛица КАК ФизическиеЛица

⚠️ Внимание: Функция СтрокаСоединение() в запросах не игнорирует пустые строки — если одно из значений пустое, разделитель все равно будет добавлен. Чтобы этого избежать, используйте конструкцию ЕСТЬNULL(Поле, "") или проверку на ЗНАЧЕНИЕЗАПОЛНЕНО().
📊 Какой способ объединения строк вы используете чаще?
СтрокаСоединение()
GROUP_CONCAT в запросах
СКД (Система компоновки данных)
Программное объединение в коде

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. Объединение строк в системе компоновки данных (СКД)

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

Алгоритм действий:

  1. Создайте отчет на основе СКД с нужным набором данных.
  2. В настройках поля, которое нужно объединить, перейдите на закладку "Другие настройки".
  3. Установите флаг "Объединять значения" и укажите разделитель.
  4. При необходимости настройте группировку в структуре отчета.

Пример настройки для вывода всех номера телефонов клиента:

  1. В запросе отчета добавьте поле с телефонами (без группировки).
  2. В схеме компоновки для этого поля включите опцию "Объединять значения" с разделителем "; ".
  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. Вложенные таблицы в СКД

Для больших объемов данных лучше использовать вложенные таблицы:

  1. В основной запрос отчета добавьте только группировочные поля (например, клиента).
  2. Создайте вложенный набор данных с детализацией (заказы клиента).
  3. В схеме компоновки настройте иерархию: клиент → заказы.
  4. Для поля с заказами установите флаг "Объединять значения".

Способ 3. Программная обработка результата

Если нужна сложная логика объединения, можно обработать результат запроса в коде:

Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Результат = ДанныеРасшифровки.ПолучитьДанные();

ТаблицаРезультата = Результат.Выгрузить();

// Группируем данные и объединяем строки

Группы = Новый Структура;

Для Каждого Строка Из ТаблицаРезультата Цикл

Клиент = Строка.Клиент;

Если НЕ Группы.Свойство(Клиент) Тогда

Группы.Вставить(Клиент, Новый Массив);

КонецЕсли;

Группы[Клиент].Добавить(Строка.НомерЗаказа);

КонецЦикла;

// Формируем итоговую таблицу

ИтоговаяТаблица = Новый ТаблицаЗначений;

Для Каждого Клиент Из Группы.Ключи Цикл

НоваяСтрока = ИтоговаяТаблица.Добавить();

НоваяСтрока.Клиент = Клиент;

НоваяСтрока.Заказы = СтрСоединить(Группы[Клиент], ", ");

КонецЦикла;

ДанныеРасшифровки.Загрузить(ИтоговаяТаблица);

КонецПроцедуры

7. Типичные ошибки и как их избежать

При объединении строк в программисты часто сталкиваются с типичными проблемами. Рассмотрим самые распространенные:

Ошибка 1. Превышение ограничения длины строки

Функция GROUP_CONCAT() в некоторых версиях платформы имеет ограничение в 1024 символа. Если результирующая строка длиннее, она обрезается.

⚠️ Внимание: Чтобы обойти ограничение, разбейте объединение на части или используйте программное объединение после выполнения запроса. Например, можно группировать данные по первым буквам или другим признакам, а затем объединять результаты в коде.

Ошибка 2. Проблемы с кодировкой при использовании кириллических разделителей

В версиях до 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. Создать временную таблицу с промежуточными данными.
  2. Выполнить несколько запросов для обработки данных.
  3. Объединить результаты в конечном запросе.
// Создаем временную таблицу

ВременнаяТаблица = Новый ТаблицаЗначений;

ВременнаяТаблица.Колонки.Добавить("Клиент");

ВременнаяТаблица.Колонки.Добавить("ОбъединенныеДанные");

// Заполняем данными из нескольких источников

Запрос1 = Новый Запрос("ВЫБРАТЬ Клиент, Телефоны ИЗ ...");

Запрос2 = Новый Запрос("ВЫБРАТЬ Клиент, Email ИЗ ...");

// Объединяем результаты в коде

Для Каждого Строка Из Запрос1.Выполнить().Выбрать() Цикл

НоваяСтрока = ВременнаяТаблица.Добавить();

НоваяСтрока.Клиент = Строка.Клиент;

НоваяСтрока.ОбъединенныеДанные = Строка.Телефоны;

КонецЦикла;

Способ 2. Использование внешних компонент

Для сложных сценариев (например, работа с JSON или XML) можно подключить внешние компоненты:

  • 🔹 1Script.String — библиотека дляadvanced работы со строками
  • 🔹 JSON-парсеры для сериализации сложных структур
  • 🔹 RegEx-компоненты для обработки строк по регулярным выражениям

Способ 3. Выгрузка данных и обработка во внешних системах

Если объем данных очень большой (десятки тысяч строк), иногда эффективнее:

  1. Выгрузить данные в Excel или CSV.
  2. Обработать объединение во внешней программе (например, в Python или Power Query).
  3. Загрузить результат обратно в .

Способ 4. Использование хранимых процедур (для SQL-версий 1С)

В конфигурациях, работающих с MS SQL Server или PostgreSQL, можно создать хранимую процедуру с логикой объединения и вызывать ее из :

ВЫПОЛНИТЬ НЕПОСРЕДСТВЕННЫЙ ЗАПРОС

"EXEC dbo.ОбъединитьСтроки @Параметр1, @Параметр2"

💡

Альтернативные подходы обычно требуют больше усилий на реализацию, но позволяют решить задачи, недоступные стандартными средствами 1С. Выбор метода зависит от конкретной задачи, объема данных и требований к производительности.

Часто задаваемые вопросы

Как объединить строки в запросе 1С, если значения хранятся в разных таблицах?

Используйте СОЕДИНЕНИЕ таблиц в запросе, а затем применяйте СтрокаСоединение() или GROUP_CONCAT() к полученным полям. Пример:

ВЫБРАТЬ

ОсновнаяТаблица.Поле1,

СтрокаСоединение(ОсновнаяТаблица.Поле2, СвязаннаяТаблица.Поле3, " ") КАК ОбъединенноеПоле

ИЗ

ОсновнаяТаблица КАК ОсновнаяТаблица

ЛЕВОЕ СОЕДИНЕНИЕ СвязаннаяТаблица КАК СвязаннаяТаблица

ПО ОсновнаяТаблица.Ссылка = СвязаннаяТаблица.Ссылка

Если нужно сгруппировать данные из связанной таблицы, используйте GROUP_CONCAT с предварительным соединением.

Почему GROUP_CONCAT обрезает результат?

Это ограничение платформы 1С — в некоторых версиях максимальная длина результирующей строки для GROUP_CONCAT составляет 1024 символа. Решения:

  1. Разбейте данные на части (например, группируйте по первым буквам).
  2. Используйте программное объединение после выполнения запроса.
  3. Обновите платформу до последней версии (в новых релизах ограничение может быть увеличено).
Можно ли объединить строки с переносами (многострочный текст)?

Да, для этого используйте символ переноса строки Символы.ПС в качестве разделителя:

СтрокаСоединение(Строка1, Строка2, Символы.ПС)

В запросах можно использовать конструкцию:

ВЫРАЗИТЬ(СтрокаСоединение(Поле1, Поле2, Символ(10)) КАК Строка)

Где Символ(10) — это символ перевода строки (LF).

Как объединить строки с проверкой на уникальность?

Используйте модификатор DISTINCT в GROUP_CONCAT:

GROUP_CONCAT(DISTINCT Поле РАЗДЕЛИТЕЛЬ ", ")

В программном коде перед объединением удалите дубли с помощью Массив.УникальныеЗначения():

УникальныеЗначения = МассивСтрок.УникальныеЗначения();

Результат = СтрСоединить(УникальныеЗначения, ", ");

Как ускорить объединение большого количества строк (более 10 000)?

Для больших объемов данных:

  1. Используйте СтрокаТабличныхДанных() вместо поэлементного объединения в цикле.
  2. Разбивайте данные на пакеты (например, по 1000 строк) и обрабатывайте их отдельно.
  3. Если возможно, выполняйте объединение на стороне СУБД (например, в MS SQL с помощью STRING_AGG).
  4. Отключайте неиспользуемые индексы и оптимизируйте запрос