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

В этой статье разберём 5 способов удаления пробелов — от стандартных функций до SQL-запросов и регулярных выражений. Вы узнаете, какой метод выбрать для конкретной задачи, как избежать типичных ошибок и оптимизировать производительность. Все примеры протестированы на актуальных версиях платформы и подходят для конфигураций УТ 11, БП 3.0, ЗУП 3.1 и других.

Если вы часто работаете с текстовыми данными, сохраните эту инструкцию в закладки — она сэкономит часы на отладку кода!

1. Стандартные функции 1С: СокрЛП() и СокрЛ()

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

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

Строка = "   Пример строки   ";

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

Функция СокрЛ() работает аналогично, но удаляет пробелы только слева. Используется реже, но может пригодиться для специфических задач, например, при разборе логов с фиксированными отступами.

  • Плюсы: максимальная скорость выполнения, нет зависимости от внешних библиотек.
  • ⚠️ Минусы: не убирает внутренние пробелы (например, "текст текст" останется без изменений).
  • 🔧 Когда использовать: для очистки полей перед записью в справочники или документы.
💡

Если вам нужно удалить пробелы только справа, используйте комбинацию СокрЛП(СтрЗаменить(Строка, " ", "")) — но это неэффективно. Лучше напишите свою функцию (см. раздел 3).

2. Функция СтрЗаменить() для удаления всех пробелов

Когда требуется удалить все пробелы в строке (включая внутренние), на помощь придёт СтрЗаменить(). Этот метод заменяет все вхождения одного символа на другой. Чтобы убрать пробелы, заменим их на пустую строку:

Строка = "Текст   с    лишними   пробелами";

Результат = СтрЗаменить(Строка, " ", ""); // Вернёт: "Текстслишнимипробелами"

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

Пример применения в запросе:

ВЫБРАТЬ

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

ИЗ

Справочник.Номенклатура КАК Номенклатура

⚠️ Внимание: При работе с большими строками (более 1000 символов) СтрЗаменить() может тормозить. В таких случаях лучше использовать цикл или регулярные выражения.

3. Пользовательская функция для удаления повторяющихся пробелов

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

Функция УдалитьЛишниеПробелы(Знач Строка)

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

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

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

Более продвинутый вариант с циклом (подходит для очень длинных строк):

Функция УдалитьЛишниеПробелыЦикл(Знач Строка)

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

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

КонецЦикла;

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

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

- Тестируйте на строках с табуляциями (Символы.Таб)

- Проверьте обработку строк с переносами (Символы.ПС)

- Убедитесь, что функция не удаляет пробелы в начале/конце, если они нужны

-->

4. Регулярные выражения для сложных случаев

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

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

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

Расшифровка шаблона \s+:

  • \s — любой пробельный символ (пробел, табуляция, перенос строки).
  • + — один или более повторений.

Преимущества регулярных выражений:

  • 🎯 Точное управление: можно удалить пробелы только в начале (^\s+) или конце (\s+$).
  • 🔄 Гибкость: обрабатываются табуляции и переносы строк.
  • ⚡ Быстродействие: оптимизировано для больших текстов.
⚠️ Внимание: Регулярные выражения требуют больше ресурсов, чем стандартные функции. Не используйте их для обработки тысяч строк в цикле — лучше предварительно очистите данные на стороне СУБД (см. раздел 5).

СокрЛП()/СокрЛ()|СтрЗаменить()|Пользовательские функции|Регулярные выражения|SQL-запросы-->

5. Очистка пробелов непосредственно в SQL-запросе

Если вы работаете с внешними источниками данных (например, MS SQL, PostgreSQL) или большими выборками, оптимально очищать пробелы прямо в запросе. Это снизит нагрузку на сервер 1С и ускорит обработку.

Синтаксис зависит от СУБД:

СУБДФункция для удаления пробеловПример
MS SQLLTRIM(RTRIM())SELECT LTRIM(RTRIM(Наименование)) FROM Номенклатура
PostgreSQLTRIM()SELECT TRIM(Наименование) FROM Номенклатура
OracleTRIM()SELECT TRIM(Наименование) FROM Номенклатура
MySQLTRIM()SELECT TRIM(Наименование) FROM Номенклатура

Для удаления всех пробелов в SQL используйте REPLACE():

SELECT REPLACE(Наименование, ' ', '') AS НаименованиеБезПробелов

FROM Номенклатура

В 1С такой запрос можно выполнить через Запрос.Выполнить():

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| LTRIM(RTRIM(Номенклатура.Наименование)) КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

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

Как ускорить обработку больших выборок?

