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

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

1С СтрСоединить: чем заменить функцию и как объединять строки

Разбираем функцию СтрСоединить в 1С: синтаксис, аналоги для старых платформ, замена через цикл и СоединитьСтроки, типичные ошибки и проверка результата.

Функция СтрСоединить появилась в платформе 1С:Предприятие 8.3.6 и объединяет массив строк в одну строку через указанный разделитель. Если конфигурация работает на более старой версии платформы, при попытке использовать функцию возникает ошибка «Процедура или функция с указанным именем не определена». В этом случае нужна замена — либо цикл с конкатенацией, либо собственная универсальная функция.

Даже на новых платформах разработчики ищут альтернативы: например, когда нужно соединить не массив, а коллекцию другого типа, добавить условия при объединении или обработать пустые элементы. Ниже разобраны синтаксис СтрСоединить, рабочие варианты замены, их ограничения и способы проверить результат.

Как работает СтрСоединить: синтаксис и параметры

Функция принимает два параметра: массив строк и необязательный разделитель. Если разделитель не указан, строки склеиваются вплотную, без промежуточных символов. Результат — одна строка, содержащая все элементы массива в порядке их следования.

Товары = Новый Массив;

Товары.Добавить("Гвозди");

Товары.Добавить("Молоток");

Товары.Добавить("Пила");

Результат = СтрСоединить(Товары, ", ");

// Результат: "Гвозди, Молоток, Пила"

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

Элементы массива должны быть строками либо значениями, которые платформа способна неявно привести к строке. Числа и даты обычно преобразуются автоматически, но формат такого преобразования зависит от региональных настроек, поэтому надёжнее приводить значения явно через Строка() или Формат().

Чем заменить СтрСоединить на старых платформах

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

Функция СоединитьСтроки(МассивСтрок, Разделитель = "") Экспорт

Результат = "";

Для Индекс = 0 По МассивСтрок.ВГраница() Цикл

Если Индекс > 0 Тогда

Результат = Результат + Разделитель;

КонецЕсли;

Результат = Результат + МассивСтрок[Индекс];

КонецЦикла;

Возврат Результат;

КонецФункции

Проверка Индекс > 0 нужна, чтобы разделитель не появился перед первым элементом. Альтернативный приём — добавлять разделитель после каждого элемента, а в конце обрезать лишний через Лев(), но первый вариант читается проще и не требует вычисления длины разделителя.

Такую функцию удобно разместить в общем модуле, например СтроковыеФункцииСервер. Тогда при переходе на новую платформу достаточно заменить тело функции на вызов штатной СтрСоединить, не трогая десятки мест вызова по всей конфигурации.

bsl
Функция СоединитьСтроки(МассивСтрок, Разделитель = "") Экспорт
	Результат = "";
	Для Индекс = 0 По МассивСтрок.ВГраница() Цикл
		Если Индекс > 0 Тогда
			Результат = Результат + Разделитель;
		КонецЕсли;
		Результат = Результат + МассивСтрок[Индекс];
	КонецЦикла;
	Возврат Результат;
КонецФункции

Замена через СтрШаблон и другие встроенные средства

Когда нужно соединить не массив, а фиксированный набор значений, удобнее СтрШаблон. Функция подставляет параметры в шаблон на месте маркеров %1, %2 и так далее. Она доступна на платформах старше 8.3.6 тоже, поэтому часто выступает заменой ручной конкатенации.

СтрокаАдреса = СтрШаблон("%1, %2, д. %3", Город, Улица, НомерДома);

Для объединения строк с переносом строки вместо СтрСоединить иногда проще сложить строки через Символ.ПС в цикле или собрать текст через объект ТекстовыйДокумент с последующим ПолучитьТекст(). Текстовый документ автоматически расставляет переводы строк между добавленными строками.

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

Сравнение вариантов

СтрСоединить

Штатный и самый быстрый способ, но требует платформу 8.3.6+ и массив на входе

Цикл с конкатенацией

Работает на любой платформе; на больших массивах медленнее из-за пересоздания строки

СтрШаблон

Подходит для фиксированного набора значений, не для массива произвольной длины

ТекстовыйДокумент

Удобен для многострочного текста с переносами, избыточен для простой склейки

Производительность: почему цикл может «тормозить»

Строки в 1С неизменяемы: каждая операция Результат = Результат + Часть создаёт новую строку в памяти и копирует старое содержимое. На массиве из десятков элементов это незаметно, но при объединении тысяч строк в цикле время работы растёт квадратично.

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

