Почему при загрузке артикулов из Excel в 1С появляются лишние пробелы и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При разработке и использовании обработок загрузки номенклатуры из прайс-листов Excel в конфигурации 1С (в частности, «Управление торговлей 10.3») разработчики часто сталкиваются с неожиданным поведением: артикул, выглядящий в файле как сплошная последовательность цифр (например, 2536), при загрузке в базу превращается в строку с разделителем (2 536). При этом простая замена всех пробелов через функцию СтрЗаменить() не подходит, так как в номенклатурной базе могут присутствовать сложные артикулы, где пробелы являются частью наименования или шифра производителя.

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

В чем причина появления пробелов при чтении данных

Проанализируем ситуацию: визуально в ячейке таблицы отображается число 2536, однако при программном считывании оно превращается в 2 536. На самом деле символ между цифрами — это не стандартный пробел, а неразрывный пробел (код символа 160, в терминах платформы 1С — Символы.НПП). Выделим две главные причины, почему это происходит:

  1. Чтение свойства Text вместо Value при работе через COM-объект. Если при программном обращении к ячейке листа Excel используется свойство Ячейка.Text, приложение возвращает не «сырое» значение, а визуальное представление с учетом форматирования ячейки и региональных настроек операционной системы. Если ячейка имеет числовой формат, Excel автоматически подставляет разделитель триад.
  2. Неявное строковое приведение чисел платформой 1С. Если ячейка считывается через свойство Ячейка.Value, Excel возвращает значение типа Число. Когда в коде 1С выполняется операция неявного или явного приведения числа к строке без маски формата (например, Строка(ЗначениеИзФайла) или "" + ЗначениеИзФайла), платформа применяет стандартное системное форматирование. По умолчанию для чисел от 1000 и выше 1С разделяет разряды неразрывным пробелом.

Именно поэтому двойной клик по ячейке в Excel помогал автору: при ручном редактировании ячейки с предварительно назначенным текстовым форматом Excel принудительно переключает внутренний тип данных ячейки в строку, отключая числовое форматирование.

Решение 1. Раздельная обработка типов данных в коде 1С

Посмотрим на самое надежное программное решение. Нам не нужно удалять пробелы из всех строк подряд — достаточно проверить тип данных, полученный из ячейки. Если из Excel пришло число, мы преобразуем его в строку с явным отключением группировки разрядов с помощью параметра ЧГ=0 функции Формат(). Если же из ячейки получена строка, мы сохраняем ее исходные пробелы, удаляя только неразрывные разделители разрядов при необходимости.

Рассмотрим пример правильной обработки значения ячейки:


Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
    // Отключаем группировку триад: число 2536 останется строкой "2536"
    АртикулСтрокой = Формат(ЗначениеЯчейки, "ЧГ=0");
Иначе
    // Если это исходно текст, сохраняем пользовательские пробелы
    АртикулСтрокой = СокрЛП(ЗначениеЯчейки);
КонецЕсли;

Если чтение выполняется через интерфейс COMОбъект("Excel.Application"), важно напрямую обращаться к свойству Value, а не Text:


ЗначениеЯчейки = ЛистExcel.Cells(НомерСтроки, НомерКолонки).Value;
Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
    Артикул = Формат(ЗначениеЯчейки, "ЧГ=0");
Иначе
    // Заменяем только неразрывные пробелы, оставляя обычные нетронутыми
    Артикул = СокрЛП(СтрЗаменить(Строка(ЗначениеЯчейки), Символы.НПП, ""));
КонецЕсли;

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

Решение 2. Программное назначение текстового формата колонке

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

ЛистExcel.Columns(НомерКолонкиАртикула).NumberFormat = "@";

Символ "@" задает текстовый формат отображения для всего диапазона ячеек, предотвращая автоматическую группировку разрядов при обращении к свойствам ячеек.

Решение 3. Пакетное преобразование данных в самом Excel (без макросов и ручных кликов)

Если дорабатывать программный код конфигурации нет возможности, исправим файл штатными средствами табличного процессора. Как отмечалось в обсуждении, простая смена формата ячейки через меню «Формат ячеек» на «Текстовый» не меняет тип уже записанного значения, пока в ячейку не зайдут двойным щелчком. Чтобы пакетно перевести весь столбец в строковый вид за один шаг, используем специальный инструмент:

  1. Выделим столбец с артикулами в таблице Excel.
  2. Перейдем на вкладку Данные и нажмем кнопку Текст по столбцам.
  3. На первом шаге мастера оставим переключатель «с разделителями» и нажмем Далее.
  4. На втором шаге снимем все флажки разделителей и снова нажмем Далее.
  5. На третьем шаге («Формат данных столбца») выберем вариант Текстовый и нажмем кнопку Готово.

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

← На главную