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

В этой статье разберём 5 практических способов очистки строк — от стандартных функций платформы до регулярных выражений и внешних обработок. Особое внимание уделим неочевидным символам (табуляции, переводы строк, неразрывные пробелы), которые не видны в интерфейсе, но ломают логику работы. Все примеры протестированы на актуальных релизах 1С:Предприятие 8.3.22–8.3.24.

Если вы работаете с большими объёмами данных (например, очищаете справочники Номенклатура или Контрагенты), в конце статьи найдёте готовые обработки для массовой очистки — их можно адаптировать под любую конфигурацию.

📊 С какими лишними символами вы чаще всего сталкиваетесь в 1С?
Пробелы в начале/конце строки
Неразрывные пробелы
Символы табуляции
Переносы строк
Спецсимволы после импорта из Excel

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. Проверка результата и отлов ошибок

После очистки данных важно убедиться, что:

  1. 🔍 Строки визуально выглядят корректно (нет обрезанных слов или слипшихся символов).
  2. 🔍 Сортировка и поиск работают ожидаемо (например, "Аппле" и " Apple " теперь считаются одинаковыми).
  3. 🔍 Не сломалась бизнес-логика (например, если в наименованиях были специальные символы для интеграции с сайтом).

Для проверки используйте:

  • 🔹 Дебаггер (F9) — поставьте точку останова и проверьте значения переменных.
  • 🔹 Отчёт по дублям — после очистки запустите отчёт "Поиск дублей" (если он есть в вашей конфигурации).
  • 🔹 Экспорт в Excel — иногда ошибки очистки видны только при экспорте.

Если после очистки появились ошибки (например, "Недопустимое значение типа Строка"), проверьте:

🔴 Частая ошибка: после удаления всех пробелов слиплись слова, и длина строки превысила ограничение поля в базе (например, 250 символов для Наименование в справочнике). Решение — обрезать строку функцией Лев() или Сред().

FAQ: Частые вопросы по очистке строк в 1С

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

Используйте СтрЗаменить() с заменой пробела на пустую строку:

СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");

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

Результат = "";

Для Инд = 1 По СтрДлина(ИсходнаяСтрока) Цикл

Символ = Сред(ИсходнаяСтрока, Инд, 1);

Если НЕ (Символ = " " ИЛИ Символ = Символы.НПП ИЛИ Символ = Символы.Таб) Тогда

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Почему СокрЛП() не убирает пробелы в некоторых строках?

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

Если Найти(ИсходнаяСтрока, Символы.НПП) > 0 Тогда

Сообщить("Найден неразрывный пробел!");

КонецЕсли;

Решение — замените их на обычные пробелы перед применением СокрЛП().

Как очистить строки при импорте из Excel?

При импорте из Excel через ЗагрузкаДанныхИзТабличногоДокумента или COM-объект добавьте очистку на этапе чтения данных:

Для Каждого Строка Из ТабличныйДокумент Цикл

// Очищаем каждую ячейку

Для Инд = 1 По Строка.КоличествоКолонок Цикл

Строка.Колонки[Инд].Текст = СокрЛП(СтрЗаменить(Строка.Колонки[Инд].Текст, Символы.НПП, " "));

КонецЦикла;

КонецЦикла;

Для массового импорта используйте предварительную обработку в самом Excel (найти/заменить) или напишите скрипт на VBA.

Можно ли очистить строки без программирования?

Да, если ваша конфигурация поддерживает полнотекстовый поиск:

  1. Откройте список справочника (например, Номенклатура).
  2. Включите отображение колонки Наименование.
  3. Нажмите Ещё → Настроить список → Полнотекстовый поиск.
  4. Введите в поиск символ (пробел) — система покажет записи с пробелами в начале/конце.
  5. Выделите нужные строки и исправьте вручную.

Для ускорения используйте групповое редактирование (если оно поддерживается в вашей конфигурации).

Как очистить строки в отчётах или печатных формах?

В отчётах и печатных формах очистку строк удобно делать прямо в выражениях полей. Например, для поля НаименованиеКонтрагента в печатной форме:

СокрЛП(СтрЗаменить(Объект.Контрагент.Наименование, Символы.НПП, " "))

Если отчёт строится через СКД (система компоновки данных), добавьте очистку в вычисляемое поле:

  1. Откройте настройки схемы компоновки.
  2. Добавьте вычисляемое поле с формулой СокрЛП([Наименование]).
  3. Используйте это поле вместо оригинального.