Информация на уникальность или новизну не претендует. В первую очередь пишу для себя, чтоб в случае чего можно было зайти и скопипастить готовый кусочек кода.
ВыгрузкаДля выгрузки данных в файл Excel нам поможет процедура, типа следующей:
Процедура Выгрузить()
ТзПодразделенийОрганизации = ПолучитьТзПодразделенийОрганизации();
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Книга = Эксель.WorkBooks.Add();
Лист = Книга.WorkSheets(1);
Лист = Книга.Sheets.Add();
НомерСтроки = 1;
Для Каждого Строка ИЗ ТзПодразделенийОрганизации Цикл
Лист.Cells(НомерСтроки, 1).Value = Строка.Код;
Лист.Cells(НомерСтроки, 2).Value = Строка.Наименование;
Лист.Cells(НомерСтроки, 3).Value = Строка.Владелец;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
КонецПопытки;
Эксель.Application.Quit();
КонецПроцедуры
В ней имеется таблица значений
ТзПодразделенийОрганизации, которая состоит из 3 колонок: Код, Наименование и Владелец. Кроме этого где-то (в моем случае это элемент формы) должна присутствовать переменная
ПутьКФайлу, которая содержит полный путь к файлу, т.е. должна иметь приблизительно такой вид вид:
ПутьКФайлу = "C:\MyFile.xlsx";
Стоит ещё отметить, что если файл уже существует, то вылезет "подтверждающее" окошко, которое спросит о том заменить ли существующий файл. Поэтому, если выгрузка происходит не интерактивно, то
обязательно проверьте, что файла такого не существует. А если он существует, то или сохраните в другое место или удалите существующий файл
.
ЗагрузкаДля загрузки используем такую процедуру
Процедура Загрузить()
Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда
Предупреждение("Файл не выбран!");
Возврат;
КонецЕсли;
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
Лист = Книга.WorkSheets(1);
СчитанныйФайл = ПрочитатьЛистExcel(, Лист, 1);
Эксель.Quit();
КонецПроцедуры
Здесь мы тоже встречаем переменную
ПутьКФайлу. Содержит она в себе то же самое, что и в случае выгрузки. Внимательный читатель
может заметить заметит, что в приведенной выше процедуре вызывается функция
ПрочитатьЛистExcel. Так вот это не встроенная в 1С функция, а отсюда следует, что надо бы её описать. Данная функция может быть в двух вариантах. Один вариант я взял с [необходимо зарегистрироваться для просмотра ссылки]:
Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт
Если ЛистЭксель = Неопределено Тогда
ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
КонецЕсли;
Если ВсегоСтрок = 0 Тогда
ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
КонецЕсли;
Если ВсегоКолонок = 0 Тогда
ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
КонецЕсли;
Если ТЗ = Неопределено Тогда
ТЗ = Новый ТаблицаЗначений;
Для Счетчик = 1 По ВсегоКолонок Цикл
ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
КонецЦикла;
КонецЕсли;
Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
КонецЦикла;
Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();
Для Счетчик = 0 По ВсегоКолонок-1 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;
ЛистЭксель = Неопределено;
Возврат ТЗ;
КонецФункции
Функция рабочая и можно её легко использовать. Но в моем случае она отрабатывала немножко не так, как надо было и немножко модифицировав её я достиг нужного результата:
Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт
Если ЛистЭксель = Неопределено Тогда
ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
КонецЕсли;
Если ВсегоСтрок = 0 Тогда
ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
КонецЕсли;
Если ВсегоКолонок = 0 Тогда
ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
КонецЕсли;
Если ТЗ = Неопределено Тогда
ТЗ = Новый ТаблицаЗначений;
Для Счетчик = 1 По ВсегоКолонок Цикл
ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
КонецЦикла;
КонецЕсли;
Для СчетчикСтрок = НомерПервойСтроки По ВсегоСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
Для СчетчикКолонок = 1 По ВсегоКолонок Цикл
НоваяСтрока[СчетчикКолонок - 1] = ЛистЭксель.Cells(СчетчикСтрок, СчетчикКолонок).Value;
КонецЦикла;
КонецЦикла;
ЛистЭксель = Неопределено;
Возврат ТЗ;
КонецФункции
Если не ошибаюсь, то первый вариант (оригинал) работает быстрее. Но часто это не критично, поэтому можете использовать тот или иной вариант.
У меня всё, спасибо за внимание