Как эффективно удалить пробелы в конце наименования или строки в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Стандартные функции платформы для обрезки пробелов

Самый простой и правильный путь в 1С — использование встроенных функций сокращения строк. Платформа предоставляет три основные функции, которые решают 99% задач по очистке текста:

  1. СокрП (Текст) — удаляет все пробелы только в правой части строки (в конце).
  2. СокрЛ (Текст) — удаляет все пробелы только в левой части строки (в начале).
  3. СокрЛП (Текст) — универсальная функция, которая очищает строку с обеих сторон одновременно.

Проанализируем пример использования СокрП для очистки наименования:


// Пример удаления пробелов только справа
Наименование = "Товар №123    ";
НаименованиеБезПробелов = СокрП(Наименование);
// Результат: "Товар №123"

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

Ручной алгоритм удаления пробелов через цикл

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


// Пример ручного удаления символов пробела в конце строки
Пока Прав(Наименование, 1) = " " Цикл
    Наименование = Лев(Наименование, СтрДлина(Наименование) - 1);    
КонецЦикла;

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

Борьба с «невидимыми» и проблемными символами

Бывают случаи, когда вы применили СокрЛП, но визуально пробелы остались или строка ведет себя странно при сравнении. Это происходит из-за наличия специфических символов Юникода, которые выглядят как пустота, но не входят в стандартный список очистки функции Сокр.

Выясним причину такого поведения. К «проблемным» символам относятся:

Если вы столкнулись с такой ситуацией, необходимо использовать функцию СтрЗаменить в сочетании с функцией Символ. Рассмотрим пример очистки строки от неразрывного пробела и мягкого переноса:


// Удаляем специфические символы перед финальной обрезкой
Текст = СтрЗаменить(Текст, Символ(160), " "); // Заменяем неразрывный на обычный
Текст = СтрЗаменить(Текст, Символ(173), "");  // Удаляем мягкий перенос
Текст = СокрЛП(Текст);                        // Итоговая очистка

Использование регулярных выражений

Для продвинутых задач, когда нужно удалить любые типы пробельных символов (включая все варианты Юникода) строго в конце текста, эффективнее всего использовать регулярные выражения. Начиная с версии платформы 8.3.24, в 1С появилась встроенная поддержка регулярных выражений в функциях работы со строками.

Посмотрим на пример удаления всех пробельных символов в конце строки с помощью встроенных средств:


// Использование регулярных выражений (доступно с 8.3.24)
// Паттерн \s+$ означает "один или более пробельных символов в конце строки"
Результат = СтрЗаменить(Наименование, "\s+$", "", , Истина);

Если же ваша база работает на более старой версии платформы, мы можем воспользоваться объектом VBScript.RegExp через COM-соединение (только для Windows-клиентов):


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "\s+$";
RegExp.Multiline = Ложь;
Наименование = RegExp.Replace(Наименование, "");

Влияние свойств метаданных на длину строки

Иногда программисты сталкиваются с тем, что пробелы в конце наименования появляются снова сразу после записи объекта в базу данных. Разберем, почему так происходит.

Проанализируем свойство реквизита «Допустимая длина» в конфигураторе:

  1. Переменная: Платформа автоматически обрезает концевые пробелы при сохранении в базу данных. Это рекомендуемый режим для большинства справочников.
  2. Фиксированная: В этом случае 1С всегда дополняет строку пробелами до указанной максимальной длины. Если длина наименования 100 символов, а вы ввели «Товар», система допишет еще 95 пробелов. В такой ситуации использование СокрП в коде даст эффект только в оперативной памяти, но при записи в СУБД пробелы вернутся.

Совет: Если вам мешают пробелы в конце, убедитесь, что в свойствах реквизита установлено значение «Переменная».

Массовая очистка данных в существующей базе

Если вы обнаружили, что в справочнике «Номенклатура» уже накопились тысячи записей с лишними пробелами, не обязательно писать сложную обработку. Проанализируем ситуацию и воспользуемся инструментом «Групповое изменение реквизитов» (входит в состав БСП):

  1. Откройте обработку «Групповое изменение реквизитов».
  2. Выберите нужный справочник (например, Номенклатура).
  3. Перейдите в «Дополнительные параметры» и разрешите изменение служебных реквизитов.
  4. Найдите поле «Наименование».
  5. В колонке «Новое значение» выберите «Выполнить произвольный алгоритм» (если доступно в вашей версии) или используйте возможность формул: СокрЛП(Объект.Наименование).

Таким образом, мы рассмотрели полный спектр инструментов для работы с пробелами в 1С. Помните, что использование СокрЛП является «золотым стандартом» разработки, а к регулярным выражениям или ручному перебору стоит прибегать только в нестандартных случаях.

← На главную