Имя: Пароль:
1C
1С v8
Загрузка из множества эксель файлов, подскажите в чем косяк
,
0 murzo1
 
13.12.11
10:03
НайденныеФайлы = НайтиФайлы("C:\Aojama\ЭКСЕЛЬ\подбор", "*.xls", Истина);
   
   Для Каждого ИмяФайла Из НайденныеФайлы Цикл
       
       ОбработкаПрерыванияПользователя();
       
       ВыбФайл    = Новый Файл(ИмяФайла.ПолноеИмя);
       
       СправочникСсылка = Справочники.Автоработы.НайтиПоНаименованию(ВыбФайл.ИмяБезРасширения);
       
       Если НЕ ЗначениеЗаполнено(СправочникСсылка) Тогда
           
           СправочникОбъект = Справочники.Автоработы.СоздатьЭлемент();
           СправочникОбъект.Наименование = ВыбФайл.ИмяБезРасширения;
           СправочникОбъект.Номенклатура = Справочники.Номенклатура.Авторабота;
           СправочникОбъект.УстановитьНовыйКод();
           СправочникОбъект.ОбменДанными.Загрузка = Истина;
           СправочникОбъект.Записать();
           Сообщить(СправочникОбъект);
           
           НомерЛиста = 1;
           Excel      = Новый COMОбъект("Excel.Application");
           Excel.Workbooks.Open(ВыбФайл.ПолноеИмя);
           Excel.Sheets(НомерЛиста).Select();
           
           ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
           ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
           
           Для Строка = 1 По ФайлСтрок Цикл
               
               Если Найти("1234567890", СокрЛП(Excel.Cells(Строка, 2).Value)) > 0 Тогда
                   
                   КатНомер        = СокрЛП(Excel.Cells(Строка, 1).Value);
                   Количество      = СокрЛП(Excel.Cells(Строка, 2).Value);
                   НомСсыл         = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", КатНомер);
                   
                   НаборЗаписей = РегистрыСведений.СвязанныеРаботы.СоздатьНаборЗаписей();
                   НаборЗаписей.Отбор.Авторабота.Установить(СправочникОбъект.Ссылка);
                   НаборЗаписей.Отбор.СвязаннаяРабота.Установить(НомСсыл);
                   НаборЗаписей.Прочитать();
                   Если НаборЗаписей.Количество() = 0 Тогда
                       НоваяЗапись                 = НаборЗаписей.Добавить();
                       НоваяЗапись.Авторабота      = СправочникОбъект.Ссылка;
                       НоваяЗапись.СвязаннаяРабота = НомСсыл;
                       НоваяЗапись.Количество      = Число(Количество);
                   ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
                       СтараяЗапись                 = НаборЗаписей[0];
                       СтараяЗапись.Авторабота      = СправочникОбъект.Ссылка;
                       СтараяЗапись.СвязаннаяРабота = НомСсыл;
                       СтараяЗапись.Количество      = Число(Количество);
                   КонецЕсли;
                   Попытка
                       НаборЗаписей.Записать();
                       Сообщить("записано");
                   Исключение
                       Сообщить("найхуа");
                   КонецПопытки;
                   
               КонецЕсли;
               
           КонецЦикла;
           
           Excel.ActiveWorkbook.Close();
           Excel.Quit();

   КонецЦикла;


При загрузке почемуто виснет.... в чем может быть ошибка?
1 vmv
 
13.12.11
10:06
слишком много точек в объектных переменным и сом, начни с малого

перед началом всех начал напиши

МенеджерАвтоработы = Справочники.Автоработы;

и т.д.
2 dk
 
13.12.11
10:08
замер производительности запретили?
3 vmv
 
13.12.11
10:08
+ но тормозит изза записи набора регистра в цикле и

НаборЗаписей = РегистрыСведений.СвязанныеРаботы.СоздатьНаборЗаписей();
тоже вынести за цикл.

зачем создавать переменную набора каждый раз в цикле, если ее(набор) можно объявить перед заходом в цикл и потом работать с отборами по этому набору
4 dk
 
13.12.11
10:09
да и эксель нафига в цикле создавать?
много лишней требухи в цикле
5 murzo1
 
13.12.11
10:11
(3) файлы не стандартизированные и только в цикле можно определить какая строка подходит, поэтмоу в цикле и делаю
6 vmv
 
13.12.11
10:12
Excel      = Новый COMОбъект("Excel.Application");

