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

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

Если вы ищете решение для конкретной задачи — используйте оглавление. Если нужна универсальная функция — в конце статьи приведён готовый код, который покрывает 90% сценариев. Для новичков мы подробно объяснили базовые методы, а опытные разработчики найдут здесь редкие приёмы, например, работу с регулярными выражениями или обработку строк с учётом неразрывных пробелов.

⚠️ Важно: перед массовым удалением пробелов всегда проверяйте результат на тестовых данных. В некоторых случаях (например, в адресах или ФИО) пробелы могут быть значимыми!

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

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

Основные особенности функции:

  • 🔹 Удаляет только ведущие и завершающие пробелы (не трогает пробелы внутри строки)
  • 🔹 Работает с любыми типами строк (включая Неопределённое значение)
  • 🔹 Не изменяет регистр и не удаляет другие "непечатаемые" символы (табуляции, переводы строк)
  • 🔹 Оптимизирована для быстрой работы с большими объёмами данных

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

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

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

// Результат: "Пример строки с пробелами"

⚠️ Внимание: если в строке есть неразрывные пробелы (символ  ), функция СокрЛП() их не удалит. Для таких случаев потребуется дополнительная обработка (см. раздел 5).

📊 Какой метод удаления пробелов вы используете чаще?
СокрЛП()
СтрЗаменить()
Регулярные выражения
Собственные функции

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

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

Синтаксис функции:

СтрЗаменить(<Строка>, <ШаблонПоиска>, <Замена>[, <НаправлениеПоиска>[, <Сравнение>[, <НачальнаяПозиция>[, <КоличествоЗамен>]]]])

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

СтрокаСПробелами = "1 2 3 4 5";

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

// Результат: "12345"

Продвинутые возможности функции:

  • 🔧 Замена только первых N пробелов (параметр КоличествоЗамен)
  • 🔧 Учёт регистра при поиске (параметр Сравнение)
  • 🔧 Замена пробелов на другие символы (например, подчёркивание)

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

Результат = СтрЗаменить("Файл 1C", " ", "_");

// Результат: "Файл_1C"

💡

Если нужно удалить пробелы только в начале или только в конце строки, комбинируйте СокрЛП() с Лев()/Прав(). Например, Лев(СокрЛП(Строка), СтрДлина(СокрЛП(Строка)) - 1) удалит последний символ (если это пробел).

3. Удаление пробелов в массивах строк — оптимизация для пакетной обработки

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

Способы оптимизации:

  1. Использование функции ПреобразоватьКолонку() для таблиц значений
  2. Применение Запрос.ВыполнитьПакет() для массового обновления
  3. Создание временных коллекций с предварительной обработкой

Пример пакетной обработки таблицы значений:

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Наименование");

// Заполняем данными с пробелами

Таблица.Добавить();

Таблица[0].Наименование = " Товар 1 ";

Таблица.Добавить();

Таблица[1].Наименование = "Товар 2 ";

// Удаляем пробелы пакетно

ПреобразоватьКолонку(Таблица, "Наименование", "СокрЛП(Значение)");

⚠️ Внимание: при работе с большими таблицами (10 000+ строк) пакетная обработка может блокировать интерфейс. В таких случаях используйте фоновые задания или разбивайте данные на порции по 1 000-5 000 строк.

Использовать пакетные операции вместо циклов

Применять ПреобразоватьКолонку() для таблиц значений

Разбивать большие массивы на порции

Тестировать производительность на реальных данных-->

4. Регулярные выражения — мощный инструмент для сложных шаблонов

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

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

  • 📝 Удаление всех пробелов: \s+
  • 📝 Замена нескольких пробелов на один: \s{2,} → " "
  • 📝 Удаление пробелов перед знаками препинания: \s+([.,;:!?]) → "$1"

Пример кода для удаления всех пробелов:

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

СтрокаБезПробелов = РВ.Заменить("1 2 3 4", "");

// Результат: "1234"

Пример замены нескольких пробелов на один:

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

СтрокаСНормализованнымиПробелами = РВ.Заменить("1 2 3", " ");

