Часто необходимо сделать загрузку из Excel по далеко не универсальному файлу заказчика. Для таких задач написала вот такую обработку/заготовку.
Обработка на основании файла excel с одного листа создает таблицу и дерево (вкладки табличной части обработки).
В обработке указываем файл excel, затем в настройках указываем строку, с которой будет начинаться загрузка, имя листа и колонку группировки (на основании этой колонки будет формироваться иерархия дерева значений).
После этого заполняем таблицу, где указываем имена колонок без пробелов и номера этих колонок.
Далее нажимаем кнопку Обновить, и создается таблица и дерево с данными
Информация по коду:
Для создания таблицы значений используется построитель отчета. Это увеличивает быстродействие, т.к. не идет обхода по строкам таблицы в файле.
ОбластьЯчеек = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
СоответствиеНомераИмени = ПараметрыЛиста.Колонки;
Для НомерКолонки = 1 По ПоследняяКолонка Цикл
Если СоответствиеНомераИмени.НайтиПоЗначению(НомерКолонки) <> Неопределено Тогда
Имя = СоответствиеНомераИмени.НайтиПоЗначению(НомерКолонки).Представление;
Колонка = ТабЗначений.Колонки.Получить(НомерКолонки - 1);
Колонка.Имя = Имя;
КонецЕсли;
КонецЦикла;
Далее созданная таблица передается в запрос, где отсекаются пустые строки и создается два пакета, один для данных таблицы, а другой иерархический для дерева значений.
После идет программное создание реквизитов таблицы и дерева, а также элементов формы.
Код для создания дерева:
ДеревоПрограмно = Пакеты[2].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
МассивТипаВыбора = Новый Массив;
МассивТипаВыбора.Добавить(Тип("ДеревоЗначений"));
ОписаниеТипаВыбора = Новый ОписаниеТипов(МассивТипаВыбора);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы("ТаблицаДерево", ОписаниеТипаВыбора, "", "Дерево"));
Для Каждого Колонка Из ДеревоПрограмно.Колонки Цикл
МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаДерево"));
КонецЦикла;
ИзменитьРеквизиты(МассивРеквизитов);
СписокУдаляемыхЭлементов.Добавить("ТаблицаДерево");
ЭлементРодитель = Элементы.СтраницаДерево;
ТаблицаДерево= Элементы.Добавить("ТаблицаДерево", Тип("ТаблицаФормы"), ЭлементРодитель);
ТаблицаДерево.ПутьКДанным = "ТаблицаДерево";
ТаблицаДерево.Отображение = ОтображениеТаблицы.Дерево;
СписокУдаляемыхЭлементов.Добавить("ТаблицаДерево");
Для Каждого Колонка Из ДеревоПрограмно.Колонки Цикл
СписокУдаляемыхЭлементов.Добавить("Дерево" + Колонка.Имя);
НовыйЭлемент = Элементы.Добавить("Дерево" + Колонка.Имя, Тип("ПолеФормы"), ТаблицаДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ТаблицаДерево." + Колонка.Имя;
//НовыйЭлемент.Ширина = 10;
КонецЦикла;
ЗначениеВРеквизитФормы(ДеревоПрограмно, "ТаблицаДерево");
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.16.101