Объединение строк — одна из самых частых операций при работе с 1С:Предприятие, будь то формирование отчетов, обработка данных или написание скриптов. На первый взгляд задача кажется тривиальной, но в 1С 8.3/8.2 есть несколько способов сложить две строки, каждый из которых имеет свои особенности. Неправильный выбор метода может привести к ошибкам компиляции, потере данных или некорректному отображению результата.

В этой статье мы разберем все актуальные способы объединения строк в 1С, включая оператор +, функцию СтрСоединить(), метод СокрЛП() и другие. Особое внимание уделим типичным ошибкам (например, работе с NULL), оптимизации кода и случаям, когда стандартные методы не подходят. Материал будет полезен как начинающим разработчикам, так и опытным программистам, которые хотят систематизировать знания.

1. Базовый способ: оператор "+"

Самый простой и интуитивно понятный метод — использование оператора конкатенации +. Он работает во всех версиях платформы, начиная с 1С 7.7, и подходит для большинства задач:

```1с

Строка1 = "Привет, ";

Строка2 = "мир!";

Результат = Строка1 + Строка2; // "Привет, мир!"

```

Однако у этого метода есть важные ограничения:

  • 🚫 Не работает с NULL: если одна из строк не инициализирована, результат будет NULL, а не пустая строка.
  • 🐢 Производительность: при объединении большого количества строк в цикле оператор + создает промежуточные объекты, что может замедлить выполнение.
  • 📏 Отсутствие разделителя: если нужно вставить пробел или другой символ между строками, его придется добавлять вручную.
📊 Какой оператор для объединения строк вы используете чаще?
Оператор +
Функция СтрСоединить()
Метод СокрЛП()
Другой вариант

Пример с обработкой NULL:

```1с

Строка1 = Неопределено;

Строка2 = "мир!";

Результат = (Строка1 = Неопределено ? "" : Строка1) + Строка2; // "мир!"

```

2. Функция СтрСоединить(): гибкость и контроль

Для более сложных сценариев в 1С 8.3 предусмотрена функция СтрСоединить(), которая позволяет:

  • 🔹 Указывать разделитель между строками (например, запятую или пробел).
  • 🔹 Игнорировать NULL-значения автоматически.
  • 🔹 Объединять неограниченное количество строк в одном вызове.

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

```1с

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

```

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

```1с

// Простое объединение с пробелом

Результат = СтрСоединить("Hello", "world", " "); // "Hello world"

// Объединение массива строк

МассивСтрок = Новый Массив;

МассивСтрок.Добавить("Яблоки");

МассивСтрок.Добавить("Груши");

МассивСтрок.Добавить("Бананы");

Результат = СтрСоединить(МассивСтрок, ", "); // "Яблоки, Груши, Бананы"

// Игнорирование NULL

Строка1 = Неопределено;

Строка2 = "мир!";

Результат = СтрСоединить(Строка1, Строка2, " "); // "мир!"

```

💡

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

3. Методы СокрЛП() и СтрЗаменить(): обработка пробелов

При объединении строк часто возникает проблема с лишними пробелами. Например, если одна из строк заканчивается пробелом, а другая начинается с него, в результате получится двойной пробел. Для решения этой задачи используют:

  • 🧹 СокрЛП() — удаляет лишние пробелы и переносы строк.
  • 🔄 СтрЗаменить() — заменяет подстроки (например, двойные пробелы на одиночные).

Примеры:

```1с

// Удаление лишних пробелов

Строка1 = "Hello ";

Строка2 = " world";

Результат = СокрЛП(Строка1 + " " + Строка2); // "Hello world"

// Замена двойных пробелов

Результат = СтрЗаменить(Строка1 + Строка2, " ", " "); // "Hello world" → "Hello world"

```

Что делать если СокрЛП() обрезает нужные пробелы?

Если вам нужно сохранить пробелы внутри слов (например, в аббревиатурах типа "Р Ф"), используйте комбинацию СтрЗаменить() и регулярных выражений. Пример:

