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

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

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

Удаление пробелов по краям строки: особенности функции СокрЛП

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

Объект.Артикул = СокрЛП(Объект.Артикул);

Но здесь есть важный нюанс. Выясним причину, почему иногда этот код "не работает", и после записи объекта в базу отступы возвращаются (предотвратить это поможет настройка автоматических проверок перед записью). Если в метаданных конфигурации реквизиту (например, артикулу) задана фиксированная длина строки, а не переменная, то платформа автоматически дополнит укороченную строку пробелами справа до указанной фиксированной длины. Чтобы окончательно избавиться от них, необходимо зайти в конфигуратор и изменить свойство «Длина строки» этого реквизита на «Переменная».

Избавление от двойных пробелов внутри текста

Функция СокрЛП убирает лишнее только по краям, но как быть с двойными или тройными отступами между словами? В теме на форуме авторы справедливо предлагают использовать функцию СтрЗаменить. Рассмотрим классическое решение с использованием цикла, которое гарантированно вычищает все дублирующиеся пробелы:


Функция ПолучитьСтрокуБезЛишнихПробелов(Стр) Экспорт 
    Стр = СокрЛП(Стр); 
    Пока Найти(Стр, "  ") <> 0 Цикл 
        Стр = СтрЗаменить(Стр, "  ", " "); 
    КонецЦикла; 
    Возврат Стр; 
КонецФункции

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

Более быстрый и современный способ (начиная с платформы 8.3.6)

Рассмотрим подробнее элегантный подход, который работает быстрее классического цикла. Начиная с версии 1С 8.3.6, мы можем использовать связку функций СтрРазделить и СтрСоединить. Третий параметр функции разделения позволяет автоматически игнорировать пустые подстроки, которые образуются при наличии множественных пробелов:


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

Такой подход за пару строк кода автоматически удалит все лишние повторяющиеся пробелы внутри строки, оставив между словами ровно по одному отступу.

Использование Библиотеки стандартных подсистем (БСП)

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


ТекстБезПробелов = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ТекстСПробелами, " ");

Использование стандартизированных функций улучшает читаемость кода и упрощает поддержку конфигурации.

Борьба с невидимыми символами: неразрывные пробелы, табы и переносы

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

  1. Неразрывный пробел: часто приходит из веб-страниц или Excel. В 1С он представлен системным символом Символы.НПП.
  2. Табуляция: Символы.Таб.
  3. Перенос строки и возврат каретки: Символы.ПС и Символы.ВК.

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


Строка = СтрЗаменить(Строка, Символы.НПП, " ");
Строка = СтрЗаменить(Строка, Символы.Таб, " ");
Строка = СтрЗаменить(Строка, Символы.ВК, "");
Строка = СтрЗаменить(Строка, Символы.ПС, " ");

Радикальное решение: удаление пробелов с помощью регулярных выражений (RegExp)

Если задача стоит сложно и пробельных символов разного типа очень много, мы можем применить "тяжелую артиллерию". Рассмотрим подробнее использование COM-объекта VBScript.RegExp. Обратите внимание: этот способ работает только для Windows-клиентов и серверов.

Регулярные выражения позволяют одной строкой найти любые последовательности "пустот" (включая табы, пробелы и переносы) и заменить их на один стандартный пробел. Шаблон \s+ означает "один или более любых пробельных символов":


Регулярка = Новый COMОбъект("VBScript.RegExp");
Регулярка.Global = Истина;
Регулярка.Pattern = "\s+"; 

ЧистаяСтрока = СокрЛП(Регулярка.Replace(ИсходнаяСтрока, " "));

Подведем итог: для простой очистки краев строки используйте СокрЛП (проверив длину реквизита в конфигураторе). Для удаления двойных пробелов внутри текста отлично подходит связка СтрРазделить и СтрСоединить или стандартная функция БСП. А если данные сильно "загрязнены" при обмене, обязательно обрабатывайте строку от скрытых символов табуляции и неразрывных пробелов — на будущее также полезна настройка правил контроля при вводе данных.

← На главную