тоже в цикле, о боже

да вынеси все объявления переменных в том числек и ком за циклы - это еще в школе учат

и посмотри процессы когда сей код колбасит, удивишься количеству процессов эксель)
7 vmv
 
13.12.11
10:12
(5) это не аргумент, тем более он беспочвенный и неверный
8 murzo1
 
13.12.11
10:13
(7) как ты определишь с какой строки загружать ? )
9 vmv
 
13.12.11
10:14
Excel      = Новый COMОбъект("Excel.Application");

самая тормознутая строка в этом коде

и если у тебя 100 файлов, то 100 раз происходит инициализация сом, а только одна инициализация его иногда напрягает ожиданием
10 murzo1
 
13.12.11
10:21
Виснет на этой встрочке: Excel.ActiveWorkbook.Close();
11 dk
 
13.12.11
10:28
(10)
1. в open надо указать, что только на чтение
2. в close сказать, что не сохранять
12 vmv
 
13.12.11
10:37
Состояние("Создание COMОбъект(<Excel.Application>)");

Excel = Новый COMОбъект("Excel.Application");    

Для каждого ТекущийФайл Из мФайлы Цикл
   
   //.....
   
   Excel.DisplayAlerts = 0;                              // запрещаем вывод на экран
   ExcelBooks = Excel.Workbooks.Open(ИмяФайлаИмпорта);   // открываем книгу
   Excel.ActiveWorkbook.RunAutoMacros(1);                // отключаем макросы
   
   КоличествоЛистов = ExcelBooks.Sheets.Count;
   
   //....
   
   ТекущийЛист      = Excel.Sheets(НомерЛиста);
   ИмяТекущегоЛиста = ExcelBooks.Sheets(НомерЛиста).Name;
   
   ВсегоКолонок = ТекущийЛист.Cells(1,1).SpecialCells(11).Column;
   ВсегоСтрок   = ТекущийЛист.Cells(1,1).SpecialCells(11).Row;
   
   //....

   
   //....
   
   //ExcelBooks.Saved = Истина;
   //ExcelBooks.Saved = Ложь;
   
   ExcelBooks.Close();
   
КонецЦикла;
13 murzo1
 
13.12.11
11:00
(12) спасибо, помогло
14 murzo1
 
13.12.11
12:08
НайденныеФайлы = НайтиФайлы("C:\Aojama\ЭКСЕЛЬ\подбор", "*.xls", Истина);
   НомерЛиста     = 1;
   Excel          = Новый COMОбъект("Excel.Application");
   
   Для Каждого ИмяФайла Из НайденныеФайлы Цикл
       
       ОбработкаПрерыванияПользователя();
       ВыбФайл             = Новый Файл(ИмяФайла.ПолноеИмя);
       СправочникСсылка    = Справочники.Автоработы.НайтиПоНаименованию(ВыбФайл.ИмяБезРасширения);
       Excel.DisplayAlerts = 0;
       ExcelBooks          = Excel.Workbooks.Open(ВыбФайл.ПолноеИмя);
       Excel.ActiveWorkbook.RunAutoMacros(1);
       
       Для КолВаЛистов = 1 По Excel.Sheets.Count Цикл
           
           Excel.Sheets(КолВаЛистов).Select();
           ФайлСтрок   = Макс(Excel.Cells.CurrentRegion.Rows.Count, 13);
           ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);



может еще подскажие почему не получается по всем листам пробежатся? ошибка вылазит
По первому листу проходит нормально, а потом падает....
15 dk
 
13.12.11
12:12
стиль корявый
соблюдай иерархию
application
workbook
sheet
cells/range
т.е. нежелательно обращаться к нижестоящему уровню не указав вышестоящий
16 dk
 
13.12.11
12:13
да и Cells.CurrentRegion - что-то новенькое, отродясь пользовались usedrange и specialcells
17 murzo1
 
13.12.11
12:16
(16) спасибо за инфу
18 dk
 
13.12.11
12:25
пробежаться по листам

Для Сч = По ExcelWorkBooks.Sheets.Count Цикл
   ТекЛист = ExcelWorkBooks.Sheets(Сч);
   Сообщить(ТекЛист.Name);
   Сообщить("Колонок: " + ТекЛист.UsedRange.Columns.Count);
   Сообщить("Строк: " + ТекЛист.UsedRange.Rows.Count);
КонецЦикла;