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

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

Как сложить две строки в 1С: способы и примеры

Как сложить две строки в 1С: оператор «+», функции СтрСоединить и СтрШаблон, переносы строк, типичные ошибки с типами данных и готовые примеры кода.

Сложение строк (конкатенация) — одна из самых частых операций во встроенном языке 1С. Она нужна при формировании ФИО, адресов, сообщений пользователю, представлений документов и текстов запросов. Несмотря на простоту задачи, у неё есть несколько способов решения и характерные ошибки, связанные с типами данных.

Основной инструмент — оператор «+», но в ряде случаев удобнее функции СтрСоединить, СтрШаблон и СтрокаСоединенияИнформационнойБазы. Выбор зависит от количества фрагментов, необходимости разделителей и требований к читаемости кода.

Сложение строк оператором «+»

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

Имя = "Иван";

Фамилия = "Петров";

ПолноеИмя = Фамилия + " " + Имя;

// ПолноеИмя = "Петров Иван"

Обратите внимание: пробел между фамилиями и именем добавлен явно, третьим операндом. Если написать просто Фамилия + Имя, получится «ПетровИван» — платформа ничего не вставляет автоматически. Это одна из самых частых ошибок новичков.

Оператор «+» можно применять цепочкой для любого количества фрагментов. Выражение вычисляется слева направо, поэтому порядок операндов определяет порядок частей в итоговой строке.

Почему возникает ошибка «Преобразование значения к типу Строка не может быть выполнено»

Оператор «+» в 1С не выполняет неявного приведения типов, как в некоторых других языках. Если один из операндов — число, дата, булево или ссылка на объект, а второй — строка, платформа выдаст ошибку выполнения.

Номер = 15;

Текст = "Документ №" + Номер; // ОШИБКА

Текст = "Документ №" + Строка(Номер); // правильно

Текст = "Документ №" + Формат(Номер, "ЧГ="); // правильно, без разделителей групп

Для преобразования используют функции Строка() и Формат(). Функция Строка() даёт стандартное представление значения, а Формат() позволяет управлять выводом: убрать разделители групп у чисел, задать формат даты, вывести «Да/Нет» вместо «Истина/Ложь».

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

Функция СтрСоединить для массивов строк

Когда нужно соединить много фрагментов с одинаковым разделителем, цепочка плюсов становится громоздкой. Функция СтрСоединить() принимает массив строк и строку-разделитель.

Части = Новый Массив;

Части.Добавить("г. Москва");

Части.Добавить("ул. Ленина");

Части.Добавить("д. 5");

Адрес = СтрСоединить(Части, ", ");

// Адрес = "г. Москва, ул. Ленина, д. 5"

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

Дополнительное преимущество — отсутствие «висячих» разделителей. При ручной конкатенации в цикле легко получить лишнюю запятую в конце строки, и её приходится обрезать через Лев(). СтрСоединить решает эту проблему автоматически.

Соединение списка значений через запятую
  1. 1
    Создайте пустой массив: Части = Новый Массив
  2. 2
    В цикле добавляйте нужные фрагменты: Части.Добавить(Строка(Значение))
  3. 3
    После цикла вызовите Результат = СтрСоединить(Части, ", ")
  4. 4
    Проверьте результат выводом в сообщение или журнал

Функция СтрШаблон для подстановки значений

Когда строка — это шаблон с переменными частями (сообщение пользователю, текст письма), удобнее СтрШаблон(). В тексте ставятся метки %1, %2 и так далее, а функция подставляет вместо них переданные значения.

Сообщение = СтрШаблон("Документ №%1 от %2 проведён успешно.",

НомерДокумента, Формат(ДатаДокумента, "ДЛФ=D"));

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

Ограничение: нумерация параметров начинается с %1, и пропуск или перестановка номеров приведёт к неверной подстановке. При изменении шаблона проверяйте соответствие всех меток и аргументов.

Перенос строки и многострочные литералы

Чтобы соединить строки с переносом, используйте константу Символы.ПС (перевод строки) или Символы.ВК + Символы.ПС. Это нужно при формировании многострочных сообщений, адресов в печатных формах и текстовых файлов.

Текст = "Первая строка" + Символы.ПС + "Вторая строка";

Есть и альтернатива — многострочный строковый литерал. В модуле текст в кавычках можно продолжить на следующей строке, если каждая новая строка начинается с символа «|»:

Текст = "Первая строка

|Вторая строка

|Третья строка";

Такой литерал уже содержит переносы, и складывать его не нужно. Это удобно для длинных текстов запросов и шаблонов сообщений.

Сравнение способов соединения строк

Оператор «+»

