При разработке обработок загрузки данных из файлов Excel в документы или справочники 1С разработчики часто сталкиваются с ситуацией, когда в первых строках таблицы расположены заголовки, название отчета или пустые поля. Если считывать документ с первой строки, строковые заголовки попадают в числовые реквизиты, вызывая ошибки приведения типов или сбивая структуру загружаемой таблицы значений.
Разберем подробно, как правильно организовать чтение файла Excel с нужной строки, избежать типичных ошибок при обходе строк и корректно обработать числовые суммы с форматированием.
Рассмотрим основные причины, из-за которых возникают сложности при чтении данных из файлов Excel через ТабличныйДокумент:
ТабличныйДокумент нумерация строк и колонок начинается с единицы. Свойство ВысотаТаблицы возвращает точное количество строк. Если написать условие вида Для Сч = 4 По ТабДок.ВысотаТаблицы - 1, последняя строка с данными не будет обработана.Число() падает с ошибкой преобразования.ВысотаТаблицы оказывается больше фактического количества заполненных строк.Для универсальной и кроссплатформенной загрузки (работающей как на Windows, так и на Linux серверах без установки Microsoft Excel) используем встроенные возможности объекта ТабличныйДокумент.
Разберем реализацию по шагам:
ТабличныйДокумент с явным указанием способа чтения значений.Посмотрим на пример процедуры чтения файла, сохраненного во временный файл на сервере:
&НаСервере
Процедура ЗагрузитьДанныеИзФайлаНаСервере(ИмяВременногоФайла, ДокументОбъект)
ТабДок = Новый ТабличныйДокумент;
// Читаем файл Excel с типизацией значений
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ТабЧасть = ДокументОбъект.Начисления;
ТабЧасть.Очистить();
ВсегоСтрок = ТабДок.ВысотаТаблицы;
// Начинаем обход с 3-й строки, пропуская шапку
Для НомерСтроки = 3 По ВсегоСтрок Цикл
ТекстСотрудника = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
ЗначениеСуммы = ТабДок.Область(НомерСтроки, 2).Значение;
// Пропускаем пустые строки, которые могли попасть из-за форматирования в Excel
Если ПустаяСтрока(ТекстСотрудника) И (ЗначениеСуммы = Неопределено Или ЗначениеСуммы = 0) Тогда
Продолжить;
КонецЕсли;
// Преобразуем сумму к числовому типу
СуммаЧислом = 0;
Если ТипЗнч(ЗначениеСуммы) = Тип("Строка") Тогда
СуммаЧислом = ПреобразоватьСтрокуВЧисло(ЗначениеСуммы);
ИначеЕсли ЗначениеСуммы <> Неопределено Тогда
СуммаЧислом = Число(ЗначениеСуммы);
КонецЕсли;
// Добавляем строку в табличную часть
НоваяСтрока = ТабЧасть.Добавить();
НоваяСтрока.Сотрудник = ТекстСотрудника;
НоваяСтрока.Сумма = СуммаЧислом;
КонецЦикла;
КонецПроцедуры
Выясним, как правильно обработать ячейки, которые прочитались как текст из-за пробелов-разделителей или нестандартных знаков разделителя дроби. Создадим вспомогательную функцию:
&НаСервере
Функция ПреобразоватьСтрокуВЧисло(Знач ИсходныйТекст)
// Удаляем неразрывные пробелы (код 160) и стандартные пробелы
ТекстЧисла = СтрЗаменить(ИсходныйТекст, Символы.НПП, "");
ТекстЧисла = СтрЗаменить(ТекстЧисла, " ", "");
// Приводим разделитель дробной части к стандартной точке
ТекстЧисла = СтрЗаменить(ТекстЧисла, ",", ".");
Попытка
Возврат Число(ТекстЧисла);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
При работе с загрузкой из внешних файлов обратите внимание на следующие нюансы:
СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет сразу получать даты и числа в соответствующих типах платформы 1С, если ячейки Excel были отформатированы штатно.УдалитьФайлы(), чтобы не засорять дисковое пространство сервера.Справочники.Сотрудники.НайтиПоНаименованию()).