При работе с данными в 1С программисты часто сталкиваются с ситуацией, когда стандартные функции очистки строк, такие как СокрЛП или СтрЗаменить, визуально не дают результата. Особенно часто это проявляется при загрузке данных из внешних источников (Excel, текстовые файлы) в таблицу значений. В этой статье мы подробно разберем, почему «пробелы» могут возвращаться на место, и как правильно очистить данные, чтобы они отображались корректно.
Проанализируем ситуацию, описанную в сообщениях форума. Программист пытается удалить пробелы из колонки КодТовара, но после выполнения кода пробелы остаются на месте. Главная причина здесь кроется не в ошибке алгоритма замены, а в автоматическом определении типов данных платформой 1С.
Когда вы используете ПостроительЗапроса для выгрузки данных из ТабличногоДокумента, система анализирует содержимое ячеек. Если в ячейках находятся только цифры, построитель автоматически назначает колонке таблицы значений тип Число. В 1С для числовых типов по умолчанию включен вывод разделителей групп разрядов (триад). Таким образом, даже если вы превратите строку "1 000" в число 1000, платформа при отображении снова добавит пробел между единицей и нулями для удобства чтения.
Если данные в колонке (например, артикул или код товара) не предназначены для математических вычислений, их правильнее хранить в строковом виде. Поскольку в уже созданной и заполненной таблице значений просто так изменить тип колонки нельзя, нам необходимо выполнить преобразование. Рассмотрим пошаговый алгоритм:
Строка.Посмотрим на пример кода, который решает эту задачу:
// Добавляем новую колонку с типом Строка
Таблица.Колонки.Добавить("КодТовараСтрока", Новый ОписаниеТипов("Строка"));
Для Каждого СтрокаТЗ Из Таблица Цикл
// Преобразуем число в строку без использования разделителей разрядов
СтрокаТЗ.КодТовараСтрока = Формат(СтрокаТЗ.КодТовара, "ЧГ=0");
КонецЦикла;
// Удаляем старую колонку и переименовываем новую
Таблица.Колонки.Удалить("КодТовара");
Таблица.Колонки.КодТовараСтрока.Имя = "КодТовара";
Если вам необходимо сохранить тип Число для расчетов, но вы хотите избавиться от пробелов при показе пользователю (например, в отчете или форме), следует использовать функцию Формат с параметром ЧГ=0 (Группировка разрядов = 0).
Рассмотрим, как это выглядит в коде:
РезультатТекст = Формат(ЧисловоеЗначение, "ЧГ=0");
// Теперь в переменной РезультатТекст будет строка "1000000" вместо "1 000 000"
Этот метод позволяет "обмануть" визуальное представление, не меняя сути самих данных.
Бывают случаи, когда тип колонки — Строка, но пробелы все равно не удаляются стандартным СтрЗаменить(Строка, " ", ""). Выясним причину: часто при копировании из веба или Excel в строку попадает не обычный пробел (код 32), а неразрывный пробел (NBSP, код 160) или его узкая версия (код 8239).
Для гарантированной очистки строки от всех видов пробельных символов, мы рекомендуем использовать следующий подход:
// Удаляем стандартный пробел и неразрывный пробел (Символы.НПП)
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, " ", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.НПП, "");
// Если пробелы все еще есть, проверим редкий символ Unicode 8239
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символ(8239), "");
Чтобы точно узнать, какой именно символ мешает вам в работе, воспользуйтесь функцией КодСимвола в отладчике. Проанализируем первый символ проблемной строки:
КодСимвола(Строка.КодТовара, 1)
Если в строке могут присутствовать табуляции, переносы строк и другие невидимые знаки, удобно использовать регулярные выражения. Это наиболее мощный инструмент для очистки текстовых данных.
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.MultiLine = Истина;
РегВыражение.IgnoreCase = Истина;
// Шаблон \s находит любой пробельный символ (пробел, табуляция, возврат каретки)
РегВыражение.Pattern = "\s";
Для Каждого Строка Из Таблица Цикл
Строка.КодТовара = РегВыражение.Replace(Строка.КодТовара, "");
КонецЦикла;
Подводя итог, можно сказать: прежде чем применять функции СтрЗаменить, всегда проверяйте тип данных в колонке таблицы значений. Если тип числовой — боритесь с форматом вывода. Если строковый — ищите скрытые символы Unicode. Совместное использование этих знаний позволит вам избежать ошибок при импорте данных и обеспечит корректную работу ваших алгоритмов поиска и сопоставления товаров.