Разработка и Конфигурация · 10 мин
Как расширить строку в 1С: рабочие способы с примерами кода
Способы расширить строку в 1С: конкатенация через «+», СтрШаблон, дополнение символами до нужной длины, многострочные литералы. Примеры кода и типичные ошибки.
Расширить строку в 1С можно несколькими способами: склеить две строки оператором «+», подставить значения в шаблон через СтрШаблон, дополнить строку символами до фиксированной длины или собрать длинный текст из частей в цикле. Выбор зависит от задачи: простое соединение реквизитов, формирование сообщения пользователю, подготовка поля фиксированной ширины для обмена или сборка XML/JSON.
Строки в 1С — неизменяемый тип: любая операция создаёт новую строку, а не модифицирует старую. Это важно понимать при работе в циклах: наивное наращивание длинной строки через «+» внутри цикла на больших объёмах заметно тормозит, и там лучше использовать Массив с последующей СтрСоединить или ЗаписьXML/ТекстовыйДокумент.
Ниже разобраны основные приёмы с готовыми фрагментами кода, ограничения каждого подхода и типичные ошибки, которые приводят к лишним пробелам, потере переносов строк и падению производительности.
Базовое склеивание строк оператором «+»
Самый частый способ расширить строку — конкатенация через «+». Оператор работает только со строками: если один из операндов число, дата или булево, платформа вызовет исключение «Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов» либо ошибку преобразования, поэтому нестроковые значения нужно приводить явно через Строка() или Формат().
Фамилия = "Иванов";
Имя = "Петр";
ПолноеИмя = Фамилия + " " + Имя; // "Иванов Петр"
Сумма = 1250.5;
Текст = "Итого: " + Формат(Сумма, "ЧДЦ=2") + " руб."; // "Итого: 1 250,50 руб."
Обратите внимание: пробелы и разделители не добавляются автоматически. Конструкция Фамилия + Имя даст «ИвановПетр» — разделитель нужно вставлять явно. Это одна из самых частых причин «слипшихся» надписей в печатных формах и сообщениях.
Если склеивается более трёх-четырёх фрагментов, одиночная строка с плюсами становится трудночитаемой. В этом случае лучше перейти на СтрШаблон или массив частей — код будет короче и безопаснее при доработках.
Подстановка значений через СтрШаблон
СтрШаблон подставляет значения вместо маркеров %1, %2 и так далее. Это удобнее «+», когда строка длинная и в ней несколько переменных частей: шаблон читается как обычный текст, а параметры перечислены в конце.
Сообщение = СтрШаблон("Документ №%1 от %2 проведён на сумму %3 руб.",
НомерДокумента,
Формат(ДатаДокумента, "ДЛФ=D"),
Формат(СуммаДокумента, "ЧДЦ=2"));
Два практических ограничения. Во-первых, параметры подставляются в порядке следования маркеров — перепутанные номера дадут неверный текст без какой-либо ошибки выполнения, поэтому после правок шаблона проверяйте результат глазами. Во-вторых, если нужно вывести сам символ «%», в шаблоне его следует удвоить или экранировать согласно документации вашей версии платформы.
СтрШаблон особенно полезен в сообщениях пользователю и в текстах, которые потом выносятся в макеты или локализацию: переводчику проще работать с цельной фразой, чем с набором склеенных кусков.
Дополнение строки символами до нужной длины
Встроенной функции «дополнить слева/справа» в языке 1С нет, поэтому для обменов с фиксированной шириной полей (банковские форматы, старые текстовые выгрузки, штрихкоды) пишут небольшую функцию. Идея: пока длина строки меньше требуемой, добавлять символ-заполнитель с нужной стороны.
Функция ДополнитьСтроку(Знач Строка, Длина, Символ = "0", Слева = Истина)
Пока СтрДлина(Строка) < Длина Цикл
Если Слева Тогда
Строка = Символ + Строка;
Иначе
Строка = Строка + Символ;
КонецЕсли;
КонецЦикла;
Возврат Строка;
КонецФункции
// Примеры:
Номер = ДополнитьСтроку("123", 8); // "00000123"
Код = ДополнитьСтроку("AB", 6, "-", Ложь); // "AB----"
Частая ошибка в таких функциях — не проверять, что исходная строка уже длиннее требуемой. Тогда функция молча вернёт слишком длинное значение, и выгрузка «поедет». Добавьте в начало проверку: если СтрДлина(Строка) > Длина — либо обрезать (Лев/Прав), либо вызвать исключение, в зависимости от требований формата.
Второй тонкий момент — символ-заполнитель должен быть ровно один символ. Если передать строку из двух символов, итоговая длина может превысить требуемую на единицу, и цикл завершится с нарушением формата.
Расширение строки в цикле: почему «+» тормозит и что делать
Конструкция вида Текст = Текст + ОчереднаяЧасть внутри цикла по тысячам элементов — классический источник медленного кода. Каждая операция создаёт новую строку и копирует всё накопленное содержимое, поэтому время растёт квадратично от итогового размера. На десятках итераций это незаметно, на десятках тысяч — уже ощутимо.
Быстрая альтернатива — собирать части в массив и один раз склеить их через СтрСоединить. Разделитель передаётся первым параметром, что заодно избавляет от ручной обработки «висячей» запятой или переноса в конце.
Части = Новый Массив;
Для Каждого СтрокаТовара Из Товары Цикл
Части.Добавить(СтрокаТовара.Наименование + " — " + СтрокаТовара.Количество);
КонецЦикла;
ИтоговыйТекст = СтрСоединить(Части, Символы.ПС);
Если результат нужен как текстовый документ (для записи в файл), ещё удобнее объект ТекстовыйДокумент: метод ДобавитьСтроку сам добавляет переносы, а метод ПолучитьТекст возвращает готовую строку. Для XML и JSON не собирайте текст вручную вообще — используйте ЗаписьXML и ЗаписьJSON, они гарантируют корректное экранирование спецсимволов.
Сравнение вариантов
Подходит для 2–4 фрагментов вне циклов. Ограничение: требует явного приведения нестроковых типов и ручной вставки разделителей.
Подходит для длинных фраз с несколькими подстановками. Ограничение: номера параметров легко перепутать при правках.
Подходит для циклов и большого числа частей. Ограничение: нужен дополнительный массив в памяти.
Подходит для файлов и структурированных форматов. Ограничение: избыточно для простых однострочных склеек.
Многострочные строки и переносы
Расширить строку переносом строки можно двумя способами. Первый — явно добавить Символы.ПС (перенос строки), Символы.ВК (возврат каретки) или их комбинацию: Текст = Текст + Символы.ПС + НоваяСтрока. Второй — многострочный строковый литерал в коде: каждая следующая строка литерала начинается с символа «|».
Адрес = "г. Москва,
|ул. Примерная, д. 1,
|офис 10";
Переносы внутри многострочного литерала сохраняются в значении. Однако помните: в полях ввода, не рассчитанных на многострочность, и в некоторых форматах обмена переносы либо теряются, либо ломают структуру файла. Перед выгрузкой проверяйте требования приёмника — иногда переносы нужно заменять пробелами через СтрЗаменить(Текст, Символы.ПС, " ").
Для печатных форм надёжнее не склеивать многострочный текст вручную, а использовать области макета: каждая строка выводится отдельной областью, и переносы контролируются макетом, а не кодом.
Проверка результата и типичные ошибки
После любого преобразования строки полезно проверить три вещи: итоговую длину (СтрДлина), отсутствие лишних пробелов по краям (СокрЛП) и корректность разделителей. Для отладки удобно выводить промежуточные значения через Сообщить() или смотреть их в табло при пошаговой отладке.
Отдельно отметьте поведение СокрЛП: он убирает неразрывные пробелы и символы табуляции по краям, что полезно после склейки данных из разных источников. Но применять его нужно к итоговой строке, а не к каждому фрагменту в середине — иначе можно случайно удалить значимые отступы внутри текста.
Как проверить результат
СтрДлина равна требуемой ширине поля
Длина больше требуемой — исходное значение не влезло, функция его не обрезала
Между частями есть нужные разделители, нет двойных пробелов
Части слиплись или разделители продублированы
Переносы на месте при открытии в целевой программе
Весь текст в одну строку или лишние пустые строки
Сборка через массив и СтрСоединить
Текст = Текст + ... на тысячах итераций
Что важно запомнить
Короткие склейки — оператор «+» с явным приведением типов, длинные фразы — СтрШаблон, дополнение до длины — своя функция с проверкой превышения, циклы — массив и СтрСоединить. Всегда проверяйте разделители, переносы и итоговую длину перед выгрузкой.
Частые вопросы
Как склеить строку с числом без ошибки?
Приведите число к строке явно: Строка(Число) даст представление по умолчанию, а Формат(Число, "ЧДЦ=2; ЧГ=0") — контролируемый формат без разделителей групп. Складывать строку и число напрямую нельзя — платформа выдаст ошибку несоответствия типов.
Есть ли в 1С аналог String.Format или f-строк?
Да, это СтрШаблон с маркерами %1, %2 и так далее. Параметры подставляются по номерам, поэтому при правке текста шаблона проверяйте, что порядок аргументов соответствует новой расстановке маркеров.
Как дополнить число нулями слева, например «000123»?
Используйте функцию дополнения через цикл со СтрДлина, приведённую в статье, либо возможности Формат() — для чисел строка формата с лидирующими нулями (например, "ЧЦ=6; ЧВН=") даёт нужный результат без ручного цикла.
Почему в цикле строка собирается очень медленно?
Строки в 1С неизменяемы: каждая операция «+» копирует всю накопленную строку заново. Решение — складывать части в массив и в конце вызвать СтрСоединить, либо использовать ТекстовыйДокумент для построчной сборки.
Как вставить перенос строки внутрь текста?
Добавьте Символы.ПС (или Символы.ВК + Символы.ПС для Windows-форматов) между частями текста, либо используйте многострочный литерал с символом «|» в начале каждой строки. Перед выгрузкой в файл уточните, какой тип переноса ожидает приёмник.
Как убрать лишние пробелы после склейки?
Примените СокрЛП к итоговой строке — функция удалит пробелы, табуляции и неразрывные пробелы с обоих концов. Двойные пробелы внутри текста убирают через СтрЗаменить в цикле или аккуратной сборкой с единственным разделителем.