Работа со строками в 1С:Предприятие 8.3 часто требует очистки данных от лишних пробелов — будь то начальные, конечные или множественные пробелы между словами. Эта задача возникает при импорте данных из внешних источников, обработке пользовательского ввода или подготовке отчетов. Неправильная обработка пробелов может привести к ошибкам сравнения строк, некорректной работе запросов или проблемам при интеграции с другими системами.

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

Почему пробелы в строках 1С становятся проблемой

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

  • 🔍 Несовпадение при сравнении: Строка "Иванов И.И." не равна "Иванов И.И. " (с пробелом в конце), что ломает логику поиска и фильтрации.
  • 📊 Искажение отчетов: В сводных таблицах пробелы могут приводить к дублированию строк с одинаковыми значениями.
  • 🔄 Проблемы при обмене данными: Многие внешние системы (например, Excel или API банков) чувствительны к пробелам в полях.
  • 🛠️ Ошибки в запросах: Пробелы в начале/конце полей могут нарушать работу операторов ПОДОБНО или В.

Особенно критична проблема пробелов при работе с уникальными идентификаторами (артикулы, номера документов) или регистрозависимыми данными. Например, при интеграции с 1С-Битрикс или МойСклад лишние пробелы в кодах номенклатуры могут блокировать синхронизацию.

📊 С какой частотой вы сталкиваетесь с проблемами пробелов в 1С?
Ежедневно
Раз в неделю
Редико
Никогда не обращал внимания

Способ 1: Встроенная функция СокрЛП() — быстрое решение для пользователей

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

Примеры применения:

// Удаление пробелов в начале и конце

Результат = СокрЛП(" Пример строки "); // Вернет "Пример строки"

// Очистка поля ввода пользователя

ФИО = СокрЛП(ВвестиСтроку("Введите ФИО"));

// Использование в запросе

ВЫБРАТЬ

СокрЛП(Контрагенты.Наименование) КАК Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

Функция работает во всех версиях 1С:Предприятие 8.x и не требует прав программиста. Ее можно использовать:

  • 📝 В вычисляемых полях отчетов
  • 🔧 В обработках заполнения документов
  • 📋 При ручном вводе данных через формы
💡

Если вам нужно удалить пробелы только слева или только справа, используйте функции СокрЛ() и СокрП() соответственно.

Способ 2: Удаление ВСЕХ пробелов в строке (включая между словами)

Когда требуется удалить все пробелы (например, при формировании непрерывных кодов или хэшей), используйте функцию СтрЗаменить():

// Удаление всех пробелов в строке

Результат = СтрЗаменить("123 456 789", " ", ""); // Вернет "123456789"

// Пример для артикула

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

Этот метод часто применяют:

  • 🏷️ При генерации штрихкодов из артикулов с пробелами
  • 🔐 Для создания хэшей или контрольных сумм
  • 📦 При подготовке данных для EDI-обмена с поставщиками
⚠️ Внимание: Удаление всех пробелов может сделать строку нечитаемой. Всегда проверяйте результат на тестовых данных перед применением в рабочей базе.

Способ 3: Удаление ДВОЙНЫХ пробелов (нормализация)

Когда в строке встречаются множественные пробелы между словами (например, "Иванов Иван Иванович"), их можно свести к одиночным пробелам с помощью комбинации функций:

Функция НормализоватьПробелы(Знач Строка)

Возврат СокрЛП(СтрЗаменить(Строка, " ", " "));

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

// Пример использования

Результат = НормализоватьПробелы("Строка с лишними пробелами");

// Вернет "Строка с лишними пробелами"

Для обработки строк с большим количеством пробелов (3+ подряд) используйте цикл:

Функция УбратьМножественныеПробелы(Знач Строка)

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

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

КонецЦикла;

Возврат СокрЛП(Строка);

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

Почему не работает одноразовая замена " " на " "?

Потому что после первой замены могут остаться другие пары пробелов. Например, строка "а б в" после замены " " на " " станет "а б в" — остается еще одна пара пробелов.

Способ 4: Регулярные выражения для сложных случаев

Для продвинутых задач (например, удаление пробелов перед знаками препинания или между цифрами) используйте регулярные выражения через объект РегулярноеВыражение:

РегВыр = Новый РегулярноеВыражение("[\s]+");

Результат = РегВыр.Заменить("Строка с пробелами", " ");

// Удаление пробелов перед запятыми

РегВыр = Новый РегулярноеВыражение("\s+,");

Результат = РегВыр.Заменить("а , б , в", ","); // Вернет "а,б,в"