Результат = СтрЗаменить(Строка, "( )+", " ") — заменяет все последовательности пробелов на один.

Важный нюанс: СокрЛП() также удаляет переносы строк (Символы.ПС), что не всегда удобно. Если нужно сохранить разрывы строк, используйте:

```1с

Результат = СтрЗаменить(Строка, Символы.Таб + " ", Символы.Таб); // Удаляет пробелы после табуляции

```

4. Объединение с форматом: функция Формат()

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

  • 📝 Вставлять строки в заранее определенный шаблон.
  • 🔢 Форматировать числа, даты и другие типы данных вместе со строками.
  • 🌍 Поддерживает многоязычность (если шаблон задан на нескольких языках).

Примеры:

```1с

// Простое форматирование

Имя = "Иван";

Фамилия = "Иванов";

Результат = Формат("Привет, %1 %2!", Имя, Фамилия); // "Привет, Иван Иванов!"

// Форматирование с числами

Количество = 5;

Цена = 100.50;

Результат = Формат("Заказано %1 шт. на сумму %2 руб.", Количество, Цена);

// "Заказано 5 шт. на сумму 100,50 руб."

```

Обратите внимание, что Формат() автоматически преобразует аргументы в строки, поэтому NULL-значения будут представлены как пустые строки.

5. Работа с большими строками: ПостроительСтроки

Если вам нужно объединить десятки или сотни строк (например, при формировании большого XML или JSON), использование оператора + или СтрСоединить() может привести к проблемам с производительностью. В таких случаях рекомендуется использовать объект ПостроительСтроки.

Преимущества ПостроительСтроки:

  • Высокая производительность при работе с большими данными.
  • 🔄 Гибкое управление — можно добавлять строки по частям.
  • 📤 Поддержка кодировок (важно при работе с файлами).

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

```1с

Построитель = Новый ПостроительСтроки();

Построитель.ДобавитьСтроку("Начало текста");

Построитель.ДобавитьСтроку("Продолжение текста");

Построитель.ДобавитьСтроку("Конец текста");

Результат = Построитель.ПолучитьСтроку();

// Результат:

// Начало текста

// Продолжение текста

// Конец текста

```

Объединяете более 10 строк|Работаете с большими текстами (>10 КБ)|Нужно управлять кодировкой|Формируете данные для экспорта в файл-->

Для добавления строк с разделителем используйте метод Добавить():

```1с

Построитель.Добавить("Строка1");

Построитель.Добавить("Строка2", ", "); // Разделитель

Результат = Построитель.ПолучитьСтроку(); // "Строка1, Строка2"

```

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

При работе со строками в разработчики часто сталкиваются с следующими проблемами:

Ошибка Причина Решение
Ошибка компиляции: Недопустимый тип операнда Попытка сложить строку с числом или датой без приведения типов. Используйте Строка() для явного преобразования: Строка(Число) + " руб."
Лишние пробелы в результате Строки содержат пробелы в начале/конце. Применяйте СокрЛП() или СтрЗаменить().
NULL в результате Одна из строк не инициализирована. Используйте СтрСоединить() или проверку на Неопределено.
Неправильная кодировка Работа с файлами или внешними системами. Указывайте кодировку явно: ПостроительСтроки(,,КодировкаТекста.UTF8).
💡

Всегда проверяйте строки на NULL перед объединением, если они поступают из внешних источников (базы данных, веб-сервисы, файлы).

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

```1с

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

Строка2 = "Вторая строка";

Результат = Строка1 + Строка2;

// Результат:

// Первая строка

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

```

Если переносы не нужны, удалите их с помощью:

```1с

Результат = СтрЗаменить(Результат, Символы.ПС, " ");

```

7. Продвинутые сценарии: регулярные выражения и циклы

Для сложных задач (например, объединения строк по условию или с предварительной обработкой) можно использовать:

  • 🔍 Регулярные выражения — для поиска и замены подстрок.
  • 🔁 Циклы — для динамического объединения элементов массива или выборки.
  • 📊 Агрегатные функции — например, Группировка в запросах.

