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