Работа со строками в 1С:Предприятие 8.3 часто требует очистки данных от лишних пробелов — будь то начальные, конечные или множественные внутренние. Неаккуратные пробелы могут искажать результаты запросов, мешать сравнению строк или приводить к ошибкам при интеграции с внешними системами. Особенно критично это при обработке данных, импортированных из Excel, текстовых файлов или баз данных, где форматирование не всегда идеально.
В этой статье разберём 5 способов удаления пробелов — от стандартных функций 1С до 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 SQL | LTRIM(RTRIM()) | SELECT LTRIM(RTRIM(Наименование)) FROM Номенклатура |
| PostgreSQL | TRIM() | SELECT TRIM(Наименование) FROM Номенклатура |
| Oracle | TRIM() | SELECT TRIM(Наименование) FROM Номенклатура |
| MySQL | TRIM() | SELECT TRIM(Наименование) FROM Номенклатура |
Для удаления всех пробелов в SQL используйте REPLACE():
SELECT REPLACE(Наименование, ' ', '') AS НаименованиеБезПробелов
FROM Номенклатура
В 1С такой запрос можно выполнить через Запрос.Выполнить():
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| LTRIM(RTRIM(Номенклатура.Наименование)) КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить();
Как ускорить обработку больших выборок?
Для таблиц с миллионами записей сначала очищайте пробелы на стороне СУБД (например, через UPDATE-запрос), а затем загружайте данные в 1С. Это сократит время обработки в 10-100 раз.
Пример UPDATE-запроса для MS SQL:
UPDATE Номенклатура SET Наименование = LTRIM(RTRIM(Наименование))
6. Типичные ошибки и как их избежать
При очистке строк от пробелов разработчики часто сталкиваются с неочевидными проблемами. Вот самые распространённые:
- Пробелы-невидимки. В строке могут быть не только обычные пробелы (
" "), но и:- Табуляции (
Символы.Таб) - Неразрывные пробелы (
Символы.НПП— ) - Переносы строк (
Символы.ПС)
- Табуляции (
Используйте СтрЗаменить() для каждого типа:
Строка = СтрЗаменить(Строка, Символы.Таб, " ");
Строка = СтрЗаменить(Строка, Символы.НПП, " ");
Строка = СтрЗаменить(Строка, Символы.ПС, " ");
- Используйте пакетные запросы к СУБД.
- Применяйте
МассовоеЗаполнениеЗначений()для справочников.
⚠️ Внимание: При обмене данными с внешними системами (например, через 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(Номенклатура.Наименование))
Можно ли очистить пробелы во всех справочниках автоматически?
Да, но это рискованно! Лучше сделать так:
- Создайте обработку с отбором по нужным справочникам.
- Используйте
МассовоеЗаполнениеЗначений()для обновления. - Предварительно сделайте резервную копию базы!
Пример кода для массовой очистки:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
МассовыйОбмен = Новый МассовоеЗаполнениеЗначений;
МассовыйОбмен.ДобавитьЗначение("Наименование", "LTRIM(RTRIM(Наименование))");
МассовыйОбмен.Выполнить(Выборка);
Как проверить, есть ли в строке пробелы?
Используйте функцию Найти():
Если Найти(Строка, " ") > 0 Тогда
Сообщить("В строке есть пробелы!");
КонецЕсли;
Для проверки пробелов в начале/конце:
Если Лев(Строка, 1) = " " Или Прав(Строка, 1) = " " Тогда
Сообщить("Есть пробелы по краям!");
КонецЕсли;