// Результат: "1 2 3"

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

5. Работа с неразрывными пробелами и другими "невидимыми" символами

В некоторых случаях в строках могут встречаться неразрывные пробелы (HTML-сущность   или символ с кодом 160), табуляции (\t), переводы строк (\r\n). Стандартные функции их не обрабатывают, поэтому требуются специальные приёмы.

Способы обнаружения и удаления:

Тип символа Код символа Метод удаления
Обычный пробел 32 СтрЗаменить(Строка, " ", "")
Неразрывный пробел 160 СтрЗаменить(Строка, Символ(160), "")
Табуляция 9 СтрЗаменить(Строка, Символ(9), "")
Перевод строки (Windows) 13 + 10 СтрЗаменить(СтрЗаменить(Строка, Символ(13), ""), Символ(10), "")

Универсальная функция для удаления всех типов пробелов:

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

// Удаляем обычные пробелы

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

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

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

// Удаляем табуляции

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

// Удаляем переводы строк

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

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

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

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

Сообщить(КодСимвола(Сред("а" + Символ(160) + "б", 2, 1))); // Вернёт 160

6. Удаление пробелов в полях справочников и документов — практические примеры

Чаще всего пробелы требуется удалять в полях наименования, артикулов или адресов. Рассмотрим типичные сценарии с готовыми решениями.

Пример 1. Очистка наименований номенклатуры перед выгрузкой в Excel:

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

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

Выборка.Объект.Наименование = СокрЛП(Выборка.Объект.Наименование);

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

КонецЦикла;

Пример 2. Нормализация артикулов (удаление всех пробелов и приведение к верхнему регистру):

Функция НормализоватьАртикул(Артикул)

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

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

Возврат ВРег(Артикул);

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

Пример 3. Очистка адресов от двойных пробелов (с сохранением одиночных):

Функция НормализоватьАдрес(Адрес)

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

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

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

⚠️ Внимание: при массовом изменении данных в справочниках всегда создавайте резервную копию базы или используйте транзакции:

НачатьТранзакцию();

Попытка

// Код изменения данных

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

Сообщить(ОписаниеОшибки());

КонецПопытки;

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

Используйте запрос с функцией НАЙТИ() для поиска записей с ведущими/завершающими пробелами:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,

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

ИЗ

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

ГДЕ

НАЙТИ(Номенклатура.Наименование, " ") = 1

ИЛИ ПРАВ(Номенклатура.Наименование, 1) = " "

Это вернёт все позиции, где есть пробелы в начале или конце наименования.

7. Сравнение производительности разных методов

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

Метод Скорость (10 000 строк) Память Гибкость Когда использовать
СокрЛП() ~0.1 сек Низкая Низкая Удаление пробелов по краям
СтрЗаменить() ~0.3 сек Низкая Средняя Удаление всех пробелов или замена на другие символы
Регулярные выражения ~1.2 сек Высокая Высокая Сложные шаблоны замены
Цикл по символам ~2.5 сек Средняя Максимальная Уникальные алгоритмы обработки

Рекомендации по выбору метода:

  • 🚀 Для простых задач (убрать пробелы по краям) всегда используйте СокрЛП()
  • 🔧 Для удаления всех пробелов внутри строки — СтрЗаменить()
  • 🛠️ Для сложных шаблонов (например, "убрать пробелы между цифрами, но оставить в буквах") — регулярные выражения
  • 🐢 Для уникальных алгоритмов (например, удаление пробелов только после запятых) — ручная обработка в цикле
💡

Для массовой обработки данных (более 100 000 строк) оптимально использовать пакетные операции на уровне СУБД через временные таблицы. Это ускорит процесс в 10-100 раз по сравнению с построчной обработкой в 1С.

8. Готовые функции для типовых задач (копипаст для ваших проектов)

В этом разделе собраны универсальные функции, которые покрывают 90% сценариев работы с пробелами в . Скопируйте их в общий модуль и используйте по мере необходимости.

Функция 1. Удаление всех пробелов (включая неразрывные и табуляции):

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

