Необходимость очистить строку от лишних пробелов — классическая задача, с которой регулярно сталкивается любой разработчик 1С. Пробелы, знаки табуляции и переносы строк относятся к категории так называемых «незначащих» символов, появление которых в данных часто приводит к неявным ошибкам при поиске, сравнении или интеграции систем. В этой статье мы подробно разберем, как быстро и правильно удалять не только обычные пробелы, но и другие скрытые символы, способные нарушить работу ваших алгоритмов.
1. Удаление концевых пробелов (классический подход)
Для удаления пробелов в начале и в конце строки используются базовые встроенные функции платформы[5]. Они работают быстро и доступны во всех версиях 1С.
СокрЛ
Удаляет пробелы только с левой стороны (в начале строки).
ИсходнаяСтрока = " Услуги по договору "; Результат = СокрЛ(ИсходнаяСтрока); // Результат: "Услуги по договору "
СокрП
Удаляет пробелы только с правой стороны (в конце строки).
ИсходнаяСтрока = " Услуги по договору "; Результат = СокрП(ИсходнаяСтрока); // Результат: " Услуги по договору"
СокрЛП
Самая частая функция. Удаляет пробелы одновременно с обеих сторон строки.
ИсходнаяСтрока = " Услуги по договору "; Результат = СокрЛП(ИсходнаяСтрока); // Результат: "Услуги по договору"
2. Удаление всех пробелов во всей строке
Если стоит задача убрать абсолютно все пробелы из строки (например, при очистке номера телефона, ИНН или номера счета от форматирования), используется функция СтрЗаменить()
НомерТелефона = "+7 (999) 123-45-67"; // Убираем скобки, дефисы и пробелы ОчищенныйНомер = СтрЗаменить(НомерТелефона, " ", ""); ОчищенныйНомер = СтрЗаменить(ОчищенныйНомер, "(", ""); ОчищенныйНомер = СтрЗаменить(ОчищенныйНомер, ")", ""); ОчищенныйНомер = СтрЗаменить(ОчищенныйНомер, "-", ""); // Результат: "+79991234567"
Важно: Функция СтрЗаменить чувствительна к типу символа. Она не удалит неразрывные пробелы, знаки табуляции или переводы строк, если они переданы как обычный пробел " ".
3. Особый случай: Неразрывный пробел (НПП)
Частая проблема в 1С — неявные пробелы, которые появляются при преобразовании чисел в строку (например, при выводе сумм). Платформа автоматически разделяет группы тысяч неразрывным пробелом (символ с кодом 160 в Windows/ANSI или 8239 в некоторых UTF-стандартах).
Обычная функция СокрЛП() или СтрЗаменить(Строка, " ", "") такой пробел не удалит.
Способ 1. Превентивный (через функцию Формат)
Лучший способ избежать неразрывных пробелов при получении строки из числа — изначально отключить группировку тысяч с помощью форматной строки "ЧГ=0":
ЧислоСуммы = 1500000; // Без форматирования строка будет: "1 500 000" (с неразрывными пробелами) СтрокаСуммы = Формат(ЧислоСуммы, "ЧГ=0"); // Результат: "1500000"
Способ 2. Удаление существующего неразрывного пробела
Если строка уже получена и содержит неразрывные пробелы, их нужно удалять точечно, используя системное перечисление Символы.НПП:
ИсходнаяСтрока = "1 500 000,00"; // Здесь пробелы — неразрывные // Заменяем неразрывный пробел на пустую строку Результат = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, ""); // Результат: "1500000,00"
4. Использование регулярных выражений (Современный стандарт)
Если в вашей системе используется платформа версии 8.3.23 и выше (и режим совместимости конфигурации также не ниже 8.3.23), вам доступны встроенные функции работы с регулярными выражениями. Это наиболее гибкий и быстрый способ очистки текстов.
Сжатие множественных пробелов до одного (любых типов)
Шаблон \s+ определяет один или несколько любых пробельных символов (обычный пробел, неразрывный пробел, табуляция, перевод строки).
ИсходныйТекст = "Иванов Иван " + Символы.НПП + " Петрович"; // Заменяем все группы пробелов на один стандартный пробел ОчищенныйТекст = СтрЗаменитьПоРегулярномуВыражению(ИсходныйТекст, "\s+", " "); Результат = СокрЛП(ОчищенныйТекст); // Результат: "Иванов Иван Петрович"
Полное удаление всех пробельных символов
Если нужно очистить ИНН или другой код от любых невидимых знаков:
ГрязныйКод = " 7701 234567 " + Символы.Таб; ЧистыйКод = СтрЗаменитьПоРегулярномуВыражению(ГрязныйКод, "\s+", ""); // Результат: "7701234567"
Обратная совместимость (для старых версий платформ)
Если база работает на старых релизах, регулярные выражения можно использовать на серверах под управлением ОС Windows через COM-объект:
RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.Pattern = "\s+"; RegExp.Global = Истина; Результат = RegExp.Replace(ИсходныйТекст, " "); Результат = СокрЛП(Результат);
Внимание: COM-объекты не работают на серверах под управлением ОС Linux. Для кроссплатформенных систем на старых версиях 1С этот метод использовать нельзя.
5. Важные нюансы для профессионалов
"Ловушка строк фиксированной длины в СУБД
При проектировании метаданных (справочников, документов) для строковых реквизитов можно установить свойство Допустимая длина в значение Фиксированная.
Если у реквизита "Артикул" длина равна 10 (фиксированная), то при записи значения "123-А" СУБД автоматически дополнит его пробелами справа до 10 символов: "123-А ".
Правило: Применение СокрЛП() перед записью такого реквизита бесполезно. Очистку от пробелов необходимо выполнять при считывании и выводе значения пользователю.
Пробелы в языке запросов 1С
В языке запросов 1С также можно использовать СокрЛ, СокрП, СокрЛП
Запрос = Новый Запрос( "ВЫБРАТЬ | СОКРЛП("" Текст с пробелами "") КАК Наименование");
Чувствуете, что застряли в основах 1С?
Информация в интернете кажется обрывочной, а на решение простых задач уходят часы? Вы не одиноки. Я запустил Клуб для 1С разработчиков Alexcode.PRO. Внутри - продвинутые статьи, видео, материалы для скачивания, закрытый чат для резидентов и возможность влиять на контент.
