Работа с текстовыми данными в 1С:Предприятие 8.3 часто сталкивается с проблемой «грязных» строк: лишние пробелы, неразрывные символы, управляющие знаки или артефакты после импорта из Excel. Эти символы портят сортировку, мешают сравнению строк и могут вызывать ошибки в отчётах. Например, строка " Пример " с пробелами по краям и строка "Пример" для системы — разные значения, хотя пользователю они кажутся идентичными.
В этой статье разберём 5 практических способов очистки строк — от стандартных функций платформы до регулярных выражений и внешних обработок. Особое внимание уделим неочевидным символам (табуляции, переводы строк, неразрывные пробелы), которые не видны в интерфейсе, но ломают логику работы. Все примеры протестированы на актуальных релизах 1С:Предприятие 8.3.22–8.3.24.
Если вы работаете с большими объёмами данных (например, очищаете справочники Номенклатура или Контрагенты), в конце статьи найдёте готовые обработки для массовой очистки — их можно адаптировать под любую конфигурацию.
1. Стандартные функции 1С: СокрЛП(), СокрЛ() и СокрП()
Начнём с базовых инструментов платформы. Функции СокрЛП(), СокрЛ() и СокрП() предназначены для удаления пробелов, но работают по-разному:
СокрЛП(Строка) — убирает все пробелы слева и справа, а также заменяет несколько пробелов подряд внутри строки на один. Пример:
Результат = СокрЛП(" Пример с пробелами ");
// Вернёт: "Пример с пробелами"
СокрЛ(Строка) и СокрП(Строка) — удаляют пробелы только слева или справа соответственно. Эти функции полезны, если нужно сохранить внутренние пробелы (например, в адресах или ФИО).
⚠️ Внимание: Стандартные функции 1С не удаляют неразрывные пробелы (символ ) и другие управляющие знаки. Для них потребуются дополнительные методы (см. раздел 3).
1. Создайте тестовую строку с пробелами в начале, конце и внутри
2. Примените функцию СокрЛП()
3. Сравните результат с исходной строкой через Дебаггер (F9)
4. Проверьте строку на наличие неразрывных пробелов (см. раздел 3)
-->
2. Функция СтрЗаменить() для целевой очистки
Когда нужно удалить конкретные символы (например, кавычки, точки или запятые), используйте СтрЗаменить(). Она заменяет все вхождения подстроки на указанное значение. Чтобы удалить символ — замените его на пустую строку "".
Примеры применения:
// Удаляем все кавычки
СтрокаБезКавычек = СтрЗаменить(ИсходнаяСтрока, """", "");
// Удаляем точки и запятые
СтрокаБезЗнаков = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, ".", ""), ",", "");
Для удаления нескольких символов удобно использовать цикл по массиву:
СимволыДляУдаления = Новый Массив;
СимволыДляУдаления.Добавить("""");
СимволыДляУдаления.Добавить(".");
СимволыДляУдаления.Добавить(",");
Для Каждого Символ Из СимволыДляУдаления Цикл
ИсходнаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символ, "");
КонецЦикла;
Критичный нюанс: функция СтрЗаменить() чувствительна к регистру. Чтобы удалить символы независимо от регистра, предварительно преобразуйте строку в нижний регистр с помощью НРег().
Если Лев(Строка, 1) = """" Тогда Строка = СокрЛ(СтрЗаменить(Строка, """", "")); КонецЕсли;-->
3. Неразрывные пробелы и невидимые символы
Один из самых коварных типов «мусора» в строках — неразрывные пробелы (HTML-код ). Они выглядят как обычные пробелы, но не удаляются функциями СокрЛП() и могут попадать в базу при копировании данных из Word, Excel или веб-страниц.
Чтобы их обнаружить и удалить, используйте комбинацию СтрЗаменить() с символом Символы.НПП (неразрывный пробел):
ОчищеннаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, " ");
Другие «невидимки», с которыми часто сталкиваются:
- 🔹
Символы.Таб— табуляция () - 🔹
Символы.ВК— перевод строки () - 🔹
Символы.ПС— возврат каретки () - 🔹
Символы.НРП— неразрывный пробел ()
Универсальный код для удаления всех управляющих символов:
ОчищеннаяСтрока = Строка;
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, Символы.Таб, " ");
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, Символы.ВК, " ");
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, Символы.ПС, " ");
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, Символы.НПП, " ");
ОчищеннаяСтрока = СокрЛП(ОчищеннаяСтрока);
Как проверить строку на наличие невидимых символов?
Используйте функцию КодСимвола() в цикле по всем символам строки:
Для Инд = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Символ = Сред(ИсходнаяСтрока, Инд, 1);
Если КодСимвола(Символ) < 32 Тогда
Сообщить("Найден управляющий символ: " + КодСимвола(Символ));
КонецЕсли;
КонецЦикла;
Этот код выведет в отладочное окно коды всех непечатаемых символов (коды < 32).
4. Регулярные выражения для сложных случаев
Если стандартные функции не справляются (например, нужно удалить все символы, кроме букв и цифр), подключите регулярные выражения. В 1С 8.3 для этого используется объект РегулярноеВыражение.
Пример: оставить в строке только буквы, цифры и пробелы:
РегВыражение = Новый РегулярноеВыражение("[^а-яА-ЯёЁa-zA-Z0-9 ]", "g");
ОчищеннаяСтрока = РегВыражение.Заменить(ИсходнаяСтрока, "");
Расшифровка регулярного выражения:
- 🔤
[^...]— искать все символы, кроме указанных в скобках - 🔤
а-яА-ЯёЁ— русские буквы (включая «ё») - 🔤
a-zA-Z— латинские буквы - 🔤
0-9— цифры - 🔤
— пробел (обязательно добавьте, если хотите его сохранить) - 🔤
"g"— флаг глобального поиска (заменить все вхождения)
⚠️ Внимание: Регулярные выражения требуют осторожности:
🔴 В старых версиях 1С 8.2 объектРегулярноеВыражениеотсутствует. Для совместимости используйте внешние COM-объекты (например,VBScript.RegExp) или обновляйте платформу.
Ещё примеры регулярных выражений для очистки:
| Задача | Регулярное выражение | Пример замены |
|---|---|---|
| Удалить все символы, кроме цифр | [^0-9] |
"А1Б2В3" → "123" |
| Удалить повторяющиеся пробелы | [ ]{2,} |
"А Б В" → "А Б В" |
| Удалить все знаки препинания | [.,;:!?] |
"Пример, текст!" → "Пример текст" |
| Оставить только латиницу | [^a-zA-Z] |
"Пример123" → "" |
5. Массовая очистка данных: обработки и запросы
Когда нужно очистить тысячи записей (например, в справочнике Номенклатура или документах Заказ клиента), ручные методы не подходят. Здесь помогут:
1. Обработка для массового обновления:
Создайте обработку с циклом по нужным данным и примените одну из функций очистки. Пример для справочника Контрагенты:
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
ТекущийЭлемент = Выборка.ПолучитьОбъект();
ТекущийЭлемент.Наименование = СокрЛП(ТекущийЭлемент.Наименование);
ТекущийЭлемент.Записать();
КонецЦикла;
2. Запрос с обновлением:
Для больших объёмов данных эффективнее использовать запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтрагентыСсылка КАК Ссылка,
| СокрЛП(Контрагенты.Наименование) КАК НовоеНаименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование <> СокрЛП(Контрагенты.Наименование)";
Результат = Запрос.Выполнить();
Для Каждого Строка Из Результат Цикл
Объект = Строка.Ссылка.ПолучитьОбъект();
Объект.Наименование = Строка.НовоеНаименование;
Объект.Записать();
КонецЦикла;
3. Внешние обработки:
Готовые решения для массовой очистки:
- 📁 Обработка "Чистка строк" от Infostart — поддерживает регулярные выражения и пакетную обработку.
- 📁 "Универсальная очистка данных" (доступна в каталоге
1С:ИТС) — работает с любыми справочниками и документами. - 📁 "Поиск и замена в базах 1С" — позволяет очищать данные по сложным шаблонам.
⚠️ Внимание: Перед массовой очисткой обязательно сделайте резервную копию базы. Некоторые символы (например, кавычки в наименованиях номенклатуры) могут быть частью бизнес-логики.
НачатьТранзакцию();
// Код очистки
ЗафиксироватьТранзакцию();
Это сократит время выполнения в 2–3 раза за счёт уменьшения количества операций записи.-->
6. Проверка результата и отлов ошибок
После очистки данных важно убедиться, что:
- 🔍 Строки визуально выглядят корректно (нет обрезанных слов или слипшихся символов).
- 🔍 Сортировка и поиск работают ожидаемо (например,
"Аппле"и" Apple "теперь считаются одинаковыми). - 🔍 Не сломалась бизнес-логика (например, если в наименованиях были специальные символы для интеграции с сайтом).
Для проверки используйте:
- 🔹 Дебаггер (
F9) — поставьте точку останова и проверьте значения переменных. - 🔹 Отчёт по дублям — после очистки запустите отчёт
"Поиск дублей"(если он есть в вашей конфигурации). - 🔹 Экспорт в Excel — иногда ошибки очистки видны только при экспорте.
Если после очистки появились ошибки (например, "Недопустимое значение типа Строка"), проверьте:
🔴 Частая ошибка: после удаления всех пробелов слиплись слова, и длина строки превысила ограничение поля в базе (например, 250 символов дляНаименованиев справочнике). Решение — обрезать строку функциейЛев()илиСред().
FAQ: Частые вопросы по очистке строк в 1С
Как удалить все пробелы из строки, включая внутренние?
Используйте СтрЗаменить() с заменой пробела на пустую строку:
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");
Если нужно удалить все пробелы (включая неразрывные и табуляции), комбинируйте с циклом по символам:
Результат = "";
Для Инд = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Символ = Сред(ИсходнаяСтрока, Инд, 1);
Если НЕ (Символ = " " ИЛИ Символ = Символы.НПП ИЛИ Символ = Символы.Таб) Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Почему СокрЛП() не убирает пробелы в некоторых строках?
Скорее всего, в строке используются неразрывные пробелы (Символы.НПП) или другие управляющие символы. Проверьте строку так:
Если Найти(ИсходнаяСтрока, Символы.НПП) > 0 Тогда
Сообщить("Найден неразрывный пробел!");
КонецЕсли;
Решение — замените их на обычные пробелы перед применением СокрЛП().
Как очистить строки при импорте из Excel?
При импорте из Excel через ЗагрузкаДанныхИзТабличногоДокумента или COM-объект добавьте очистку на этапе чтения данных:
Для Каждого Строка Из ТабличныйДокумент Цикл
// Очищаем каждую ячейку
Для Инд = 1 По Строка.КоличествоКолонок Цикл
Строка.Колонки[Инд].Текст = СокрЛП(СтрЗаменить(Строка.Колонки[Инд].Текст, Символы.НПП, " "));
КонецЦикла;
КонецЦикла;
Для массового импорта используйте предварительную обработку в самом Excel (найти/заменить) или напишите скрипт на VBA.
Можно ли очистить строки без программирования?
Да, если ваша конфигурация поддерживает полнотекстовый поиск:
- Откройте список справочника (например,
Номенклатура). - Включите отображение колонки
Наименование. - Нажмите
Ещё → Настроить список → Полнотекстовый поиск. - Введите в поиск символ
(пробел) — система покажет записи с пробелами в начале/конце. - Выделите нужные строки и исправьте вручную.
Для ускорения используйте групповое редактирование (если оно поддерживается в вашей конфигурации).
Как очистить строки в отчётах или печатных формах?
В отчётах и печатных формах очистку строк удобно делать прямо в выражениях полей. Например, для поля НаименованиеКонтрагента в печатной форме:
СокрЛП(СтрЗаменить(Объект.Контрагент.Наименование, Символы.НПП, " "))
Если отчёт строится через СКД (система компоновки данных), добавьте очистку в вычисляемое поле:
- Откройте настройки схемы компоновки.
- Добавьте вычисляемое поле с формулой
СокрЛП([Наименование]). - Используйте это поле вместо оригинального.