Для таблиц с миллионами записей сначала очищайте пробелы на стороне СУБД (например, через UPDATE-запрос), а затем загружайте данные в 1С. Это сократит время обработки в 10-100 раз.

Пример UPDATE-запроса для MS SQL:

UPDATE Номенклатура SET Наименование = LTRIM(RTRIM(Наименование))

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

При очистке строк от пробелов разработчики часто сталкиваются с неочевидными проблемами. Вот самые распространённые:

  1. Пробелы-невидимки. В строке могут быть не только обычные пробелы (" "), но и:
    • Табуляции (Символы.Таб)
    • Неразрывные пробелы (Символы.НПП —  )
    • Переносы строк (Символы.ПС)

Используйте СтрЗаменить() для каждого типа:

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

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

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

  • Потеря данных при полной очистке. Удаление всех пробелов может слить вместе аббревиатуры (например, "кв.м" станет "кв.м"). Всегда проверяйте результат на реальных данных.
  • Производительность. Обработка тысяч строк в цикле может занять часы. Для массовых операций:
    • Используйте пакетные запросы к СУБД.
    • Применяйте МассовоеЗаполнениеЗначений() для справочников.
    • ⚠️ Внимание: При обмене данными с внешними системами (например, через CommerceML или REST API) очищайте пробелы перед отправкой. Некоторые системы (например, 1С-Битрикс) могут отказывать в обработке данных с "грязными" строками.
      💡

      Перед очисткой пробелов всегда анализируйте формат данных. Например, в полях с адресами или ФИО пробелы могут быть значимыми (например, "г. Москва" vs "г.Москва").

      7. Практический пример: очистка данных перед загрузкой из Excel

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

      Шаг 1. Чтение данных из файла:

      Таблица = ПолучитьДанныеИзExcel("C:\temp\номенклатура.xlsx");
      

      Для Каждого Строка Из Таблица Цикл

      Наименование = Строка.Наименование;

      Шаг 2. Очистка строки:

          // 1. Удаляем невидимые символы
      

      Наименование = СтрЗаменить(Наименование, Символы.Таб, " ");

      Наименование = СтрЗаменить(Наименование, Символы.НПП, " ");

      // 2. Убираем повторяющиеся пробелы

      Наименование = УдалитьЛишниеПробелы(Наименование);

      // 3. Обрезаем пробелы по краям

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

      Шаг 3. Запись в справочник:

          Элемент = Справочники.Номенклатура.СоздатьЭлемент();
      

      Элемент.Наименование = Наименование;

      Элемент.Записать();

      КонецЦикла;

      Такой подход гарантирует, что в базу попадут только чистые данные, а пользователи не увидят "битые" наименования в отчётах.

      FAQ: Частые вопросы по удалению пробелов в 1С

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

      Используйте функцию СокрЛ() или регулярное выражение ^\s+:

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

      Результат = РегВыр.Заменить(" Текст", ""); // Вернёт: "Текст"

      Почему после СтрЗаменить() остаются пробелы?

      Скорее всего, в строке есть неразрывные пробелы (Символы.НПП) или табуляции. Используйте:

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

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

      Как очистить пробелы в запросе с группировкой?

      Применяйте функции очистки в секции ВЫБРАТЬ до группировки:

      ВЫБРАТЬ
      

      LTRIM(RTRIM(Номенклатура.Наименование)) КАК Наименование,

      СУММА(Документ.Количество) КАК Количество

      ИЗ

      Документ.РеализацияТоваровУслуг КАК Документ

      ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

      ПО Документ.Номенклатура = Номенклатура.Ссылка

      СГРУППИРОВАТЬ ПО

      LTRIM(RTRIM(Номенклатура.Наименование))

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

      Да, но это рискованно! Лучше сделать так:

      1. Создайте обработку с отбором по нужным справочникам.
      2. Используйте МассовоеЗаполнениеЗначений() для обновления.
      3. Предварительно сделайте резервную копию базы!

      Пример кода для массовой очистки:

      Запрос = Новый Запрос;
      

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

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

      МассовыйОбмен = Новый МассовоеЗаполнениеЗначений;

      МассовыйОбмен.ДобавитьЗначение("Наименование", "LTRIM(RTRIM(Наименование))");

      МассовыйОбмен.Выполнить(Выборка);

      Как проверить, есть ли в строке пробелы?

      Используйте функцию Найти():

      Если Найти(Строка, " ") > 0 Тогда
      

      Сообщить("В строке есть пробелы!");

      КонецЕсли;

      Для проверки пробелов в начале/конце:

      Если Лев(Строка, 1) = " " Или Прав(Строка, 1) = " " Тогда
      

      Сообщить("Есть пробелы по краям!");

      КонецЕсли;