Если ТипЗнч(Строка) <> Тип("Строка") Тогда

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

КонецЕсли;

// Удаляем все виды пробелов

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

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

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

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

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

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

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

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

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

Если ТипЗнч(Строка) <> Тип("Строка") Тогда

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

КонецЕсли;

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

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

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

Функция 3. Удаление пробелов только в начале или только в конце:

Функция УдалитьПробелыВНачале(Знач Строка) Экспорт

Если ТипЗнч(Строка) <> Тип("Строка") Тогда

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

КонецЕсли;

Пока Лев(Строка, 1) = " " Или КодСимвола(Лев(Строка, 1)) = 160 Цикл

Строка = Сред(Строка, 2);

КонецЦикла;

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

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

Функция УдалитьПробелыВКонце(Знач Строка) Экспорт

Если ТипЗнч(Строка) <> Тип("Строка") Тогда

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

КонецЕсли;

Пока Прав(Строка, 1) = " " Или КодСимвола(Прав(Строка, 1)) = 160 Цикл

Строка = Лев(Строка, СтрДлина(Строка) - 1);

КонецЦикла;

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

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

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

💡

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

❓ Как удалить пробелы в строке 1С, если функция СокрЛП() не работает?

Если СокрЛП() не даёт ожидаемого результата, проверьте:

  1. Тип данных — функция работает только со строками. Используйте Строка() для приведения.
  2. Наличие неразрывных пробелов (код 160). Используйте СтрЗаменить(Строка, Символ(160), " ") перед СокрЛП().
  3. Кодировку строки. В редких случаях пробелы могут быть представлены другими символами (например, в UTF-8).

Для диагностики выведите код каждого символа строки:

Для i = 1 По СтрДлина(Строка) Цикл

Сообщить(КодСимвола(Сред(Строка, i, 1)));

КонецЦикла;

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

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

  • В табличных документах — используйте функцию НАЙТИИЗАМЕНИТЬ() в формуле.
  • В отчётах — настройте выражение поля с применением СокрЛП().
  • В формах — добавьте обработчик события ПриИзменении для автоматической очистки.

Пример для табличного документа:

=НАЙТИИЗАМЕНИТЬ([ПолеСПробелами];" ";"")
❓ Как удалить пробелы в 1С 7.7?

В 1С 7.7 доступны те же функции, но с некоторыми ограничениями:

  • СокрЛП() работает аналогично.
  • Нет объекта РегулярноеВыражение — используйте СтрЗаменить() в цикле.
  • Для неразрывных пробелов используйте КодСимв() и Симв().

Пример кода для 7.7:

Проц ОбработатьСтроку(Стр)

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

Стр = СтрУдалить(Стр, Найти(Стр, " "), 1);

КонецЦикла;

Возврат Стр;

КонецПроц

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

Распространённые причины:

  1. В строках остались неразрывные пробелы (код 160).
  2. Сравнение с учётом регистра (используйте НРег() для приведения к нижнему регистру).
  3. Наличие других "невидимых" символов (табуляции, переводы строк).
  4. Разная кодировка строк (например, UTF-8 vs Windows-1251).

Для надёжного сравнения нормализуйте обе строки:

Функция НормализоватьДляСравнения(Стр)

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

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

Стр = НРег(Стр);

Возврат Стр;

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

// Сравнение:

Если НормализоватьДляСравнения(Строка1) = НормализоватьДляСравнения(Строка2) Тогда

// Строки совпадают

КонецЕсли;

❓ Как удалить пробелы в 1С при выгрузке данных в XML?

При выгрузке в XML пробелы могут сохраняться, если не настроена обработка. Решения:

  • Используйте ЗаписьXML.УстановитьСтроку() с предварительной очисткой.
  • Настройте XDTO-пакет с обработчиками значений.
  • Для ЗаписьJSON используйте параметр ФорматированныйВывод = Ложь.

Пример для ЗаписьXML:

ЗаписьXML.УстановитьСтроку("Элемент", СокрЛП(Данные.Элемент));

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