Разработка и Конфигурация · 10 мин
Как убрать лишние пробелы в 1С
Как убрать лишние пробелы в 1С: функции СокрЛП, СокрЛ, СокрП, удаление двойных и неразрывных пробелов, обработка строк в запросах и при загрузке данных.
Лишние пробелы в строках — одна из самых частых причин «фантомных» ошибок в 1С: контрагент не находится при поиске, номенклатура дублируется при загрузке из Excel, сравнение строк возвращает «Ложь», хотя визуально значения одинаковы. Пробелы попадают в данные при ручном вводе, копировании из внешних систем, выгрузках из Excel и web-сервисов.
Во встроенном языке 1С для удаления пробелов предусмотрены три функции: СокрЛП (оба конца строки), СокрЛ (только слева) и СокрП (только справа). Для двойных пробелов внутри строки и неразрывных пробелов их недостаточно — понадобятся СтрЗаменить и работа с символами через Символ().
Ниже разобраны все рабочие способы: от простой очистки в коде до массовой обработки данных в справочниках и запросах, с типичными ошибками и способами проверки результата.
Функции СокрЛП, СокрЛ и СокрП: базовая очистка строк
Функция СокрЛП(Строка) удаляет пробельные символы в начале и в конце строки. Под пробельными понимаются обычные пробелы, символы табуляции, перевода строки и возврата каретки. Сама строка в середине не затрагивается.
Если нужно убрать пробелы только с одной стороны, используются варианты СокрЛ (слева) и СокрП (справа). Это полезно, когда формат данных требует сохранить отступы с одной стороны — например, при формировании текстовых файлов фиксированного формата для обмена с банками.
Наименование = " ООО ""Ромашка"" ";
Чистое = СокрЛП(Наименование); // "ООО ""Ромашка"""
ТолькоСлева = СокрЛ(Наименование);
ТолькоСправа = СокрП(Наименование);
Важный нюанс: функции возвращают новую строку, а не меняют исходную переменную. Типичная ошибка новичка — вызвать СокрЛП(Строка); и забыть присвоить результат: Строка = СокрЛП(Строка);.
Как убрать двойные пробелы внутри строки
СокрЛП не трогает пробелы между словами. Если при загрузке ФИО или адресов внутри строки встречаются два и более пробела подряд, их убирают через функцию СтрЗаменить в цикле: заменяем два пробела на один до тех пор, пока заменять нечего.
Строка = "Иванов Иван Иванович";
Пока СтрНайти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
Цикл необходим, потому что одна замена обрабатывает не все случаи: три пробела подряд после одной замены превращаются в два. Проверка через СтрНайти гарантирует выход из цикла, когда двойных пробелов не осталось.
Для разовой обработки небольших объёмов такой подход достаточно быстр. Если нужно очищать сотни тысяч строк в регламентном задании, имеет смысл вынести логику в общую функцию и вызывать её централизованно, чтобы не дублировать код.
Функция УбратьЛишниеПробелы(Строка)
Результат = СокрЛП(Строка);
Результат = СтрЗаменить(Результат, Символ(160), " ");
Пока СтрНайти(Результат, " ") > 0 Цикл
Результат = СтрЗаменить(Результат, " ", " ");
КонецЦикла;
Возврат Результат;
КонецФункцииНеразрывные пробелы и другие невидимые символы
Самая коварная разновидность — неразрывный пробел (код символа 160). Он выглядит как обычный пробел, но СокрЛП его не всегда обрабатывает корректно, а сравнение строк с ним даёт «Ложь». Такие символы часто приходят из Excel, веб-страниц и выгрузок сторонних систем.
Удаляется неразрывный пробел явной заменой:
Строка = СтрЗаменить(Строка, Символ(160), " ");
Кроме кода 160 в данных встречаются табуляция (код 9), перевод строки (код 10), возврат каретки (код 13) и «нулевой пробел» (код 8203) при копировании из веба. Если строка «не сравнивается», а причина не видна, полезно вывести коды символов в цикле через КодСимвола и найти лишние значения.
Пробелы в запросах и при сравнении строк
В языке запросов 1С нет прямого аналога СокрЛП, поэтому поиск по наименованию с лишними пробелами часто не находит элемент. Практикуются два подхода: очищать данные при записи (правильный путь) или подбирать значение с учётом возможных пробелов.
Надёжная стратегия — нормализовать строку ещё до сравнения: привести к одному регистру и убрать пробелы на этапе поиска в коде, а не в запросе. Например, сначала запросом получить кандидатов по подобию, а затем в цикле сравнить очищенные значения.
Если ВРег(СокрЛП(Наименование1)) = ВРег(СокрЛП(Наименование2)) Тогда
// значения совпадают
КонецЕсли;
При поиске дублей в справочниках удобно сравнивать именно нормализованное представление: СокрЛП + ВРег + удаление двойных пробелов. Это выявляет дубли вида «Иванов И.И.», « Иванов И.И.» и «ИВАНОВ И.И.», которые стандартный поиск по наименованию считает разными элементами.
Массовая очистка данных в справочниках
Если пробелы уже накопились в базе (типично для справочников «Номенклатура» и «Контрагенты» после загрузок), потребуется разовая обработка. Порядок безопасной работы: сделать резервную копию, отобрать элементы с пробелами, очистить, записать, проверить результат на выборке.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Ссылка, Наименование
|ИЗ Справочник.Номенклатура
|ГДЕ НЕ Наименование ПОДОБНО СокрЛП_шаблон";
// На практике отбор проще выполнить в цикле:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Чистое = УбратьЛишниеПробелы(Выборка.Наименование);
Если Чистое <> Выборка.Наименование Тогда
Объект = Выборка.ПолучитьОбъект();
Объект.Наименование = Чистое;
Объект.Записать();
КонецЕсли;
КонецЦикла;
Для больших баз выполняйте обработку порциями и вне пиковой нагрузки: запись каждого объекта вызывает проверки и подписки на события, что при десятках тысяч элементов может занять заметное время. В файловой базе желательно монопольный режим.
- 1Сделайте резервную копию базы или выгрузку DT
- 2Напишите функцию нормализации строки и проверьте её на 5–10 элементах
- 3Запустите обработку на тестовой копии и сверьте результат
- 4Выполните обработку в рабочей базе порциями
- 5Проверьте поиск, печатные формы и обмены после очистки
Профилактика: не дать пробелам попасть в базу
Дешевле не допускать лишние пробелы, чем потом их вычищать. Основные точки защиты: обработчики записи объектов, процедуры загрузки данных и формы ввода.
- В модуле объекта справочника в событии ПередЗаписью или ОбработкаЗаполнения очищайте строковые реквизиты:
Наименование = СокрЛП(Наименование); - В процедурах загрузки из Excel и CSV нормализуйте каждое строковое значение сразу после чтения, включая замену символа 160.
- В обменах через web-сервисы и HTTP очищайте строки при разборе входящих данных.
- Для поиска дублей настройте сравнение по нормализованному наименованию, а не по исходному.
Если конфигурация на поддержке и дорабатывать модули нельзя, используйте расширение конфигурации с подпиской на событие записи — это позволит добавить очистку без снятия объектов с поддержки.
Проверка результата и контроль качества
После очистки убедитесь, что проблема решена, а не замаскирована. Простейшая проверка — сравнение длины строки до и после обработки: если длина не изменилась, а пробелы визуально были, вероятно, это неразрывные пробелы или табуляция.
Как проверить результат
СокрЛП(Строка1) = СокрЛП(Строка2) возвращает Истина
Сравнение даёт Ложь — ищите скрытые символы через КодСимвола
Элемент находится с первого раза
Поиск не находит элемент — в данных остались пробелы
Адреса и описания выводятся с переносами строк
Текст слипся в одну строку — удалены нужные переводы строк
Для диагностики скрытых символов выведите коды всех символов строки: всё, что меньше 32 (кроме осознанно оставленных переносов) и равно 160 или 8203, — кандидаты на удаление.
Для Поз = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Поз);
Если Код = 160 Или Код < 32 Тогда
Сообщить("Позиция " + Поз + ", код " + Код);
КонецЕсли;
КонецЦикла;
Что важно запомнить
Краевые пробелы убирает СокрЛП, двойные внутри — цикл СтрЗаменить, неразрывные — замена Символ(160). Результат функций нужно присваивать. Массовую очистку справочников делайте только после резервной копии, а профилактику встройте в обработчики записи и загрузки.
Частые вопросы
Почему СокрЛП не убирает пробел, хотя он виден?
Скорее всего, это неразрывный пробел (код 160) или табуляция из внешнего источника. Проверьте код символа через КодСимвола и удалите его явно: СтрЗаменить(Строка, Символ(160), " ").
Можно ли убрать пробелы прямо в запросе 1С?
Полноценного аналога СокрЛП в языке запросов нет. Обычно данные очищают в коде до или после запроса, либо заранее нормализуют хранимые значения, чтобы сравнение в запросе работало корректно.
Как убрать все пробелы из строки, включая внутри слов?
Используйте СтрЗаменить(Строка, " ", "") — это удалит каждый обычный пробел. Дополнительно замените Символ(160) и табуляцию, если строка пришла из внешних источников.
Чем опасна массовая обработка справочников?
Запись каждого объекта запускает проверки, подписки на события и обмены данными. Без резервной копии ошибка в логике необратимо изменит данные, а на больших объёмах обработка может надолго нагрузить базу.
Почему после загрузки из Excel появляются дубли контрагентов?
В ячейках Excel часто встречаются неразрывные пробелы и пробелы по краям. Строки визуально совпадают, но для 1С различаются, и поиск существующего элемента не срабатывает. Нормализуйте наименования при загрузке и ищите по очищенному значению.
Нужно ли очищать пробелы в коде элемента справочника?
Да, если код используется для сопоставления при обменах. Пробелы в коде ломают синхронизацию с внешними системами. Очищайте код тем же СокрЛП в обработчике записи или при загрузке.