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