Как убрать лишние пробелы в строке в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с текстовыми данными в 1С программисты часто сталкиваются с проблемой "грязных" строк. Это могут быть лишние пробелы в начале или конце строки, двойные или тройные пробелы между словами, а также невидимые спецсимволы, которые мешают поиску, сравнению или корректному выводу данных в печатные формы. Особенно актуальна эта задача при загрузке данных из внешних источников: Excel-файлов, текстовых документов или веб-сервисов.

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

Метод 1: Классический цикл с использованием СтрЗаменить

Это проверенный временем способ, который использовался еще в версии 7.7. Суть метода заключается в том, что мы ищем в строке два идущих подряд пробела и заменяем их на один до тех пор, пока поиск возвращает положительный результат. Разберем, почему простой метод СтрЗаменить(МояСтрока, " ", " ") без цикла может не сработать. Если в строке три пробела подряд, однократная замена превратит их в два пробела. Поэтому цикл необходим для полной очистки.

Проанализируем пример реализации такого алгоритма:


МояСтрока = "Проверка   лишних  пробелов    в   тексте";
Пока Найти(МояСтрока, "  ") > 0 Цикл
    МояСтрока = СтрЗаменить(МояСтрока, "  ", " ");
КонецЦикла;
// Результат: "Проверка лишних пробелов в тексте"

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

Метод 2: Использование функций СтрРазделить и СтрСоединить (оптимально для 1С 8.3)

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

Рассмотрим по шагам, как работает эта связка:

  1. Функция СтрРазделить разбивает исходную строку в массив, используя пробел как разделитель.
  2. Критически важный параметр Ложь в конце функции указывает системе, что пустые строки (которые образуются на месте лишних пробелов) в массив включать не нужно.
  3. Функция СтрСоединить собирает элементы массива обратно в одну строку, вставляя между ними ровно один пробел.

Посмотрим на пример кода:


ИсходнаяСтрока = "  Слишком    много     пробелов  ";
// Разбиваем строку, исключая пустые вхождения
МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь);
// Соединяем слова обратно через один пробел
Результат = СтрСоединить(МассивСлов, " ");
// Результат: "Слишком много пробелов"

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

Метод 3: Использование регулярных выражений (RegExp)

Для более сложных случаев, когда нужно заменить не только пробелы, но и любые "пробельные символы" (табуляцию, переводы строк, неразрывные пробелы) на один пробел, идеально подходят регулярные выражения. В 1С это реализуется через COM-объект VBScript.RegExp.

Разберем пример реализации функции:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.MultiLine = Истина;
// Шаблон "\s+" находит любую последовательность из одного или более пробельных символов
RegExp.Pattern = "\s+";
СтрокаДляОчистки = "Текст	с  табуляцией и
переносом";
Результат = RegExp.Replace(СтрокаДляОчистки, " ");

Внимание: Использование COM-объектов ограничивает кроссплатформенность вашего кода. Данный метод будет работать только в операционной системе Windows. Если ваш сервер 1С работает на Linux, этот код вызовет ошибку.

Метод 4: Борьба с неразрывными пробелами и форматированием чисел

Часто вопрос "как убрать пробелы" возникает при работе с числами, преобразованными в строку. В 1С по умолчанию при выводе числа используется разделитель групп разрядов — неразрывный пробел (символ с кодом 160). Обычная функция СтрЗаменить(С, " ", "") его не удалит.

Если вам нужно получить число в виде строки без пробелов, правильнее использовать функцию Формат на этапе преобразования:


ЧисловоеЗначение = 1500000;
// Используем параметр ЧГ=0 (Группировка = 0), чтобы убрать разделители
СтрокаБезПробелов = Формат(ЧисловоеЗначение, "ЧГ=0"); 
// Результат: "1500000"

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


// Символы.НПП - это системная константа для неразрывного пробела
ЧистаяСтрока = СтрЗаменить(СтрокаСПробелами, Символы.НПП, "");

Метод 5: Использование инструментов БСП

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

Рассмотрим вызов этой функции:


Текст = "  Много   лишних   пробелов  ";
// Функция удаляет лишние пробелы внутри и обрезает по краям
Результат = СтроковыеФункцииКлиентСервер.СократитьПробелы(Текст);

Использование функций БСП является лучшей практикой, так как этот код уже протестирован на производительность и учитывает различные нюансы кодировок и спецсимволов.

Сравнительный анализ и рекомендации

Подводя итог, проанализируем, какой метод выбрать в зависимости от ситуации:

  1. Для простых задач в 1С 8.3: Используйте связку СтрРазделить + СтрСоединить. Это быстро, надежно и читаемо.
  2. Для очистки данных от любого "мусора" (табы, переносы): Если работаете под Windows, выбирайте RegExp. Если нужна кроссплатформенность — делайте предварительную замену всех спецсимволов на обычный пробел через СтрЗаменить, а затем применяйте метод с массивом.
  3. При работе с числами: Всегда используйте форматную строку "ЧГ=0" вместо последующей очистки строки. Это сэкономит ресурсы сервера.
  4. В типовых конфигурациях: Всегда отдавайте приоритет функциям модуля СтроковыеФункцииКлиентСервер.

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

← На главную