Имя: Пароль:
1C
1С v8
excel COM objects
0 YurAnt
 
06.03.13
14:39
Доброго времени суток, господа - форумчане.
Итак, ситуация следующая.
Имеется excel-файл в к-м несколько листов, к-е могут содержать инфу: от четко-структурированной (той что необходима для чтения), до полной ахинеи (а ля просто пометки бухгалтера)
есть обработка к-я делает следующее:
1) По тыку на кнопку выгружает ком.объект и формирует из листов екзеля список на форме.
2) Далее пользователь совершает даблтык по нужной строке, что приводит к выгрузке всего листа экзеля в дерево на форму.
(далее элементы дерева проверяются на соответствие элементам справочника, но это уже другая история)

Так вот сама проблема: при загрузке экзель-файла корректно отрабатывается только 1й раз выбор листа. Все последующие "выборы" пользователя не отрабатываются (точнее отрабатываются, но выборка идет из того экзель-листа к-й был выбран при первом выборе пользователя.
(затем он видимо привязывается к файлу)

Процедура заполнения "списка листов" список формы
______________________________________________________________
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Попытка
       Excel = Новый  COMОбъект("Excel.Application");
   Исключение
       Сообщить(ОписаниеОшибки());
       Excel.ActiveWorkbook.Close(-1,);
       Excel.DisplayAlerts = 0;
       Excel.Application.Quit();
       Excel.DisplayAlerts = 1;
       Excel = 0;
       Возврат;
   КонецПопытки;
   
   Попытка
         НашФайл1 = Excel.WorkBooks.Open(Файл);
       КоличествоЛистов1 = Excel.WorkSheets.Count;
       Для List = 1 to КоличествоЛистов1 цикл
           Лист1 = Excel.Sheets(List);
           ПолеСписка1.Добавить(Лист1.Name);
       КонецЦикла;
       Сообщить("Выберите Лист Excel - файла");
       Исключение
       Сообщить(ОписаниеОшибки());
       Excel.ActiveWorkbook.Close(-1,);
       Excel.DisplayAlerts = 0;
       Excel.Application.Quit();
       Excel.DisplayAlerts = 1;
       Excel = 0;
       Возврат;
   КонецПопытки;
КонецПроцедуры
_______________________________________________________________

Заполнение дерева по выбору листа пользователем

Процедура ПолеСписка1Выбор(Элемент, ЭлементСписка)
   Попытка
       Excel = Новый  COMОбъект("Excel.Application");
   Исключение
       Сообщить(ОписаниеОшибки());
       Excel.ActiveWorkbook.Close(-1,);
       Excel.DisplayAlerts = 0;
       Excel.Application.Quit();
       Excel.DisplayAlerts = 1;
       Excel = 0;
       Возврат;
   КонецПопытки;
   
   Попытка
         НашФайл = Excel.WorkBooks.Open(Файл);
       Лист = Excel.WorkSheets(ЭлементСписка.Значение);
       
       ВсегоСтрок = Лист.UsedRange.Rows.Count;
       ВсегоКолонок = Лист.UsedRange.Columns.Count;
       
       ДеревоОбъект = Новый ДеревоЗначений;
       ДеревоОбъект.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("КолвоДетУзл", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("РазрядРабот", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("НВрВЧНаЕдИзм", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("РасцНаЕдИзм", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("НормВрВЧелЧасНаКомпл", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Строка"));
       ДеревоОбъект.Колонки.Добавить("Прим", Новый ОписаниеТипов("Строка"));


       Для к1 = 1 По 2 Цикл
           СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
           СтрокаУ1.Артикул = "Артикул"+к1;
           Для к2 = 1 По 2 Цикл
               СтрокаУ2 = СтрокаУ1.Строки.Добавить();
               СтрокаУ2.Артикул = СтрокаУ1.Артикул+к2;
           КонецЦикла;
       КонецЦикла;
       
       СтрокаВысшегоУровня = Данные.Строки.Добавить();
       Данные.Колонки.Добавить("Артикул");
       Данные.Колонки.Добавить("КолвоДетУзл");
       Данные.Колонки.Добавить("РазрядРабот");
       Данные.Колонки.Добавить("НВрВЧНаЕдИзм");
       Данные.Колонки.Добавить("РасцНаЕдИзм");
       Данные.Колонки.Добавить("НормВрВЧелЧасНаКомпл");
       Данные.Колонки.Добавить("Сумма");
       Данные.Колонки.Добавить("Прим");
       СтрокаВысшегоУровня.Артикул = Лист.Name();
       Сообщить(СтрокаВысшегоУровня.Артикул);
       //ВсегоСтрок
       Для Row = 1 По 100 Цикл
                   Если ЗначениеЗаполнено(Excel.Cells(Row,1).Value) Тогда
                       СтрокаПервогоУровня = СтрокаВысшегоУровня.Строки.Добавить();
                       СтрокаПервогоУровня.Артикул = Excel.Cells(Row,1).Value;
                       СтрокаВторогоУровня = СтрокаПервогоУровня.Строки.Добавить();
                       СтрокаВторогоУровня.Артикул = Excel.Cells(Row,4).Value;
                   КонецЕсли;
                   Если ((НЕ(ЗначениеЗаполнено(Excel.Cells(Row,1).Value))) и (ЗначениеЗаполнено(Excel.Cells(Row,4).Value))) Тогда
                             СтрокаВторогоУровня = СтрокаПервогоУровня.Строки.Добавить();
                           СтрокаВторогоУровня.Артикул = Excel.Cells(Row,4).Value;
                           СтрокаВторогоУровня.КолвоДетУзл = Excel.Cells(Row,5).Value;
                           СтрокаВторогоУровня.РазрядРабот = Excel.Cells(Row,6).Value;
                           СтрокаВторогоУровня.НВрВЧНаЕдИзм = Excel.Cells(Row,7).Value;
                           СтрокаВторогоУровня.РасцНаЕдИзм = Excel.Cells(Row,8).Value;
                           СтрокаВторогоУровня.НормВрВЧелЧасНаКомпл = Excel.Cells(Row,9).Value;
                           СтрокаВторогоУровня.Сумма = Excel.Cells(Row,10).Value;
                           СтрокаВторогоУровня.Прим = Excel.Cells(Row,11).Value;
                   КонецЕсли;
       КонецЦикла;
       ЭлементыФормы.Данные.СоздатьКолонки();    
       Исключение
           Сообщить(ОписаниеОшибки());
           Сообщить(ОписаниеОшибки());
           Excel.ActiveWorkbook.Close(-1,);
           Excel.DisplayAlerts = 0;
           Excel.Application.Quit();
           Excel.DisplayAlerts = 1;
           Excel = 0;
           Возврат;
       КонецПопытки;
           
           Excel.ActiveWorkbook.Close(-1,);
           Excel.DisplayAlerts = 0;
           Excel.Application.Quit();
           Excel.DisplayAlerts = 1;
           Excel = 0;

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

В общем вот такие вот дела... пытаюсь понять почему происходит такое вот "кэширование" объекта =/
1 dk
 
06.03.13
14:43
замени Excel.Cells на Лист.Cells
2 dk
 
06.03.13
14:43
Замени
Лист = Excel.WorkSheets(ЭлементСписка.Значение);
на
Лист = НашФайл.WorkSheets(ЭлементСписка.Значение);
3 dk
 
06.03.13
14:45
Замени
Excel.ActiveWorkbook.*
на
НашФайл
----
короче тебе надо разобраться с иерархией объектов в Excel
Application
  - WorkBook
        - WorkSheet
             - Cells
                  - ...
4 samozvanec
 
06.03.13
14:46
там у чего-то есть афигительный метод Выгрузить(), чтоб не бегать по файлу. посмотри в отладчике, у этого чего-то тип будет ComSafeArray. то ли у листа, то ли range надо задать.

а еще не плохо бы ексельку закрывать, ну или тот же ком объект юзать.
5 dk
 
06.03.13
14:46
и забыть нафиг про все Active... если не требуется выбор пользователем
6 YurAnt
 
06.03.13
15:10
Благодарю) все так и есть)