Работа со строками в 1С:Предприятие — одна из самых частых задач при разработке конфигураций, обработок и отчётов. Проблема лишних пробелов возникает при импорте данных из внешних источников, ручном вводе пользователями или после обработки текстов. Неумелое удаление пробелов может привести к ошибкам сравнения строк, искажению данных в печатных формах или сбоям при обмене с другими системами.
В этой статье разберём все возможные способы удаления пробелов — от стандартных функций платформы до авторских алгоритмов для нетипичных случаев. Особое внимание уделим нюансам работы с разными версиями 1С 8.3 и 1С 8.2, а также оптимизации кода для крупных массивов данных.
Если вы ищете решение для конкретной задачи — используйте оглавление. Если нужна универсальная функция — в конце статьи приведён готовый код, который покрывает 90% сценариев. Для новичков мы подробно объяснили базовые методы, а опытные разработчики найдут здесь редкие приёмы, например, работу с регулярными выражениями или обработку строк с учётом неразрывных пробелов.
⚠️ Важно: перед массовым удалением пробелов всегда проверяйте результат на тестовых данных. В некоторых случаях (например, в адресах или ФИО) пробелы могут быть значимыми!
1. Стандартная функция СокрЛП() — быстрое решение для большинства задач
Функция СокрЛП() (сократить левые и правые пробелы) — самый простой и распространённый способ удаления пробелов в начале и конце строки. Она встроена во все версии платформы 1С:Предприятие и работает одинаково стабильно.
Основные особенности функции:
- 🔹 Удаляет только ведущие и завершающие пробелы (не трогает пробелы внутри строки)
- 🔹 Работает с любыми типами строк (включая
Неопределённоезначение) - 🔹 Не изменяет регистр и не удаляет другие "непечатаемые" символы (табуляции, переводы строк)
- 🔹 Оптимизирована для быстрой работы с большими объёмами данных
Пример использования:
СтрокаСПробелами = " Пример строки с пробелами ";
Результат = СокрЛП(СтрокаСПробелами);
// Результат: "Пример строки с пробелами"
⚠️ Внимание: если в строке есть неразрывные пробелы (символ ), функция СокрЛП() их не удалит. Для таких случаев потребуется дополнительная обработка (см. раздел 5).
2. Функция СтрЗаменить() — гибкое удаление пробелов в любом месте строки
Когда нужно удалить все пробелы (включая пробелы внутри строки) или заменить их на другой символ, используется функция СтрЗаменить(). Она позволяет точечно управлять процессом замены.
Синтаксис функции:
СтрЗаменить(<Строка>, <ШаблонПоиска>, <Замена>[, <НаправлениеПоиска>[, <Сравнение>[, <НачальнаяПозиция>[, <КоличествоЗамен>]]]])
Для удаления всех пробелов достаточно указать пробел в качестве шаблона и пустую строку в качестве замены:
СтрокаСПробелами = "1 2 3 4 5";
Результат = СтрЗаменить(СтрокаСПробелами, " ", "");
// Результат: "12345"
Продвинутые возможности функции:
- 🔧 Замена только первых N пробелов (параметр
КоличествоЗамен) - 🔧 Учёт регистра при поиске (параметр
Сравнение) - 🔧 Замена пробелов на другие символы (например, подчёркивание)
Пример замены пробелов на подчёркивания:
Результат = СтрЗаменить("Файл 1C", " ", "_");
// Результат: "Файл_1C"
Если нужно удалить пробелы только в начале или только в конце строки, комбинируйте СокрЛП() с Лев()/Прав(). Например, Лев(СокрЛП(Строка), СтрДлина(СокрЛП(Строка)) - 1) удалит последний символ (если это пробел).
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). Стандартные функции 1С их не обрабатывают, поэтому требуются специальные приёмы.
Способы обнаружения и удаления:
| Тип символа | Код символа | Метод удаления |
|---|---|---|
| Обычный пробел | 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С. Скопируйте их в общий модуль и используйте по мере необходимости.
Функция 1. Удаление всех пробелов (включая неразрывные и табуляции):
Функция УдалитьВсеПробелы(Знач Строка) Экспорт
Если ТипЗнч(Строка) <> Тип("Строка") Тогда
Возврат Строка;
КонецЕсли;
// Удаляем все виды пробелов
Строка = СтрЗаменить(Строка, " ", "");
Строка = СтрЗаменить(Строка, Символ(160), "");
Строка = СтрЗаменить(Строка, Символ(9), "");
Строка = СтрЗаменить(Строка, Символ(13), "");
Строка = СтрЗаменить(Строка, Символ(10), "");
Возврат Строка;
КонецФункции
Функция 2. Нормализация пробелов (замена нескольких пробелов на один):
Функция НормализоватьПробелы(Знач Строка) Экспорт
Если ТипЗнч(Строка) <> Тип("Строка") Тогда
Возврат Строка;
КонецЕсли;
РВ = Новый РегулярноеВыражение("\s{2,}");
Возврат СокрЛП(РВ.Заменить(Строка, " "));
КонецФункции
Функция 3. Удаление пробелов только в начале или только в конце:
Функция УдалитьПробелыВНачале(Знач Строка) Экспорт
Если ТипЗнч(Строка) <> Тип("Строка") Тогда
Возврат Строка;
КонецЕсли;
Пока Лев(Строка, 1) = " " Или КодСимвола(Лев(Строка, 1)) = 160 Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Возврат Строка;
КонецФункции
Функция УдалитьПробелыВКонце(Знач Строка) Экспорт
Если ТипЗнч(Строка) <> Тип("Строка") Тогда
Возврат Строка;
КонецЕсли;
Пока Прав(Строка, 1) = " " Или КодСимвола(Прав(Строка, 1)) = 160 Цикл
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЦикла;
Возврат Строка;
КонецФункции
⚠️ Внимание: при использовании этих функций в типовой конфигурации (например, 1С:Бухгалтерия или 1С:УТ) проверьте, не конфликтуют ли они с существующими обработками. В некоторых случаях лучше создавать внешние обработки, чтобы не нарушать поддержку.
Добавьте эти функции в общий модуль с правом вызова из любого места (Экспорт). Для удобства можно создать префикс, например стрУдалитьПробелы(), чтобы быстро находить их в подсказке.
❓ Как удалить пробелы в строке 1С, если функция СокрЛП() не работает?
Если СокрЛП() не даёт ожидаемого результата, проверьте:
- Тип данных — функция работает только со строками. Используйте
Строка()для приведения. - Наличие неразрывных пробелов (код 160). Используйте
СтрЗаменить(Строка, Символ(160), " ")передСокрЛП(). - Кодировку строки. В редких случаях пробелы могут быть представлены другими символами (например, в UTF-8).
Для диагностики выведите код каждого символа строки:
Для i = 1 По СтрДлина(Строка) Цикл
Сообщить(КодСимвола(Сред(Строка, i, 1)));
КонецЦикла;
❓ Можно ли удалить пробелы в 1С без программирования?
Да, в некоторых случаях пробелы можно удалить без кода:
- В табличных документах — используйте функцию
НАЙТИИЗАМЕНИТЬ()в формуле. - В отчётах — настройте выражение поля с применением
СокрЛП(). - В формах — добавьте обработчик события
ПриИзменениидля автоматической очистки.
Пример для табличного документа:
=НАЙТИИЗАМЕНИТЬ([ПолеСПробелами];" ";"")
❓ Как удалить пробелы в 1С 7.7?
В 1С 7.7 доступны те же функции, но с некоторыми ограничениями:
СокрЛП()работает аналогично.- Нет объекта
РегулярноеВыражение— используйтеСтрЗаменить()в цикле. - Для неразрывных пробелов используйте
КодСимв()иСимв().
Пример кода для 7.7:
Проц ОбработатьСтроку(Стр)
Пока Найти(Стр, " ") > 0 Цикл
Стр = СтрУдалить(Стр, Найти(Стр, " "), 1);
КонецЦикла;
Возврат Стр;
КонецПроц
❓ Почему после удаления пробелов строки не совпадают при сравнении?
Распространённые причины:
- В строках остались неразрывные пробелы (код 160).
- Сравнение с учётом регистра (используйте
НРег()для приведения к нижнему регистру). - Наличие других "невидимых" символов (табуляции, переводы строк).
- Разная кодировка строк (например, UTF-8 vs Windows-1251).
Для надёжного сравнения нормализуйте обе строки:
Функция НормализоватьДляСравнения(Стр)
Стр = СокрЛП(Стр);
Стр = СтрЗаменить(Стр, Символ(160), " ");
Стр = НРег(Стр);
Возврат Стр;
КонецФункции
// Сравнение:
Если НормализоватьДляСравнения(Строка1) = НормализоватьДляСравнения(Строка2) Тогда
// Строки совпадают
КонецЕсли;
❓ Как удалить пробелы в 1С при выгрузке данных в XML?
При выгрузке в XML пробелы могут сохраняться, если не настроена обработка. Решения:
- Используйте
ЗаписьXML.УстановитьСтроку()с предварительной очисткой. - Настройте XDTO-пакет с обработчиками значений.
- Для
ЗаписьJSONиспользуйте параметрФорматированныйВывод = Ложь.
Пример для ЗаписьXML:
ЗаписьXML.УстановитьСтроку("Элемент", СокрЛП(Данные.Элемент));
Для массовой выгрузки оптимально обработать данные до формирования XML.