Пример с регулярными выражениями (удаление всех неалфавитных символов перед объединением):

```1с

Текст = "Привет, мир! 123";

Регулярка = Новый РегулярноеВыражение("[^а-яА-Я ]");

Результат = Регулярка.Заменить(Текст, "");

// "Привет мир"

```

Пример объединения строк из массива с условием:

```1с

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

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

Массив.Добавить("Банан");

Массив.Добавить("Апельсин");

Построитель = Новый ПостроительСтроки();

Для Каждого Элемент Из Массив Цикл

Если Лев(Элемент, 1) = "А" Тогда

Построитель.Добавить(Элемент + ", ");

КонецЕсли;

КонецЦикла;

Результат = СокрЛП(Построитель.ПолучитьСтроку()); // "Апельсин, Яблоко"

```

Как объединить строки из запроса?

Если вам нужно объединить строки непосредственно в запросе к базе данных, используйте функцию СТРСОЕДИНИТЬ() в языке запросов:

ВЫБРАТЬ СТРСОЕДИНИТЬ(Таблица.Поле1, " ", Таблица.Поле2) КАК ОбъединеннаяСтрока ИЗ Таблица

FAQ: Частые вопросы по объединению строк в 1С

Можно ли объединить строки прямо в запросе к базе данных?

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

ВЫБРАТЬ

СТРСОЕДИНИТЬ(Клиенты.Наименование, " ", Клиенты.Адрес) КАК ПолноеНаименование

ИЗ

Справочник.Клиенты КАК Клиенты

Обратите внимание, что в запросах NULL-значения автоматически преобразуются в пустые строки.

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

Оператор + в не выполняет неявное преобразование типов. Чтобы объединить строку с числом, нужно явно преобразовать число в строку:

Число = 123;

Строка = "Итого: " + Строка(Число); // "Итого: 123"

Альтернативно можно использовать функцию Формат():

Результат = Формат("Итого: %1", Число);
Как объединить строки с сохранением регистра?

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

Строка1 = "ПРИВЕТ";

Строка2 = "мир";

Результат = НРег(Строка1) + " " + НРег(Строка2); // "привет мир"

Для приведения только первой буквы к верхнему регистру:

Функция ПерваяБукваВверх(Строка)

Возврат ВРег(Лев(Строка, 1)) + НРег(Сред(Строка, 2));

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

Результат = ПерваяБукваВверх("пРИВЕТ") + " " + ПерваяБукваВверх("мИР"); // "Привет Мир"

Чем ПостроительСтроки лучше, чем оператор +?

ПостроительСтроки эффективнее при:

  • Объединении большого количества строк (от 10 и более).
  • Работе с большими текстами (например, генерация XML/JSON).
  • Необходимости управлять кодировкой результата.

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

// Медленно для больших данных

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

Для Сч = 1 По 1000 Цикл

Результат = Результат + "Строка" + Сч + Символы.ПС;

КонецЦикла;

// Быстро

Построитель = Новый ПостроительСтроки();

Для Сч = 1 По 1000 Цикл

Построитель.ДобавитьСтроку("Строка" + Сч);

КонецЦикла;

Результат = Построитель.ПолучитьСтроку();

Как объединить строки с учетом локализации (многоязычность)?

Для поддержки нескольких языков:

  1. Храните шаблоны строк в константах или справочниках с привязкой к языку.
  2. Используйте функцию НСтр() для получения строки на текущем языке:
ТекстПриветствия = НСтр("ru = 'Привет, %1!'; en = 'Hello, %1!'");

Имя = "Иван";

Результат = Формат(ТекстПриветствия, Имя);

Для объединения локализованных строк используйте те же методы, но с учетом текущей языковой настройки:

Строка1 = НСтр("ru = 'Добро пожаловать'; en = 'Welcome'");

Строка2 = НСтр("ru = 'в систему!'; en = 'to the system!'");

Результат = СтрСоединить(Строка1, Строка2, " ");