Если на старой платформе нужно собирать большой текст порциями, используйте объект ЗаписьТекста или ТекстовыйДокумент — они буферизуют данные и избегают постоянного пересоздания строки. Для промежуточного накопления также подойдёт добавление частей в массив с финальной склейкой один раз.

Типичные ошибки при объединении строк

Самая частая ошибка — передача в СтрСоединить не массива, а другой коллекции. Платформа выдаёт ошибку несоответствия типов. Решение: преобразуйте коллекцию, например ТаблицаТоваров.ВыгрузитьКолонку("Наименование") вернёт именно массив.

Вторая распространённая проблема — пустые и неопределённые элементы. Если в массив попадают пустые строки, в результате появятся двойные разделители («Гвозди, , Пила»). Перед склейкой отфильтруйте массив или проверяйте элементы в цикле через ПустаяСтрока().

Третья ошибка — неявное преобразование NULL из запроса. Значение NULL нельзя привести к строке напрямую, обращение вызовет ошибку. Используйте ЕСТЬNULL(Поле, "") в запросе либо проверку ЗначениеЗаполнено() при обходе выборки.

Типичные ошибки
01
Передача списка значений или таблицы вместо массива — ошибка несоответствия типов; сначала преобразуйте коллекцию
02
Пустые элементы в массиве — в результате появляются двойные разделители; отфильтруйте массив перед склейкой
03
NULL из запроса без ЕСТЬNULL — ошибка преобразования; обрабатывайте NULL на уровне запроса
04
Ручной цикл конкатенации на тысячах элементов — заметное падение производительности вместо одного вызова СтрСоединить

Как проверить результат и выбрать подход

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

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

Маршрут решения

Как выбрать действие

Платформа 8.3.6 или новее, данные в массивеИспользуйте штатную СтрСоединить(Массив, Разделитель)
Платформа старше 8.3.6 или режим совместимости ограниченНапишите функцию-обёртку с циклом в общем модуле
Нужно соединить фиксированный набор полейПримените СтрШаблон с параметрами
Собирается многострочный текст с переносамиИспользуйте ТекстовыйДокумент или склейку через Символ.ПС
Контрольные точки

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

Разделители в итоговой строке
Норма

Разделитель только между элементами

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

Разделитель в начале, конце или двойные разделители

Пустой массив на входе
Норма

Возвращается пустая строка без ошибки

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

Ошибка обращения к индексу или Неопределено

Массив из одного элемента
Норма

Результат равен самому элементу

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

Лишний разделитель или пустая строка

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

Почему возникает ошибка «Процедура или функция СтрСоединить не определена»?

Функция появилась в платформе 8.3.6. Если ошибка возникает, либо сервер работает на более старой версии, либо в свойствах конфигурации установлен режим совместимости ниже 8.3.6 — в этом режиме новые методы недоступны. Проверьте версию платформы и режим совместимости в конфигураторе.

Можно ли соединить колонку таблицы значений без цикла?

Да. Вызовите Таблица.ВыгрузитьКолонку("ИмяКолонки") — метод вернёт массив значений колонки, который сразу передаётся в СтрСоединить. Это короче и быстрее ручного обхода строк таблицы.

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

Передайте в качестве разделителя Символ.ПС: СтрСоединить(Массив, Символ.ПС). Для Windows-формата файлов может потребоваться Символ.ВК + Символ.ПС, особенно если текст дальше записывается в файл для обмена с внешними системами.

Что делать, если в массиве числа и даты, а не строки?

Платформа попытается привести их к строке автоматически, но формат будет зависеть от настроек. Для предсказуемого результата заранее преобразуйте значения через Формат() с нужной форматной строкой или Строка(), собрав новый массив строк.

Есть ли обратная функция — разбить строку на массив?

Да, СтрРазделить(Строка, Разделитель) — она также доступна с платформы 8.3.6. На старых версиях применяют цикл с СтрНайти() и Лев()/Сред() либо разбор через ТекстовыйДокумент, если разделитель — перенос строки.

Как убрать из склейки повторяющиеся значения?

Перед объединением пройдите по массиву и добавляйте элементы в соответствие как ключи — дубли автоматически отсеются. Затем выгрузите ключи обратно в массив и передайте его в СтрСоединить. Порядок элементов при этом не гарантируется; если он важен, проверяйте наличие элемента в новом массиве через Найти() перед добавлением.

Итог

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

СтрСоединить — штатная функция платформы 8.3.6+ для склейки массива строк через разделитель. На старых платформах её заменяет собственная функция с циклом, размещённая в общем модуле. Перед склейкой преобразуйте коллекцию в массив, отфильтруйте пустые значения и обработайте NULL из запросов.