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

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

Как убрать пробелы в 1С: рабочие способы для строк, номеров и наименований

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

Лишние пробелы в данных 1С — частая причина дублей в справочниках, ошибок сопоставления при обмене и «невидимых» расхождений при поиске. Строка «Иванов И.И.» и «Иванов И.И. » с пробелом в конце для программы — два разных значения, хотя на экране они выглядят одинаково. Поэтому очистка строк от пробелов — типовая задача и для пользователей, и для разработчиков.

Встроенный язык 1С предоставляет несколько инструментов: функции сокращения пробелов по краям строки, замену подстрок, а также работу с неразрывными пробелами, которые обычные функции не удаляют. Ниже разобраны все основные сценарии: от одиночной строки до массовой обработки справочника.

Какие бывают пробелы и почему это важно

Прежде чем выбирать функцию, полезно понимать, что «пробел» в данных — не всегда один и тот же символ. В базах 1С встречаются обычный пробел (код 32), неразрывный пробел (код 160), символ табуляции (код 9), а также переводы строк. Неразрывный пробел особенно коварен: он попадает в данные при копировании из Excel, Word или веб-страниц и визуально неотличим от обычного.

Функции семейства СокрЛ/СокрП/СокрЛП удаляют только «незначащие» символы по краям строки — пробелы, табуляции и переводы строк, но не затрагивают пробелы в середине и не всегда корректно обрабатывают неразрывный пробел. Поэтому универсальная очистка часто строится в два этапа: сначала замена неразрывных пробелов на обычные, затем сокращение.

Пробелы по краямСокрЛП

Строка начинается или заканчивается пробелами — типовой случай ввода пользователем

Пробелы внутри строкиСтрЗаменить

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

Невидимый символСимвол(160)

Строки визуально одинаковы, но сравнение даёт Ложь — вероятен неразрывный пробел

Пробелы в числеСтрЗаменить перед преобразованием

Число вида «1 250 000» не преобразуется, пока не убрать разделители разрядов

Убрать пробелы в начале и конце строки: СокрЛ, СокрП, СокрЛП

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

Пример типового применения при записи элемента справочника:

Наименование = СокрЛП(НаименованиеИзФайла);

Если Не ЗначениеЗаполнено(Наименование) Тогда

ВызватьИсключение "Наименование не заполнено";

КонецЕсли;

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

Эти же функции доступны в языке выражений СКД и в запросах нет — в запросе аналога СокрЛП нет, поэтому очистку данных для сравнения в запросе выполняют либо на этапе подготовки таблицы значений, либо при записи данных в базу.

Убрать все пробелы из строки полностью

Если пробелы нужно удалить вообще везде — например, при нормализации номера телефона, артикула или ИНН — используется функция замены: СтрЗаменить(Строка, " ", ""). Она заменяет каждое вхождение обычного пробела на пустую строку.

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

ИНН = СтрЗаменить(ИНН, Символ(160), ""); // неразрывный пробел

ИНН = СтрЗаменить(ИНН, Символ(9), ""); // табуляция

Для «схлопывания» множественных пробелов между словами до одного (например, «Иванов И.И.» → «Иванов И.И.») применяют циклическую замену двойного пробела на одинарный:

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

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

КонецЦикла;

Строка = СокрЛП(Строка);

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

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

Неразрывный пробел: почему СокрЛП не помогает

Неразрывный пробел (код 160) — главный источник «фантомных» различий в данных. Он появляется при копировании сумм из Excel («1 250,00»), при загрузке выписок, при обмене с сайтами. Визуально строка выглядит чистой, но сравнение с эталоном возвращает Ложь, а поиск по справочнику не находит элемент.

Диагностировать проблему можно, проверив коды символов строки через КодСимвола(Строка, Позиция) в отладчике или просто сравнив длину строки с ожидаемой. Если «Иванов» имеет длину 7 вместо 6 — внутри лишний символ.

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

Строка = СтрЗаменить(Строка, Символ(160), " "); // в обычный пробел

Строка = СокрЛП(Строка); // теперь можно сократить

Заменять сразу на пустую строку стоит только если уверены, что неразрывный пробел не разделяет слова: «Иванов 160 И.И.» после замены на пустую строку склеится в «ИвановИ.И.». Безопаснее сначала заменить на обычный пробел, а затем сократить.

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

Отдельный класс задач — строки, которые должны стать числами. Пользователь вводит «1 250 000,50», и попытка преобразовать это через Число() завершится ошибкой или нулём. Перед преобразованием строку нужно очистить от пробельных разделителей разрядов:

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

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

Сумма = Число(СтрЗаменить(СтрокаСуммы, ",", "."));

С номерами документов ситуация тоньше. В типовых конфигурациях номер — строка с префиксом, и удаление пробелов внутри номера может нарушить нумерацию или расхождение с бумажным оригиналом. Если пробелы мешают сопоставлению при обмене, нормализуйте не сам номер в базе, а копию значения в момент сравнения: СтрЗаменить(Номер, " ", "") внутри условия поиска, без записи изменений в документ.

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

Массовая чистка справочника от пробелов

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

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура");

Выборка = Запрос.Выполнить().Выбрать();

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

Чистое = СокрЛП(СтрЗаменить(Выборка.Наименование, Символ(160), " "));

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

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

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

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

КонецЕсли;

КонецЦикла;

Перед запуском проверьте, не создаст ли очистка дубли: два элемента «Товар А » и «Товар А» после сокращения станут одинаковыми. Если на справочнике включён контроль уникальности наименований, запись второго элемента вызовет ошибку — обработайте эту ситуацию заранее, пометив дубли на удаление или объединив их штатной обработкой поиска и замены дублей.

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

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

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

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

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

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

Сравнение строк
Норма

Одинаковые на вид строки равны при сравнении в коде

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

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

Длина строки
Норма

СтрДлина соответствует видимому числу символов

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

Длина больше ожидаемой — есть пробелы или неразрывные символы

Поиск по справочнику
Норма

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

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

Появляются дубли или элемент не находится

Преобразование числа
Норма

Число("1250000") после очистки не вызывает ошибки

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

Ошибка преобразования — в строке остались разделители

Часто задаваемые вопросы

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

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

Как убрать пробелы в запросе 1С?

В языке запросов нет функции СокрЛП. Варианты: очистить данные во временной таблице до передачи в запрос, использовать ПОДСТРОКА и сравнения для отдельных случаев, либо выполнять сопоставление уже после выполнения запроса, в обходе выборки.

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

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

Опасно ли менять наименования элементов справочника?

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

Как убрать пробелы в номере телефона или ИНН при загрузке из Excel?

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

Чем отличается СокрЛП от СтрЗаменить с пустой строкой?

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

Итог

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

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