К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как убрать лишние пробелы в 1С

Как убрать лишние пробелы в 1С: функции СокрЛП, СокрЛ, СокрП, удаление двойных и неразрывных пробелов, обработка строк в запросах и при загрузке данных.

Лишние пробелы в строках — одна из самых частых причин «фантомных» ошибок в 1С: контрагент не находится при поиске, номенклатура дублируется при загрузке из Excel, сравнение строк возвращает «Ложь», хотя визуально значения одинаковы. Пробелы попадают в данные при ручном вводе, копировании из внешних систем, выгрузках из Excel и web-сервисов.

Во встроенном языке 1С для удаления пробелов предусмотрены три функции: СокрЛП (оба конца строки), СокрЛ (только слева) и СокрП (только справа). Для двойных пробелов внутри строки и неразрывных пробелов их недостаточно — понадобятся СтрЗаменить и работа с символами через Символ().

Ниже разобраны все рабочие способы: от простой очистки в коде до массовой обработки данных в справочниках и запросах, с типичными ошибками и способами проверки результата.

Функции СокрЛП, СокрЛ и СокрП: базовая очистка строк

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

Если нужно убрать пробелы только с одной стороны, используются варианты СокрЛ (слева) и СокрП (справа). Это полезно, когда формат данных требует сохранить отступы с одной стороны — например, при формировании текстовых файлов фиксированного формата для обмена с банками.

Наименование = "  ООО ""Ромашка""   ";

Чистое = СокрЛП(Наименование); // "ООО ""Ромашка"""

ТолькоСлева = СокрЛ(Наименование);

ТолькоСправа = СокрП(Наименование);

Важный нюанс: функции возвращают новую строку, а не меняют исходную переменную. Типичная ошибка новичка — вызвать СокрЛП(Строка); и забыть присвоить результат: Строка = СокрЛП(Строка);.

Как убрать двойные пробелы внутри строки

СокрЛП не трогает пробелы между словами. Если при загрузке ФИО или адресов внутри строки встречаются два и более пробела подряд, их убирают через функцию СтрЗаменить в цикле: заменяем два пробела на один до тех пор, пока заменять нечего.

Строка = "Иванов   Иван  Иванович";

Пока СтрНайти(Строка, " ") > 0 Цикл

Строка = СтрЗаменить(Строка, " ", " ");

КонецЦикла;

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

Для разовой обработки небольших объёмов такой подход достаточно быстр. Если нужно очищать сотни тысяч строк в регламентном задании, имеет смысл вынести логику в общую функцию и вызывать её централизованно, чтобы не дублировать код.

bsl
Функция УбратьЛишниеПробелы(Строка)
    Результат = СокрЛП(Строка);
    Результат = СтрЗаменить(Результат, Символ(160), " ");
    Пока СтрНайти(Результат, "  ") > 0 Цикл
        Результат = СтрЗаменить(Результат, "  ", " ");
    КонецЦикла;
    Возврат Результат;
КонецФункции

Неразрывные пробелы и другие невидимые символы

Самая коварная разновидность — неразрывный пробел (код символа 160). Он выглядит как обычный пробел, но СокрЛП его не всегда обрабатывает корректно, а сравнение строк с ним даёт «Ложь». Такие символы часто приходят из Excel, веб-страниц и выгрузок сторонних систем.

Удаляется неразрывный пробел явной заменой:

Строка = СтрЗаменить(Строка, Символ(160), " ");

Кроме кода 160 в данных встречаются табуляция (код 9), перевод строки (код 10), возврат каретки (код 13) и «нулевой пробел» (код 8203) при копировании из веба. Если строка «не сравнивается», а причина не видна, полезно вывести коды символов в цикле через КодСимвола и найти лишние значения.

Пробелы в запросах и при сравнении строк

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

Надёжная стратегия — нормализовать строку ещё до сравнения: привести к одному регистру и убрать пробелы на этапе поиска в коде, а не в запросе. Например, сначала запросом получить кандидатов по подобию, а затем в цикле сравнить очищенные значения.

Если ВРег(СокрЛП(Наименование1)) = ВРег(СокрЛП(Наименование2)) Тогда

// значения совпадают

КонецЕсли;

При поиске дублей в справочниках удобно сравнивать именно нормализованное представление: СокрЛП + ВРег + удаление двойных пробелов. Это выявляет дубли вида «Иванов И.И.», « Иванов И.И.» и «ИВАНОВ И.И.», которые стандартный поиск по наименованию считает разными элементами.

Массовая очистка данных в справочниках

Если пробелы уже накопились в базе (типично для справочников «Номенклатура» и «Контрагенты» после загрузок), потребуется разовая обработка. Порядок безопасной работы: сделать резервную копию, отобрать элементы с пробелами, очистить, записать, проверить результат на выборке.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ Ссылка, Наименование

|ИЗ Справочник.Номенклатура

|ГДЕ НЕ Наименование ПОДОБНО СокрЛП_шаблон";

