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

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

Как убрать пробелы между словами в 1С

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

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

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

Важно различать две задачи: убрать пробелы полностью (например, из номера документа или артикула) и нормализовать строку — оставить между словами ровно один пробел (например, в ФИО или наименовании). Ниже разобраны оба сценария с готовым кодом.

Определите, какие именно пробелы нужно убрать

Прежде чем писать код, посмотрите на исходные данные. Пробел в начале строки и пробел между словами — разные ситуации, и функции для них разные. Кроме того, символ, который выглядит как пробел, может оказаться неразрывным пробелом (код 160), табуляцией (код 9) или переносом строки — стандартная замена обычного пробела их не затронет.

Быстрый способ диагностики — вывести коды символов строки в цикле через КодСимвола() либо просто проверить, содержит ли строка Символ(160). Если данные пришли из Excel, веб-страниц или сканов документов, неразрывные пробелы встречаются очень часто.

Пробелы только по краямЛишние символы в начале и конце строки

Достаточно СокрЛП()

Двойные пробелы между словамиНужна нормализация, а не полное удаление

Цикл замены или СтрРазделить + СтрСоединить

Замена не срабатываетВ строке неразрывный пробел или табуляция

Проверить Символ(160) и Символ(9)

Пробелов быть не должно вовсеНомер, артикул, ИНН, код

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

Убираем пробелы в начале и конце строки

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

Типичный пример — обработка введённого пользователем значения перед записью в базу:

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

ИНН = СокрЛП(РеквизитИНН);

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

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

Когда пробелы в значении недопустимы в принципе — в номере документа, артикуле, ИНН, номере телефона, — используют СтрЗаменить() с пустой строкой в качестве замены:

НомерБезПробелов = СтрЗаменить(НомерДокумента, " ", "");

Функция заменяет все вхождения подстроки, поэтому одного вызова достаточно для любого количества пробелов. Но она работает только с обычным пробелом (код 32). Если данные пришли извне, дополните обработку заменой неразрывного пробела и табуляции:

Результат = СтрЗаменить(ИсходнаяСтрока, " ", "");

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

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

Заменяем двойные и множественные пробелы на один

Задача нормализации — оставить между словами ровно один пробел. Классическое решение — цикл замены двух пробелов на один, пока двойные ещё встречаются:

Строка = СокрЛП(ИсходнаяСтрока);

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

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

КонецЦикла;

Альтернатива без цикла — разбить строку на слова и собрать обратно. Функция СтрРазделить() с параметром «включать пустые» равным Ложь отбросит пустые элементы, возникающие из-за множественных пробелов:

МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь);

Строка = СтрСоединить(МассивСлов, " ");

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

Сравнение вариантов нормализации

Цикл СтрЗаменить

Простой и понятный код; работает в любой версии платформы. На очень длинных строках выполняет много проходов.

СтрРазделить + СтрСоединить

Один проход, лаконичная запись. Требует платформы с поддержкой этих функций и предварительной замены неразрывных пробелов.

Регулярные выражения

Одна замена по шаблону для всех видов пробельных символов. Требует подключения внешних компонент или COM-объектов, что не всегда доступно на сервере.

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

Неразрывный пробел (код 160) — главный источник «магических» ошибок: строка выглядит чистой, замена пробелов отработала, а сравнение всё равно не проходит. Он попадает в базу при копировании из браузера, Word, Excel, а также из форматированных чисел, где служит разделителем разрядов.

Универсальная функция очистки строки от всех распространённых невидимых символов выглядит так:

Функция ОчиститьСтроку(Знач Строка)

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

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

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

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

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

КонецЦикла;

Возврат Строка;

КонецФункции

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

При загрузке данных из Excel неразрывные пробелы чаще всего встречаются в числах, скопированных как текст: "1 250 000". Перед преобразованием такого значения в число обязательно удалите Символ(160), иначе функция Число() выдаст ошибку преобразования.
ПЗ
Практическое замечание

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Проверяем результат и предотвращаем повторение проблемы

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

Чтобы пробелы не накапливались снова, встройте очистку в точки входа данных: обработчики ПередЗаписью справочников и документов, процедуры загрузки из файлов, обработчики обмена. Это дешевле, чем периодические массовые исправления.

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

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

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

Находится ровно один элемент без учёта пробелов

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

Находятся дубли, отличающиеся только пробелами

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

Строки с одинаковым видимым содержимым равны

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

Сравнение ложно — значит, остались неразрывные пробелы

Печатная форма
Норма

Текст выводится без лишних отступов и переносов

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

Строки «съезжают», появляются пустые промежутки

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

Типичные ошибки
01
Замена только обычного пробела — неразрывный пробел остаётся, и сравнение строк по-прежнему не работает
02
Удаление всех пробелов из наименований и адресов вместо нормализации — данные становятся нечитаемыми
03
Массовая запись объектов без проверки изменения — лишняя нагрузка и мусорная регистрация в планах обмена
04
Обработка рабочей базы без резервной копии — при ошибке в логике восстановить исходные значения не из чего
05
Очистка только в форме, но не в обменах и загрузках — пробелы возвращаются с очередной порцией данных

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

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

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

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

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

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

Числа, скопированные из Excel или Word, часто содержат неразрывные пробелы как разделители разрядов. Удалите Символ(160) и обычный пробел через СтрЗаменить(), затем преобразуйте значение функцией Число(). Без удаления неразрывных пробелов преобразование завершится ошибкой.

Можно ли убрать пробелы запросом, без перебора объектов?

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

Как предотвратить появление лишних пробелов при вводе пользователем?

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

Опасно ли запускать массовую очистку в работающей базе?

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

Итог

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

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