Разработка и Конфигурация · 11 мин
Как убрать пробелы в 1С: рабочие способы для строк, номеров и наименований
Практические способы убрать пробелы в 1С: функции СокрЛ, СокрП, СокрЛП, СтрЗаменить, удаление неразрывных пробелов и лишних пробелов в строках, номерах и наименованиях.
Лишние пробелы в данных 1С — частая причина дублей в справочниках, ошибок сопоставления при обмене и «невидимых» расхождений при поиске. Строка «Иванов И.И.» и «Иванов И.И. » с пробелом в конце для программы — два разных значения, хотя на экране они выглядят одинаково. Поэтому очистка строк от пробелов — типовая задача и для пользователей, и для разработчиков.
Встроенный язык 1С предоставляет несколько инструментов: функции сокращения пробелов по краям строки, замену подстрок, а также работу с неразрывными пробелами, которые обычные функции не удаляют. Ниже разобраны все основные сценарии: от одиночной строки до массовой обработки справочника.
Какие бывают пробелы и почему это важно
Прежде чем выбирать функцию, полезно понимать, что «пробел» в данных — не всегда один и тот же символ. В базах 1С встречаются обычный пробел (код 32), неразрывный пробел (код 160), символ табуляции (код 9), а также переводы строк. Неразрывный пробел особенно коварен: он попадает в данные при копировании из Excel, Word или веб-страниц и визуально неотличим от обычного.
Функции семейства СокрЛ/СокрП/СокрЛП удаляют только «незначащие» символы по краям строки — пробелы, табуляции и переводы строк, но не затрагивают пробелы в середине и не всегда корректно обрабатывают неразрывный пробел. Поэтому универсальная очистка часто строится в два этапа: сначала замена неразрывных пробелов на обычные, затем сокращение.
Строка начинается или заканчивается пробелами — типовой случай ввода пользователем
Двойные пробелы между словами или пробелы внутри номера документа
Строки визуально одинаковы, но сравнение даёт Ложь — вероятен неразрывный пробел
Число вида «1 250 000» не преобразуется, пока не убрать разделители разрядов
Убрать пробелы в начале и конце строки: СокрЛ, СокрП, СокрЛП
Базовый инструмент — три функции встроенного языка. СокрЛ(Строка) удаляет незначащие символы слева, СокрП(Строка) — справа, СокрЛП(Строка) — с обеих сторон. Чаще всего используется именно СокрЛП, потому что источник пробелов (ручной ввод, копирование) непредсказуем.
Пример типового применения при записи элемента справочника:
Наименование = СокрЛП(НаименованиеИзФайла);
Если Не ЗначениеЗаполнено(Наименование) Тогда
ВызватьИсключение "Наименование не заполнено";
КонецЕсли;
Важный нюанс: СокрЛП не изменяет исходную переменную «на месте», а возвращает новую строку. Распространённая ошибка новичков — вызвать СокрЛП(Строка); без присваивания результата и удивляться, что строка не изменилась. Всегда пишите Строка = СокрЛП(Строка);.
Эти же функции доступны в языке выражений СКД и в запросах нет — в запросе аналога СокрЛП нет, поэтому очистку данных для сравнения в запросе выполняют либо на этапе подготовки таблицы значений, либо при записи данных в базу.
Убрать все пробелы из строки полностью
Если пробелы нужно удалить вообще везде — например, при нормализации номера телефона, артикула или ИНН — используется функция замены: СтрЗаменить(Строка, " ", ""). Она заменяет каждое вхождение обычного пробела на пустую строку.
ИНН = СтрЗаменить(ИНН, " ", "");
ИНН = СтрЗаменить(ИНН, Символ(160), ""); // неразрывный пробел
ИНН = СтрЗаменить(ИНН, Символ(9), ""); // табуляция
Для «схлопывания» множественных пробелов между словами до одного (например, «Иванов И.И.» → «Иванов И.И.») применяют циклическую замену двойного пробела на одинарный:
Пока СтрНайти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
Строка = СокрЛП(Строка);
Такой цикл безопасен: на каждой итерации количество пробелов уменьшается, поэтому зацикливание исключено. Для очень длинных текстов вместо цикла иногда используют разбиение строки на массив подстрок с последующей сборкой, но для типовых полей справочников цикла достаточно.
Функция ОчиститьСтроку(Знач Строка)
Строка = СтрЗаменить(Строка, Символ(160), " ");
Пока СтрНайти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
Возврат СокрЛП(Строка);
КонецФункцииНеразрывный пробел: почему СокрЛП не помогает
Неразрывный пробел (код 160) — главный источник «фантомных» различий в данных. Он появляется при копировании сумм из Excel («1 250,00»), при загрузке выписок, при обмене с сайтами. Визуально строка выглядит чистой, но сравнение с эталоном возвращает Ложь, а поиск по справочнику не находит элемент.
Диагностировать проблему можно, проверив коды символов строки через КодСимвола(Строка, Позиция) в отладчике или просто сравнив длину строки с ожидаемой. Если «Иванов» имеет длину 7 вместо 6 — внутри лишний символ.
Удаление выполняется явной заменой:
Строка = СтрЗаменить(Строка, Символ(160), " "); // в обычный пробел
Строка = СокрЛП(Строка); // теперь можно сократить
Заменять сразу на пустую строку стоит только если уверены, что неразрывный пробел не разделяет слова: «Иванов 160 И.И.» после замены на пустую строку склеится в «ИвановИ.И.». Безопаснее сначала заменить на обычный пробел, а затем сократить.
Пробелы в числах, датах и номерах документов
Отдельный класс задач — строки, которые должны стать числами. Пользователь вводит «1 250 000,50», и попытка преобразовать это через Число() завершится ошибкой или нулём. Перед преобразованием строку нужно очистить от пробельных разделителей разрядов:
СтрокаСуммы = СтрЗаменить(СтрокаСуммы, " ", "");
СтрокаСуммы = СтрЗаменить(СтрокаСуммы, Символ(160), "");
Сумма = Число(СтрЗаменить(СтрокаСуммы, ",", "."));
С номерами документов ситуация тоньше. В типовых конфигурациях номер — строка с префиксом, и удаление пробелов внутри номера может нарушить нумерацию или расхождение с бумажным оригиналом. Если пробелы мешают сопоставлению при обмене, нормализуйте не сам номер в базе, а копию значения в момент сравнения: СтрЗаменить(Номер, " ", "") внутри условия поиска, без записи изменений в документ.
Массовая чистка справочника от пробелов
Когда пробелы уже накопились в базе — например, в наименованиях номенклатуры после импорта — нужна разовая обработка. Логика простая: запросом выбрать элементы, где наименование отличается от очищенного варианта, и перезаписать их.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Чистое = СокрЛП(СтрЗаменить(Выборка.Наименование, Символ(160), " "));
Если Чистое <> Выборка.Наименование Тогда
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Наименование = Чистое;
Объект.Записать();
КонецЕсли;
КонецЦикла;
Перед запуском проверьте, не создаст ли очистка дубли: два элемента «Товар А » и «Товар А» после сокращения станут одинаковыми. Если на справочнике включён контроль уникальности наименований, запись второго элемента вызовет ошибку — обработайте эту ситуацию заранее, пометив дубли на удаление или объединив их штатной обработкой поиска и замены дублей.
- 1Сделайте резервную копию информационной базы или выгрузку в dt
- 2Напишите запрос и посчитайте, сколько элементов будет изменено
- 3Проверьте потенциальные дубли после очистки наименований
- 4Запустите обработку на небольшой выборке и проверьте результат
- 5Выполните полную обработку в монопольном или малонагруженном режиме
- 6Проверьте отчёты и печатные формы, использующие наименования
Проверка результата и контроль качества
После очистки убедитесь, что данные действительно стали сопоставимы. Простой способ — сравнить ранее «не находившиеся» строки: поиск контрагента по наименованию, сопоставление номенклатуры при загрузке прайса. Если раньше находилось два элемента, а теперь один — очистка сработала.
Для постоянного контроля добавьте очистку в обработчики записи: в подписке на событие «ПередЗаписью» справочника вызывайте СокрЛП для строковых реквизитов. Это предотвратит появление новых пробелов при ручном вводе, хотя не защитит от загрузок через обмен — там очистку нужно встраивать в правила конвертации.
Как проверить результат
Одинаковые на вид строки равны при сравнении в коде
Сравнение возвращает Ложь — остались скрытые символы
СтрДлина соответствует видимому числу символов
Длина больше ожидаемой — есть пробелы или неразрывные символы
Элемент находится по наименованию с первого раза
Появляются дубли или элемент не находится
Число("1250000") после очистки не вызывает ошибки
Ошибка преобразования — в строке остались разделители
Часто задаваемые вопросы
Почему СокрЛП не удаляет пробел в конце строки?
Скорее всего, в конце строки стоит не обычный пробел, а неразрывный (код 160) или иной спецсимвол. Проверьте последний символ через КодСимвола и предварительно замените Символ(160) на обычный пробел, затем примените СокрЛП.
Как убрать пробелы в запросе 1С?
В языке запросов нет функции СокрЛП. Варианты: очистить данные во временной таблице до передачи в запрос, использовать ПОДСТРОКА и сравнения для отдельных случаев, либо выполнять сопоставление уже после выполнения запроса, в обходе выборки.
Можно ли убрать пробелы в наименовании без программирования?
Да, если в конфигурации есть универсальные обработки (например, «Поиск и замена значений» из состава БСП) — они позволяют заменить символы в реквизитах без написания кода. В остальных случаях нужна внешняя обработка или помощь разработчика.
Опасно ли менять наименования элементов справочника?
Наименование — представление объекта, его изменение не ломает ссылки и документы. Риск только в исторических печатных формах, если они хранят наименование как текст, и в возможных дублях после очистки. Резервная копия перед массовой обработкой обязательна.
Как убрать пробелы в номере телефона или ИНН при загрузке из Excel?
При чтении ячейки сразу прогоняйте значение через цепочку: замена Символ(160) на пробел, СтрЗаменить обычных пробелов на пустую строку, затем СокрЛП. Для телефонов дополнительно удаляют скобки, дефисы и плюс тем же СтрЗаменить.
Чем отличается СокрЛП от СтрЗаменить с пустой строкой?
СокрЛП удаляет незначащие символы (пробелы, табуляции, переводы строк) только по краям и не трогает середину. СтрЗаменить работает по всей строке, но заменяет ровно тот символ, который указан, и не знает о табуляциях и переводах строк, если их явно не перечислить.
Что важно запомнить
СокрЛП убирает пробелы по краям строки, СтрЗаменить — внутри неё; неразрывный пробел (Символ(160)) требует отдельной замены. Результат функции всегда присваивайте обратно в переменную. Перед массовой чисткой справочника делайте копию базы и проверяйте будущие дубли наименований.