// На практике отбор проще выполнить в цикле:

Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл

Чистое = УбратьЛишниеПробелы(Выборка.Наименование);

Если Чистое <> Выборка.Наименование Тогда

Объект = Выборка.ПолучитьОбъект();

Объект.Наименование = Чистое;

Объект.Записать();

КонецЕсли;

КонецЦикла;

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

Порядок массовой очистки
  1. 1
    Сделайте резервную копию базы или выгрузку DT
  2. 2
    Напишите функцию нормализации строки и проверьте её на 5–10 элементах
  3. 3
    Запустите обработку на тестовой копии и сверьте результат
  4. 4
    Выполните обработку в рабочей базе порциями
  5. 5
    Проверьте поиск, печатные формы и обмены после очистки

Профилактика: не дать пробелам попасть в базу

Дешевле не допускать лишние пробелы, чем потом их вычищать. Основные точки защиты: обработчики записи объектов, процедуры загрузки данных и формы ввода.

  • В модуле объекта справочника в событии ПередЗаписью или ОбработкаЗаполнения очищайте строковые реквизиты: Наименование = СокрЛП(Наименование);
  • В процедурах загрузки из Excel и CSV нормализуйте каждое строковое значение сразу после чтения, включая замену символа 160.
  • В обменах через web-сервисы и HTTP очищайте строки при разборе входящих данных.
  • Для поиска дублей настройте сравнение по нормализованному наименованию, а не по исходному.

Если конфигурация на поддержке и дорабатывать модули нельзя, используйте расширение конфигурации с подпиской на событие записи — это позволит добавить очистку без снятия объектов с поддержки.

Типичные ошибки
01
Вызов СокрЛП(Строка) без присваивания результата — строка остаётся неизменной
02
Очистка только обычных пробелов: неразрывный пробел (код 160) остаётся и ломает сравнение
03
Одна замена двойных пробелов без цикла — три и более пробелов подряд не убираются полностью
04
Массовая обработка без резервной копии — при ошибке в логике данные восстановить нечем
05
Удаление всех переводов строк из многострочных полей — портятся адреса и печатные формы

Проверка результата и контроль качества

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

Контрольные точки

Как проверить результат

Сравнение двух визуально одинаковых строк
Норма

СокрЛП(Строка1) = СокрЛП(Строка2) возвращает Истина

Тревожный признак

Сравнение даёт Ложь — ищите скрытые символы через КодСимвола

Поиск элемента справочника по наименованию
Норма

Элемент находится с первого раза

Тревожный признак

Поиск не находит элемент — в данных остались пробелы

Печатные формы после очистки
Норма

Адреса и описания выводятся с переносами строк

Тревожный признак

Текст слипся в одну строку — удалены нужные переводы строк

Для диагностики скрытых символов выведите коды всех символов строки: всё, что меньше 32 (кроме осознанно оставленных переносов) и равно 160 или 8203, — кандидаты на удаление.

Для Поз = 1 По СтрДлина(Строка) Цикл

Код = КодСимвола(Строка, Поз);

Если Код = 160 Или Код < 32 Тогда

Сообщить("Позиция " + Поз + ", код " + Код);

КонецЕсли;

КонецЦикла;

Итог

Что важно запомнить

Краевые пробелы убирает СокрЛП, двойные внутри — цикл СтрЗаменить, неразрывные — замена Символ(160). Результат функций нужно присваивать. Массовую очистку справочников делайте только после резервной копии, а профилактику встройте в обработчики записи и загрузки.

Частые вопросы

Почему СокрЛП не убирает пробел, хотя он виден?

Скорее всего, это неразрывный пробел (код 160) или табуляция из внешнего источника. Проверьте код символа через КодСимвола и удалите его явно: СтрЗаменить(Строка, Символ(160), " ").

Можно ли убрать пробелы прямо в запросе 1С?

Полноценного аналога СокрЛП в языке запросов нет. Обычно данные очищают в коде до или после запроса, либо заранее нормализуют хранимые значения, чтобы сравнение в запросе работало корректно.

Как убрать все пробелы из строки, включая внутри слов?

Используйте СтрЗаменить(Строка, " ", "") — это удалит каждый обычный пробел. Дополнительно замените Символ(160) и табуляцию, если строка пришла из внешних источников.

Чем опасна массовая обработка справочников?

Запись каждого объекта запускает проверки, подписки на события и обмены данными. Без резервной копии ошибка в логике необратимо изменит данные, а на больших объёмах обработка может надолго нагрузить базу.

Почему после загрузки из Excel появляются дубли контрагентов?

В ячейках Excel часто встречаются неразрывные пробелы и пробелы по краям. Строки визуально совпадают, но для 1С различаются, и поиск существующего элемента не срабатывает. Нормализуйте наименования при загрузке и ищите по очищенному значению.

Нужно ли очищать пробелы в коде элемента справочника?

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