diamond АШ Tlg

Как правильно загружать данные из файла MS Excel в управляемую форму 1С

Шпаргалка. Не требует установки MS Office, работает одинаково на Windows, Linux, MacOS

Неправильно: использовать для загрузки данных COMОбъект("Excel.Application"), добавлять на форму поле редактирования с именем файла, кнопку выбора файла и кнопку загрузки.

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

&НаКлиенте
Процедура Загрузить(Команда)

    // диалог выбора файла:

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл Excel";
    Диалог.Фильтр = "Excel|*.xlsx"; 
    Диалог.МножественныйВыбор = Ложь;
	
    Если Не Диалог.Выбрать() Тогда
        Возврат;
    КонецЕсли;
	
    // помещаем выбранный файл во временное хранилище, для передачи на сервер:

    ДвоичныеДанные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(
                ДвоичныеДанные,
                Новый УникальныйИдентификатор
    );
	
    // Загрузка файла на сервере, в ответ получаем массив структур
    // (мы на клиенте):

    Данные = ЗагрузитьДанные(Адрес);
	
    Если Данные = Неопределено Или Данные.Количество() = 0 Тогда
        ОбщегоНазначенияКлиент.СообщитьПользователю(
            "В файле отсутствуют данные для загрузки"
        );
        Возврат;	
    КонецЕсли;

    // здесь можно передать массив структур на сервер для дальнейшей
    // обработки, или показать пользователю на форме

КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗагрузитьДанные(Адрес)
	
    Результат = Новый Массив;
	
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx"); 
    ДвоичныеДанные.Записать(ИмяВременногоФайла);         
	
    // читаем данные Excel с помощью Табличного документа:

    ТабДок = Новый ТабличныйДокумент;
    Попытка
        ТабДок.Прочитать(ИмяВременногоФайла);		
    Исключение
        ОбщегоНазначения.СообщитьПользователю("Не удалось загрузить файл");
        УдалитьФайлы(ИмяВременногоФайла);
        Возврат Результат;
    КонецПопытки;
	
    УдалитьФайлы(ИмяВременногоФайла);	 
	
    // Запишем данные в массив структур (для тонкого клиента)

    КоличествоСтрок = ТабДок.ВысотаТаблицы;
    Для Сч = 1 По КоличествоСтрок Цикл
        СтрокаДанных = Новый Структура;
		
        // для примера, в колонке 1 содержится табельный номер:
        ТабельныйНомер = СокрЛП(ТабДок
            .ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0;") + "C1")
            .ТекущаяОбласть.Текст
        );
        СтрокаДанных.Вставить("ТабельныйНомер", ТабельныйНомер);
        Результат.Добавить(СтрокаДанных);		

    КонецЦикла;		
	
    Возврат Результат;
	
КонецФункции