При работе с текстовыми данными в 1С программисты часто сталкиваются с проблемой "грязных" строк. Это могут быть лишние пробелы в начале или конце строки, двойные или тройные пробелы между словами, а также невидимые спецсимволы, которые мешают поиску, сравнению или корректному выводу данных в печатные формы. Особенно актуальна эта задача при загрузке данных из внешних источников: Excel-файлов, текстовых документов или веб-сервисов.
В этой статье мы подробно разберем, как очистить строку от лишних пробелов, используя различные подходы — от классических алгоритмов до современных встроенных функций платформы 1С:Предприятие 8.3.
Это проверенный временем способ, который использовался еще в версии 7.7. Суть метода заключается в том, что мы ищем в строке два идущих подряд пробела и заменяем их на один до тех пор, пока поиск возвращает положительный результат. Разберем, почему простой метод СтрЗаменить(МояСтрока, " ", " ") без цикла может не сработать. Если в строке три пробела подряд, однократная замена превратит их в два пробела. Поэтому цикл необходим для полной очистки.
Проанализируем пример реализации такого алгоритма:
МояСтрока = "Проверка лишних пробелов в тексте";
Пока Найти(МояСтрока, " ") > 0 Цикл
МояСтрока = СтрЗаменить(МояСтрока, " ", " ");
КонецЦикла;
// Результат: "Проверка лишних пробелов в тексте"
Важный нюанс: Этот метод хорошо справляется с обычными пробелами (код символа 32), но он "не видит" неразрывные пробелы или символы табуляции. Если ваша строка содержит такие символы, алгоритм их пропустит.
С выходом версии платформы 8.3.6 программистам стали доступны мощные функции для работы со строками, которые позволяют решить задачу без использования циклов Пока. Этот метод считается более современным и производительным, так как операции внутри платформенных функций оптимизированы.
Рассмотрим по шагам, как работает эта связка:
СтрРазделить разбивает исходную строку в массив, используя пробел как разделитель.Ложь в конце функции указывает системе, что пустые строки (которые образуются на месте лишних пробелов) в массив включать не нужно.СтрСоединить собирает элементы массива обратно в одну строку, вставляя между ними ровно один пробел.Посмотрим на пример кода:
ИсходнаяСтрока = " Слишком много пробелов ";
// Разбиваем строку, исключая пустые вхождения
МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь);
// Соединяем слова обратно через один пробел
Результат = СтрСоединить(МассивСлов, " ");
// Результат: "Слишком много пробелов"
Этот способ автоматически удаляет пробелы не только между словами, но и в начале и в конце строки. Это делает его универсальным инструментом для подготовки строк к записи в базу данных.
Для более сложных случаев, когда нужно заменить не только пробелы, но и любые "пробельные символы" (табуляцию, переводы строк, неразрывные пробелы) на один пробел, идеально подходят регулярные выражения. В 1С это реализуется через COM-объект VBScript.RegExp.
Разберем пример реализации функции:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.MultiLine = Истина;
// Шаблон "\s+" находит любую последовательность из одного или более пробельных символов
RegExp.Pattern = "\s+";
СтрокаДляОчистки = "Текст с табуляцией и
переносом";
Результат = RegExp.Replace(СтрокаДляОчистки, " ");
Внимание: Использование COM-объектов ограничивает кроссплатформенность вашего кода. Данный метод будет работать только в операционной системе Windows. Если ваш сервер 1С работает на Linux, этот код вызовет ошибку.
Часто вопрос "как убрать пробелы" возникает при работе с числами, преобразованными в строку. В 1С по умолчанию при выводе числа используется разделитель групп разрядов — неразрывный пробел (символ с кодом 160). Обычная функция СтрЗаменить(С, " ", "") его не удалит.
Если вам нужно получить число в виде строки без пробелов, правильнее использовать функцию Формат на этапе преобразования:
ЧисловоеЗначение = 1500000;
// Используем параметр ЧГ=0 (Группировка = 0), чтобы убрать разделители
СтрокаБезПробелов = Формат(ЧисловоеЗначение, "ЧГ=0");
// Результат: "1500000"
Если же строка уже получена и содержит неразрывные пробелы, проанализируем, как их удалить:
// Символы.НПП - это системная константа для неразрывного пробела
ЧистаяСтрока = СтрЗаменить(СтрокаСПробелами, Символы.НПП, "");
Если ваша конфигурация разработана на основе "1С:Библиотеки стандартных подсистем" (БСП), то изобретать велосипед не нужно. В составе БСП есть общий модуль СтроковыеФункцииКлиентСервер, который содержит готовую функцию для решения нашей задачи.
Рассмотрим вызов этой функции:
Текст = " Много лишних пробелов ";
// Функция удаляет лишние пробелы внутри и обрезает по краям
Результат = СтроковыеФункцииКлиентСервер.СократитьПробелы(Текст);
Использование функций БСП является лучшей практикой, так как этот код уже протестирован на производительность и учитывает различные нюансы кодировок и спецсимволов.
Подводя итог, проанализируем, какой метод выбрать в зависимости от ситуации:
СтрРазделить + СтрСоединить. Это быстро, надежно и читаемо.RegExp. Если нужна кроссплатформенность — делайте предварительную замену всех спецсимволов на обычный пробел через СтрЗаменить, а затем применяйте метод с массивом."ЧГ=0" вместо последующей очистки строки. Это сэкономит ресурсы сервера.СтроковыеФункцииКлиентСервер.Выясним причину, по которой строки могут оставаться "грязными" даже после очистки: всегда проверяйте наличие символа Символы.НПП. Это самая частая причина "невидимых" пробелов, которые не удаляются обычными методами.