Подходит для 2–3 фрагментов. Требует явного приведения типов, при большом числе частей код становится трудно читать.

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

Лучший выбор для массива фрагментов с одинаковым разделителем. Нет лишних разделителей на концах.

СтрШаблон()

Оптимален для сообщений и шаблонов с подстановкой значений. Сам приводит значения к строке.

Многострочный литерал

Для заранее известных многострочных текстов без вычисляемых частей.

Производительность и сложение в цикле

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

Практическая рекомендация: в длинных циклах собирайте фрагменты в массив и соединяйте один раз через СтрСоединить(). Для формирования текстовых файлов и XML используйте объекты ЗаписьТекста и ЗаписьXML — они пишут данные порциями без накопления гигантской строки в памяти.

Для небольших объёмов (сообщения, представления, заголовки) разница между способами незаметна, и выбирать следует по читаемости кода, а не по скорости.

Частая ситуация: нужно убрать пробелы по краям каждого фрагмента перед сложением. Используйте СокрЛП() для каждой части — это избавит от двойных пробелов и «прилипших» разделителей в итоговой строке.
ПЗ
Практическое замечание

Типичные ошибки при сложении строк

Первая ошибка — отсутствие разделителя: Фамилия + Имя вместо Фамилия + " " + Имя. Проверяйте результат глазами на тестовых данных, особенно при соединении частей адреса или ФИО.

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

Третья ошибка — разделители групп в числах. Строка(1234567) может вернуть «1 234 567» с неразрывными пробелами, что портит, например, номер в строке подключения или штрихкод. Используйте Формат(Число, "ЧГ=") для «чистого» вывода.

Четвёртая ошибка — конкатенация значения NULL из запроса. Если поле запроса вернуло NULL, сложение со строкой завершится ошибкой. Обрабатывайте такие поля через ЕСТЬNULL() в запросе или проверяйте значение перед сложением.

Типичные ошибки
01
Сложение строки с числом без Строка() или Формат() — ошибка выполнения
02
Пропущенный пробел между фрагментами — слипшийся текст вроде «ПетровИван»
03
Разделители групп у чисел через Строка() — «1 234 567» вместо «1234567»
04
Сложение со значением NULL из запроса — ошибка, решается через ЕСТЬNULL()
05
Лишняя запятая в конце при ручной сборке в цикле — используйте СтрСоединить()
Контрольные точки

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

Разделители между частями
Норма

Пробелы и запятые стоят ровно там, где нужно

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

Слитный текст или разделители в начале/конце строки

Числа в строке
Норма

Числа выведены в нужном формате без лишних пробелов

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

Разделители групп или ошибка преобразования типа

Пустые исходные значения
Норма

Пустая часть не оставляет лишний разделитель

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

Двойные запятые, висячие пробелы

Многострочный текст
Норма

Переносы строк отображаются корректно

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

Весь текст в одну строку или лишние пустые строки

Ответы на частые вопросы

Как сложить строку и число без ошибки?

Преобразуйте число явно: "Итого: " + Строка(Сумма) или Формат(Сумма, "ЧГ="). Формат предпочтительнее, если нужно убрать разделители групп или задать число знаков после запятой.

Чем отличаются СтрСоединить и сложение через «+»?

СтрСоединить принимает массив строк и вставляет разделитель только между элементами, не оставляя его на концах. Оператор «+» соединяет операнды как есть, и разделители нужно добавлять вручную. Для двух-трёх фрагментов проще «+», для списков — СтрСоединить.

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

Вставьте между фрагментами константу Символы.ПС: Стр1 + Символы.ПС + Стр2. Альтернатива — многострочный литерал с символом «|» в начале каждой новой строки модуля.

Почему при сложении со значением из запроса возникает ошибка?

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

Как соединить строки с кавычками внутри?

В строковом литерале 1С кавычка внутри строки удваивается: "Он сказал ""привет""". При программной сборке удобнее формировать такие фрагменты отдельно и соединять их с остальным текстом оператором «+» или через СтрШаблон.

Есть ли ограничение на длину строки при сложении?

Жёсткого практического ограничения для строк переменной длины нет, но очень большие строки расходуют память и замедляют работу. Для формирования больших текстов (файлы, XML) используйте ЗаписьТекста или ЗаписьXML вместо накопления одной гигантской строки.

Итог

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

Две строки складываются оператором «+», разделители добавляются явно. Числа и даты предварительно преобразуйте через Строка() или Формат(), значения NULL из запросов отсекайте через ЕСТЬNULL. Для списков используйте СтрСоединить, для шаблонов сообщений — СтрШаблон, для переносов — Символы.ПС.