Регулярные выражения незаменимы когда нужно:

  • 🔢 Удалять пробелы только в определенных позициях (например, между цифрами телефона)
  • 📛 Очищать сложные шаблоны (артикулы с разделителями)
  • 🌍 Обрабатывать многоязычные строки с разными типами пробелов
Задача Регулярное выражение Пример замены
Удалить все пробелы [\s]+ " """
Свести множественные пробелы к одному \s{2,} " "
Удалить пробелы перед запятыми \s+, ","
Убрать пробелы между цифрами (\d)\s+(\d) "$1$2"
⚠️ Внимание: Регулярные выражения требуют больше ресурсов, чем простые функции. Не используйте их для обработки больших массивов данных (тысячи строк) без оптимизации.

Способ 5: Обработка пробелов при обмене данными (XML, JSON, CSV)

При импорте/экспорте данных пробелы часто становятся источником проблем. Рассмотрим типичные сценарии:

1. Очистка данных перед экспортом в CSV

Используйте обработку полей перед записью в файл:

Процедура ПодготовитьСтрокуДляCSV(Знач Строка)

Возврат """" + СокрЛП(СтрЗаменить(Строка, """", """""")) + """";

КонецПроцедуры

2. Нормализация XML-данных

При чтении XML удаляйте пробелы из атрибутов:

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.ОткрытьФайл("data.xml");

Пока ЧтениеXML.Прочитать() Цикл

Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут Тогда

ЧтениеXML.Значение = СокрЛП(ЧтениеXML.Значение);

КонецЕсли;

КонецЦикла;

3. Работа с JSON

В 1С 8.3.14+ при сериализации в JSON пробелы сохраняются. Для их удаления:

Данные = Новый Структура("Поле1, Поле2", "  Значение1  ", "  Значение2  ");

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьJSON(Новый Структура(

"Поле1, Поле2",

СокрЛП(Данные.Поле1),

СокрЛП(Данные.Поле2)

));

☑️ Проверка перед обменом данными

Выполнено: 0 / 4

Типичные ошибки и как их избежать

При работе с пробелами в разработчики часто допускают характерные ошибки:

  1. Игнорирование неразрывных пробелов ( ):

    Функция СокрЛП() не удаляет неразрывные пробелы (код 160). Для их обработки используйте:

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

    Результат = СокрЛП(Строка);

  2. Проблемы с регистром:

    После удаления пробелов сравнение строк может давать ложные результаты из-за разного регистра. Всегда нормализуйте регистр:

    Если НРег(СокрЛП(Строка1)) = НРег(СокрЛП(Строка2)) Тогда...
  3. Неучет локали:

    В многоязычных базах пробелы могут быть частью форматирования (например, в арабском или китайском тексте). Перед очисткой проверяйте языковые настройки.

⚠️ Внимание: В конфигурациях с полнотекстовым поиском (1С:Документооборот) удаление пробелов может нарушить индексацию. Перед массовой очисткой тестируйте влияние на поисковые запросы.
💡

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

FAQ: Частые вопросы по работе с пробелами в 1С

Как удалить пробелы в начале и конце строки в отчете?

В настройках отчета добавьте вычисляемое поле с формулой СокрЛП([ПолеСПробелами]). Если нужно изменить исходные данные, используйте обработку "Перед формированием результата".

Почему после СокрЛП() в строке остаются пробелы?

Вероятные причины:

  1. В строке используются неразрывные пробелы (код 160)
  2. Пробелы являются частью форматирования (например, в HTML-тегах)
  3. Строка содержит символы табуляции (Символ(9)) или переноса строки

Используйте СтрЗаменить() для конкретных символов или комбинацию функций.

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

Для телефонов лучше использовать регулярные выражения, сохраняя разделители:

РегВыр = Новый РегулярноеВыражение("[\s-]+");

Результат = РегВыр.Заменить("8 (999) 123-45-67", ""); // Вернет "89991234567"

Для сохранения формата используйте маски ввода.

Можно ли автоматически очищать пробелы при вводе в поле формы?

Да, используйте обработчик события ПриИзменении:

Процедура ПолеВводаПриИзменении(Элемент)

Элемент.Значение = СокрЛП(Элемент.Значение);

КонецПроцедуры

Для сложной логики создайте отдельную обработку.

Как удалить пробелы в больших таблицах без тормозов?

Для оптимизации:

  1. Используйте пакетные обновления (НачатьТранзакцию())
  2. Обрабатывайте данные порциями по 1000 строк
  3. Для SQL-баз используйте прямые запросы:
Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| СокрЛП(Поле) КАК Поле

|ИЗ Таблица";

Результат = Запрос.Выполнить();