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

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

В процессе работы с базами данных 1С программисты и администраторы часто сталкиваются с проблемой некорректного заполнения строковых реквизитов, таких как Артикул или Наименование. Лишние пробелы в начале, в конце или внутри строки могут привести к дублированию записей, ошибкам при поиске и некорректной выгрузке данных на сайт или в другие системы. Разберем подробно, как эффективно очистить справочники от «мусорных» символов.

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

Самым простым и очевидным решением для удаления пробелов в начале и в конце строки является использование встроенных функций встроенного языка 1С. Проанализируем возможности функции СокрЛП() (Сократить Левые и Правые). Она удаляет все незначащие пробелы с обоих концов строки, но не трогает те, что находятся внутри текста.

Если нам необходимо обработать конкретный объект, код будет выглядеть следующим образом:


ОбъектОрганизация = Справочники.Номенклатура.НайтиПоАртикулу("АА 01    ").ПолучитьОбъект();
Если ОбъектОрганизация <> Неопределено Тогда
    ОбъектОрганизация.Артикул = СокрЛП(ОбъектОрганизация.Артикул);
    ОбъектОрганизация.Записать();
КонецЕсли;

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

Часто пробелы скрываются внутри строки, например, когда между словами случайно нажали клавишу пробела несколько раз ("АА 01"). Обычная функция СокрЛП() здесь не поможет. Рассмотрим алгоритм замены двойных пробелов на одинарные. Простая одиночная замена СтрЗаменить(Строка, " ", " ") может не сработать, если пробелов подряд три, четыре или более.

Для гарантированного удаления всех лишних внутренних пробелов мы должны использовать цикл Пока...КонецЦикла. Разберем этот пример:


НаименованиеПосле = Объект.Наименование;
ДваПробела = "  ";
ОдинПробел = " ";

Пока Найти(НаименованиеПосле, ДваПробела) > 0 Цикл
    НаименованиеПосле = СтрЗаменить(НаименованиеПосле, ДваПробела, ОдинПробел);
КонецЦикла;

Объект.Наименование = СокрЛП(НаименованиеПосле);

Этот код будет выполняться до тех пор, пока в строке не останется ни одного вхождения двух пробелов подряд. В конце мы применяем СокрЛП(), чтобы окончательно «причесать» результат.

Групповая обработка без написания кода

Если задача разовая и вы не хотите создавать внешнюю обработку, воспользуйтесь стандартным механизмом «Групповое изменение реквизитов». Выясним, как это сделать правильно:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных.
  2. Выберем объект (например, справочник Номенклатура) и настроим отбор (например, артикул содержит пробелы).
  3. В колонке «Новое значение» для реквизита «Артикул» мы не можем просто прописать формулу, если не включен специальный режим.
  4. Нажмем кнопку Дополнительные параметры и установим флаг «Режим разработчика».
  5. После этого в списке появится возможность выполнить произвольный алгоритм, где через переменную Объект можно обратиться к текущей записи и выполнить код: Объект.Артикул = СокрЛП(Объект.Артикул);.

Борьба с «невидимыми» символами (неразрывный пробел)

Иногда обычная замена " " не срабатывает. Проанализируем ситуацию: данные могли быть загружены из Excel или скопированы из веб-браузера. В таких случаях часто встречается неразрывный пробел (код ASCII 160). Визуально он не отличается от обычного, но 1С воспринимает его как другой символ.

Для очистки таких символов следует дополнить алгоритм обработкой системной константы Символы.НПП:


// Заменяем неразрывный пробел на обычный, а затем чистим лишнее
Результат = СтрЗаменить(Объект.Артикул, Символы.НПП, " ");
Объект.Артикул = СокрЛП(Результат);

Также полезно очищать строки от символов табуляции (Символы.Таб) и переводов строк, если они недопустимы в артикулах.

Оптимизация производительности при массовой записи

При обработке десятков тысяч карточек номенклатуры обычный метод Записать() может работать медленно из-за проверок, подписок на события и обновления индексов. Рассмотрим, как ускорить этот процесс.

Использование свойства ОбменДанными.Загрузка = Истина позволяет системе понять, что выполняется техническая корректировка данных, и пропустить прикладные проверки:


ОбъектНоменклатура = Выборка.ПолучитьОбъект();
ОбъектНоменклатура.Артикул = СокрЛП(ОбъектНоменклатура.Артикул);
ОбъектНоменклатура.ОбменДанными.Загрузка = Истина;
ОбъектНоменклатура.Записать();

Важно: этот метод стоит использовать с осторожностью, так как он отключает контроль уникальности и другие бизнес-правила конфигурации.

Риски использования внешних инструментов (Excel)

Некоторые пользователи предпочитают выгружать данные в Excel, делать там «Найти и заменить» и загружать обратно. Посмотрим на риски такого подхода:

Поэтому программная обработка внутри 1С всегда является более надежным и контролируемым способом наведения порядка в справочниках.

Заключение и рекомендации

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

← На главную