При разработке и использовании обработок загрузки номенклатуры из прайс-листов Excel в конфигурации 1С (в частности, «Управление торговлей 10.3») разработчики часто сталкиваются с неожиданным поведением: артикул, выглядящий в файле как сплошная последовательность цифр (например, 2536), при загрузке в базу превращается в строку с разделителем (2 536). При этом простая замена всех пробелов через функцию СтрЗаменить() не подходит, так как в номенклатурной базе могут присутствовать сложные артикулы, где пробелы являются частью наименования или шифра производителя.
Разберем подробнее механизм возникновения этой ошибки, выясним техническую причину появления нежелательных символов и рассмотрим надежные способы решения задачи как со стороны программного кода 1С, так и со стороны подготовки файла Excel.
Проанализируем ситуацию: визуально в ячейке таблицы отображается число 2536, однако при программном считывании оно превращается в 2 536. На самом деле символ между цифрами — это не стандартный пробел, а неразрывный пробел (код символа 160, в терминах платформы 1С — Символы.НПП). Выделим две главные причины, почему это происходит:
Ячейка.Text, приложение возвращает не «сырое» значение, а визуальное представление с учетом форматирования ячейки и региональных настроек операционной системы. Если ячейка имеет числовой формат, Excel автоматически подставляет разделитель триад.Ячейка.Value, Excel возвращает значение типа Число. Когда в коде 1С выполняется операция неявного или явного приведения числа к строке без маски формата (например, Строка(ЗначениеИзФайла) или "" + ЗначениеИзФайла), платформа применяет стандартное системное форматирование. По умолчанию для чисел от 1000 и выше 1С разделяет разряды неразрывным пробелом.Именно поэтому двойной клик по ячейке в Excel помогал автору: при ручном редактировании ячейки с предварительно назначенным текстовым форматом Excel принудительно переключает внутренний тип данных ячейки в строку, отключая числовое форматирование.
Посмотрим на самое надежное программное решение. Нам не нужно удалять пробелы из всех строк подряд — достаточно проверить тип данных, полученный из ячейки. Если из Excel пришло число, мы преобразуем его в строку с явным отключением группировки разрядов с помощью параметра ЧГ=0 функции Формат(). Если же из ячейки получена строка, мы сохраняем ее исходные пробелы, удаляя только неразрывные разделители разрядов при необходимости.
Рассмотрим пример правильной обработки значения ячейки:
Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
// Отключаем группировку триад: число 2536 останется строкой "2536"
АртикулСтрокой = Формат(ЗначениеЯчейки, "ЧГ=0");
Иначе
// Если это исходно текст, сохраняем пользовательские пробелы
АртикулСтрокой = СокрЛП(ЗначениеЯчейки);
КонецЕсли;
Если чтение выполняется через интерфейс COMОбъект("Excel.Application"), важно напрямую обращаться к свойству Value, а не Text:
ЗначениеЯчейки = ЛистExcel.Cells(НомерСтроки, НомерКолонки).Value;
Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
Артикул = Формат(ЗначениеЯчейки, "ЧГ=0");
Иначе
// Заменяем только неразрывные пробелы, оставляя обычные нетронутыми
Артикул = СокрЛП(СтрЗаменить(Строка(ЗначениеЯчейки), Символы.НПП, ""));
КонецЕсли;
Такой подход полностью снимает противоречие: обычные пробелы в строковых артикулах сохраняются, а числовые артикулы загружаются без разделителей разрядов.
Если в алгоритме обработки принципиально используется текстовое представление ячеек, можно программно переопределить формат всего столбца перед чтением данных из файла. Для этого перед циклом обхода строк выполним команду:
ЛистExcel.Columns(НомерКолонкиАртикула).NumberFormat = "@";
Символ "@" задает текстовый формат отображения для всего диапазона ячеек, предотвращая автоматическую группировку разрядов при обращении к свойствам ячеек.
Если дорабатывать программный код конфигурации нет возможности, исправим файл штатными средствами табличного процессора. Как отмечалось в обсуждении, простая смена формата ячейки через меню «Формат ячеек» на «Текстовый» не меняет тип уже записанного значения, пока в ячейку не зайдут двойным щелчком. Чтобы пакетно перевести весь столбец в строковый вид за один шаг, используем специальный инструмент:
После выполнения этой операции Excel принудительно переведет каждое значение в столбце в истинный текстовый формат, уберет скрытые разделители разрядов и предотвратит появление лишних пробелов при последующей загрузке в 1С.