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