Как правильно загружать данные из файла MS Excel в управляемую форму 1С
Шпаргалка. Не требует установки MS Office, работает одинаково на Windows, Linux, MacOS
Неправильно: использовать для загрузки данных COMОбъект("Excel.Application"), добавлять на форму поле редактирования с именем файла, кнопку выбора файла и кнопку загрузки.
Правильно: использовать для загрузки ТабличныйДокумент, стартовать загрузку сразу после диалога выбора файла без лишних действий.
&НаКлиенте
Процедура Загрузить(Команда)
// диалог выбора файла:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл Excel";
Диалог.Фильтр = "Excel|*.xlsx";
Диалог.МножественныйВыбор = Ложь;
Если Не Диалог.Выбрать() Тогда
Возврат;
КонецЕсли;
// помещаем выбранный файл во временное хранилище, для передачи на сервер:
ДвоичныеДанные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(
ДвоичныеДанные,
Новый УникальныйИдентификатор
);
// Загрузка файла на сервере, в ответ получаем массив структур
// (мы на клиенте):
Данные = ЗагрузитьДанные(Адрес);
Если Данные = Неопределено Или Данные.Количество() = 0 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(
"В файле отсутствуют данные для загрузки"
);
Возврат;
КонецЕсли;
// здесь можно передать массив структур на сервер для дальнейшей
// обработки, или показать пользователю на форме
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗагрузитьДанные(Адрес)
Результат = Новый Массив;
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// читаем данные Excel с помощью Табличного документа:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ИмяВременногоФайла);
Исключение
ОбщегоНазначения.СообщитьПользователю("Не удалось загрузить файл");
УдалитьФайлы(ИмяВременногоФайла);
Возврат Результат;
КонецПопытки;
УдалитьФайлы(ИмяВременногоФайла);
// Запишем данные в массив структур (для тонкого клиента)
КоличествоСтрок = ТабДок.ВысотаТаблицы;
Для Сч = 1 По КоличествоСтрок Цикл
СтрокаДанных = Новый Структура;
// для примера, в колонке 1 содержится табельный номер:
ТабельныйНомер = СокрЛП(ТабДок
.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0;") + "C1")
.ТекущаяОбласть.Текст
);
СтрокаДанных.Вставить("ТабельныйНомер", ТабельныйНомер);
Результат.Добавить(СтрокаДанных);
КонецЦикла;
Возврат Результат;
КонецФункции