При разработке внешних обработок для загрузки данных (например, из Excel или CSV) одной из самых распространенных задач является сопоставление номенклатуры по коду или артикулу. Часто программисты сталкиваются с тем, что визуально одинаковые коды не сопоставляются. Причина кроется в «невидимых» символах — пробелах, которые платформа 1С добавляет для удобства чтения чисел. Если тип данных в колонке — строка, обычные методы удаления пробелов могут не сработать. Разберем подробно, как решить эту проблему.
Рассмотрим ситуацию: у нас есть артикул, который выглядит как 911 000 733. Мы пытаемся применить стандартную функцию СтрЗаменить, используя обычный пробел, введенный с клавиатуры:
Строка.Код = СтрЗаменить(Строка.Код, " ", "");
Проанализируем, почему этот код часто не дает результата. Дело в том, что в 1С существует два типа символов, которые выглядят как пустое пространство:
Символы.НПП.Когда 1С автоматически преобразует число в строку (например, при выводе в таблицу или при неявном приведении типов), она использует именно неразрывный пробел для разделения групп разрядов (тысяч). Поскольку функция СтрЗаменить ищет точное соответствие символа, обычный пробел (код 32) просто не находит неразрывный пробел (код 160).
Если вы столкнулись с тем, что артикулы в вашей таблице содержат пробелы после загрузки или преобразования, самым верным способом будет использование системной константы Символы.НПП. Выясним, как это выглядит в коде:
// Удаляем неразрывные пробелы, которые 1С использует для разделения разрядов
Строка.Код = СтрЗаменить(Строка.Код, Символы.НПП, "");
Это решение является наиболее частым и эффективным. Как только мы заменяем Символы.НПП на пустую строку, все лишние разделители исчезают, и артикул принимает вид 911000733, что позволяет успешно найти товар в справочнике.
Посмотрим на ситуацию шире: данные могут поступать из разных источников. В одной строке может оказаться и обычный пробел, и неразрывный. Чтобы гарантированно очистить артикул, рекомендуется использовать последовательную замену обоих символов. Проанализируем пример универсальной функции:
// Очистка от всех видов пробелов
Результат = СтрЗаменить(Строка.Код, Символы.НПП, "");
Результат = СтрЗаменить(Результат, " ", "");
Строка.Код = Результат;
Для более современных версий платформы (8.3.10 и выше) можно применить метод «разрезания» и «склейки» строки. Это более элегантный способ, если нужно убрать сразу несколько различных символов-разделителей:
// Укажем все подозрительные символы в строке разделителей
Разделители = " " + Символы.НПП + Символы.Таб;
ЧастиСтроки = СтрРазделить(ИсходнаяСтрока, Разделители, Ложь);
Результат = СтрСоединить(ЧастиСтроки, "");
Методически правильным подходом при работе с числами, которые нужно превратить в строку без пробелов, является использование функции Формат(). Однако здесь есть важный нюанс, который мы должны разобрать.
Функция Формат() работает только с числовым типом данных. Если в вашей колонке уже находится строка с пробелами, Формат() не поможет. Но если данные еще являются числом, используйте параметр ЧГ=0 (ЧГ — это группировка разрядов):
// ЧГ=0 означает "не группировать разряды"
Строка.Код = Формат(ЧисловойАртикул, "ЧГ=0");
Будьте осторожны: если ваш артикул может содержать буквы (например, "ABC-123"), попытка преобразовать его сначала в число, а потом применить формат, приведет к ошибке или потере данных. Этот метод хорош только для чисто цифровых кодов.
Иногда пробелы мешают только визуально, и их не нужно удалять программно для поиска. В этом случае мы можем настроить свойства самой колонки на форме или в табличном документе. Рассмотрим, как это сделать в свойствах элемента:
После этого 1С перестанет визуально разделять число пробелами при отображении пользователю, хотя само значение в памяти останется числом.
При выполнении поиска номенклатуры (например, через Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ...)) крайне важно понимать, что для системы строки "911000" и "911 000" — это два абсолютно разных значения. При загрузке из внешних систем (особенно из Excel) всегда полезно выполнять предварительную «нормализацию» строк:
Символы.НПП).СокрЛП().Использование связки СтрЗаменить(Текст, Символы.НПП, "") — это проверенный и надежный способ избежать ошибок сопоставления, связанных со спецификой работы платформы 1С с числами и строками.