При интеграции 1С с внешними источниками данных, особенно с таблицами Excel, разработчики часто сталкиваются с ситуацией, когда данные загружаются корректно до определенного порога, а затем начинают «исчезать» или обнуляться. Типичный пример — числовые значения свыше 999 (т.е. от 1000 и выше) перестают записываться в документ или справочник. В этой статье мы разберем, почему это происходит, и как правильно обработать входящие данные, чтобы избежать подобных ошибок.
Главная причина, по которой числа больше 1000 «ломают» загрузку, заключается в автоматическом форматировании Excel. Для удобства пользователя Excel часто отображает число 1000 как «1 000». Этот пробел между единицей и нулями на самом деле может быть не обычным пробелом, а неразрывным пробелом (НПП) с кодом 160. Проанализируем ситуацию: когда 1С считывает такую ячейку как текст, функция Число() или механизм автоматического приведения типов не может распознать строку «1 000» как валидное число из-за этого скрытого символа.
Чтобы код был качественным, стоит использовать статический анализатор кода проектов, а пока рассмотрим стандартный, но не всегда достаточный способ очистки:
Кол = СтрЗаменить(Кол, Символы.НПП, "");
// Пытаемся удалить только неразрывный пробел
Проблема здесь в том, что в строке могут присутствовать и другие символы: обычные пробелы (код 32), узкие неразрывные пробелы или даже знаки валют. Если мы удалим только Символы.НПП, но оставим обычный пробел, система все равно не сможет преобразовать строку в число. Выясним причину: 1С ожидает чистую последовательность цифр (и, возможно, десятичный разделитель), а любые другие знаки приводят к тому, что результат преобразования становится равен 0.
Если вы создаете свой шаблон обработки загрузки и используете COM-соединение (Excel.Application), крайне важно обратить внимание на то, какое именно свойство ячейки вы запрашиваете. Посмотрим на разницу:
Практический совет: всегда старайтесь использовать .Value. Это избавит вас от необходимости писать громоздкие функции по очистке строк от пробелов.
Иногда проблема кроется не в коде загрузки, а в настройках базы. Если вы загружаете данные в реквизит или выполняете загрузку доп. реквизитов, проверьте их свойства в Конфигураторе:
Разберем по шагам, как написать универсальную функцию для извлечения числа из «грязной» строки Excel. Мы рекомендуем использовать метод разделения и соединения строки, чтобы гарантированно избавиться от всех видов пробельных символов одновременно.
Рассмотрим пример надежного кода:
// Функция очищает строку от всех видов пробелов и преобразует в число
Функция ОчиститьИПреобразоватьВЧисло(ЗначениеИзExcel)
// 1. Убираем все виды пробелов (обычный, неразрывный, табуляция, переносы)
ЧистаяСтрока = СтрЗаменить(ЗначениеИзExcel, Символы.НПП, "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.Таб, "");
// 2. Дополнительно можно использовать СтрРазделить для надежности
МассивЧастей = СтрРазделить(ЧистаяСтрока, Символы.ПС + Символы.ВК + Символы.НПП + " ", Ложь);
ЧистаяСтрока = СтрСоединить(МассивЧастей, "");
// 3. Заменяем точку на запятую (зависит от региональных настроек 1С)
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ".", ",");
Попытка
Возврат Число(ЧистаяСтрока);
Исключение
Возврат 0; // Или обработка ошибки
КонецПопытки;
КонецФункции
Проанализируем ситуацию с разделителем дробной части. В разных странах используются разные стандарты: в США это точка (1000.50), в России — запятая (1000,50). Если ваш Excel сформирован в одной локали, а сервер 1С работает в другой, функция Число() может выдать ошибку даже при отсутствии пробелов. Перед загрузкой убедитесь, какой символ используется в качестве разделителя, и приведите его к стандарту вашей базы данных с помощью СтрЗаменить().
Если вы загружаете данные без установленного Excel, используя провайдеры типа Microsoft.ACE.OLEDB, помните об одной особенности: драйвер определяет типы данных колонки по первым нескольким строкам (обычно 8). Если в начале таблицы идут маленькие числа или пустые ячейки, драйвер может «решить», что в колонке хранятся короткие целые числа. Когда дело дойдет до чисел больше 1000 или длинных строк, данные могут быть просто проигнорированы. Чтобы этого избежать, старайтесь, чтобы в первых строках файла Excel были максимально полные и длинные данные, либо настраивайте строку подключения с параметром IMEX=1.
Подведем итог. Чтобы ваша загрузка из Excel работала стабильно для любых чисел, необходимо:
.Value при чтении ячеек через COM.Символы.НПП, но и от обычных пробелов.Применяя эти методы, мы обеспечим надежную работу системы и исключим потерю данных при масштабировании значений.