Имя: Пароль:
1C
1C 7.7
v7: Excel в MS Office 2010
,
0 olmi
 
26.06.14
06:16
Загружаю Excel таблицу в 1С 7.7
Все работало без проблем с *.xls в старом Excel. Но в MS Office 2010 выдаёт ошибку:
Книга.Close();    
{Обработка.ЗаполнитьСписокСотрудниковИзExcelДляТабеля.Форма.Модуль(295)}: Неизвестная ошибка
Перед этим все определено:
        Excel = СоздатьОбъект("Excel.Application");
    Книги = Excel.Workbooks;
        Книга=Книги.Open(ФайлТабеля,0,1);
и нормально выполнена куча действий в этой книге, например,
    КолЛистов=Книга.Sheets.Count;
и обращение к

Функция ПолучитьЗначение(Excel,y,x)
    Cell=Excel.Cells(y,x);
    Возврат Cell.Value;
КонецФункции

К слову, после закрытия книги, которое не получается, идет
    Excel.Quit();  
Будет ли работать этот оператор нормально?
1 PaulBC
 
26.06.14
06:28
А что в строке №295?
2 catena
 
26.06.14
06:54
(0)А если попробовать закрывать то же, что открываем?
КнигИ.Close(); - работает?
3 olmi
 
26.06.14
13:17
(1) Книга.Close();    
{Обработка.ЗаполнитьСписокСотрудниковИзExcelДляТабеля.Форма.Модуль(295)}: Неизвестная ошибка
(2) Раньше работало и так.Теперь зависает на (1). Книги.Close();     тоже не работает.
Может быть, в последовательности
        Книга.Close();     
    Excel.Quit();  
оставить только закрытие Excel?
4 olmi
 
26.06.14
13:26
Даю всю Экселевскую часть обработки:
//******************************************************************************
Функция ПолучитьЗначение(Excel,y,x)
    Cell=Excel.Cells(y,x);
    Возврат Cell.Value;
КонецФункции

//******************************************************************************
Функция ПолучитьТаблицуСотрудников(КодОш)    
    
    Перем Excel,Страница;
    
    Попытка
        Excel = СоздатьОбъект("Excel.Application");
    Исключение
        Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
        КодОш=1;
        Возврат ТаблицаСотрудников;
    КонецПопытки;
...
    Excel.Visible = 0;
    Книги = Excel.Workbooks;
    Попытка
        Книга=Книги.Open(ФайлТабеля,0,1);
    Исключение
        Сообщить("Файл табеля не найден.","!");
        КодОш=1;
        Возврат ТаблицаСотрудников;
    КонецПопытки;      
    
    КолЛистов=Книга.Sheets.Count;
    Если КолЛистов>1 Тогда  
        Листы=СоздатьОбъект("СписокЗначений");
        Для НомерЛиста = 1 по КолЛистов Цикл
            Страница = Excel.Sheets(НомерЛиста);
            ИмяЛиста = Страница.Name;
            Листы.ДобавитьЗначение(НомерЛиста, ИмяЛиста);
        КонецЦикла;
...
    Иначе
        НомерЛиста=1;
    КонецЕсли;      
    Страница = Excel.Sheets(НомерЛиста);
    ИмяЛиста = Страница.Name;  
...
    Сотрудники=СоздатьОбъект("Справочник.Сотрудники");
    
    Для к=1 По КолСотрудников Цикл
        
...
        ТабНомер =СокрЛП(ПолучитьЗначение(Страница,НомерСтр, 25));
...
        Сотрудник=Сотрудники.ТекущийЭлемент();
...
        ТекстВсегоДней =ПолучитьЗначение(Страница,НомерСтр, 142);
        ТекстВсегоЧасов =ПолучитьЗначение(Страница,НомерСтр, 148);
        ТекстВсегоНочных =ПолучитьЗначение(Страница,НомерСтр, 179);
        ТекстВсегоВыходныхИПраздн1 =ПолучитьЗначение(Страница,НомерСтр, 170);
        ТекстВсегоВыходныхИПраздн2 =ПолучитьЗначение(Страница,НомерСтр+2, 170);
        ФИО =ПолучитьЗначение(Страница,НомерСтр, 7);
    КонецЦикла;      
    
    //Книга.Close();    
    Книги.Close();    
    Excel.Quit();
5 olmi
 
26.06.14
13:28
Сыплется на операторе закрытия книги.
6 Kookish
 
26.06.14
13:31
А если сделать что-то типа:
    db = СоздатьОбъект("ADODB.Connection");

    // "HDR=No" - считает первую строку листа данными, а не заголовком. По умолчанию "HDR=Yes"
//    ConectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";";
    ConectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1;"";";
    rs=CreateObject("ADODB.Recordset");
    db.Open(ConectionString);
    rs.ActiveConnection = db;
    rs.CursorType = 3;
    rs.LockType = 2;

    // Выбираем все данные с первого листа
    rs.Source = "Select * from [Лист №1$]";
    rs.Open();
    
    // Получаем количество колонок и количество строк
    КоличествоПолей = rs.Fields.Count;
    //Сообщить("Количество колонок: " + КоличествоПолей);
    КоличествоЗаписей = rs.RecordCount;
    //Сообщить("КоличествоЗаписей: " + КоличествоЗаписей);

Заодно и быстрее работать будет...
7 Kookish
 
26.06.14
13:32
В конце, разумеется:

    rs.Close();
    db.Close();
8 pechevas
 
26.06.14
13:33
Excel.Workbooks.Close();
9 pechevas
 
26.06.14
13:34
(6) Это предложение получше, если только в полях данные одинаковые.
10 eshtrey
 
26.06.14
13:34
попробуй Страница = Excel.Worksheets(НомерЛиста);
а в конце можно просто Excel = 0
11 volodya43234
 
26.06.14
13:38
у меня на связке 2010 екселя и 1с так работает
Excel.ActiveWorkbook.close();

Больше ничего не нужно.
12 olmi
 
26.06.14
13:49
(8) Не работает.
(9) Что значит-данные одинаковые? Там объединенные ячейки есть, данные, полученные по формулам и т.д. Я тупо выбираю как текст и обрабатываю как мне надо. Все работает до закрытия книги. При старом Excel книга закрывалась.
(10) Со страницей проблем нет.
(11) Не работает, зависает. ТипЗначенияСтр(Excel.ActiveWorkbook) = "OLE._Workbook". Оператор скопировала отсюда, ошибок в буквовках быть не может.
13 olmi
 
26.06.14
13:50
Если пропустить этот оператор, Excel не закрывается, на следующем документе, соответственно, не открывается.
14 ildary
 
26.06.14
13:58
(6) можно задать вопрос по ADO? как правильно грузить данные, состоящие из длинных чисел? НАпример Ш/К загруженно через ADO превращаются из 4743545345435 в что-то вроде "4,7e+10".
15 volodya43234
 
26.06.14
14:00
Конешно не закрывается.
Даю свой рабочий код

    Попытка
        ExcelApp = СоздатьОбъект("Excel.Application");
    Исключение
        Сообщить(ОписаниеОшибки()+"; программа Excel не установлена на данном компьютере!");
        Возврат;
    КонецПопытки;
    РабочиеКниги=ExcelApp.WorkBooks;
    Попытка
        РабочаяКнига=РабочиеКниги.Open(ИмяФайла);
//            РабочаяКнига=РабочиеКниги.ОткрытьФайл(Файл);
    ОписаниеОшибки();      
    Исключение
        ExcelApp.Quit();
        Сообщить("Ошибка открытия файла!");
        Возврат;
    КонецПопытки;    
    СКонтр=СоздатьОбъект("Справочник.Контрагенти");
    
         работа с данными екселя.

ExcelApp.ActiveWorkbook.close();
16 volodya43234
 
26.06.14
14:33
Кстати если документы созданы в 95 екселе (сохранены из 1С), то можно добавить еще такую запись:

ExcelApp.Visible = 0;
17 volodya43234
 
26.06.14
14:51
(+)замечание.
Во время работы кода с екселем не нужно переключатся на другие открытые книги (или открывать новые). Дождаться пока код отработает.
18 volodya43234
 
26.06.14
14:58
(12) наконец сообразил что Вы ответили мне в этом сообщении.
Думаю я правильно догадываюсь. "Зависает" именно на коде:
ExcelApp.ActiveWorkbook.close();
Причина. Екселевский файл сохранен в 95 екселе.
А особенность 2010 екселя в том, что он такой файл предлагает пересохранить, даже если в нем ничего не изменяли.
Поэтому висит не код из 1С, а запрос в екселе для сохранения документа.
19 olmi
 
26.06.14
16:12
(15) Не срабатывает. Причем все отлично работает со старым Excel
(16) Этот оператор есть, я писала в коде.
(17) На другие книги не переключаюсь, работаю на копии соло.
(18)!!! Верно! А что сделать?)
20 olmi
 
26.06.14
16:13
(18) Есть ли в 2010 Excel средства, вставляемые в 1С для автопересохранения или отказа от такого запроса?)
21 volodya43234
 
26.06.14
16:19
(20) Так, давай проверим. Сохрани из 1с в Ексель какие-то данные. Открой этот файл в екселе, ничего не изменяя, нахми "х" -закрыть. Будет спрашивать сохранить данные или нет?
22 Масянька
 
26.06.14
16:21
(19) Попробуй нечто такое
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs [a1]
Application.DisplayAlerts = True
23 olmi
 
26.06.14
18:25
(19) Идея хороша, спасибо!) Но False и True в 7.7?) Чем заменить?)
24 acanta
 
26.06.14
18:27
(23)в хелпе по васику что-то из них =-1..
25 Масянька
 
26.06.14
18:29
(23) Это к (22)?
У меня False = 0, True = 1
26 Масянька
 
26.06.14
18:30
И кстати,     
Excel.ActiveWorkBook.Close(0);
27 olmi
 
26.06.14
18:58
(25) Так). Этот вопрос снят, сама разобралась. Дальше сделала макрос и получила сохранение с параметром xlExcel8. Как найти его числовое значение? Или тут подскажете?)
ActiveWorkbook.SaveAs Filename:= _
        ИмяФайла, FileFormat:=xlExcel8, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
Важен, как я понимаю, только этот параметр.
(26) Этого будет достаточно?) И что значит 0 в этом случае?
28 olmi
 
26.06.14
19:00
(26) Кажется, нашла - 56?
29 olmi
 
26.06.14
19:07
(26) Поняла - не сохранять изменений).
30 olmi
 
26.06.14
19:20
(26) Спасибо огромное, все работает). Решение:

    //Обработка закрытия файла Excel в Excel2010
    Excel.DisplayAlerts = 0;
    Excel.ActiveWorkbook.SaveAs (ФайлТабеля,56);
    Excel.DisplayAlerts = 1;
    Excel.ActiveWorkbook.Close(0);
31 olmi
 
26.06.14
19:21
Можно и заменять Excel.ActiveWorkbook на ранее определенное Книга.
32 olmi
 
26.06.14
19:23
Кстати, нашла это еще в одном месте, с кучей других радостей жизни).
http://portal.odines.ws/?p=2752
33 Z1
 
26.06.14
20:44
(31) Очень сильно помогают макросы ( может не для Вашего случая ).
Как бы идея : Включаете макрос на запись
делаете все желаемые  действия с xls
останавливаете макрос
и далее в макросе видите все совершенные действия.
34 Хоменко Валерий
 
27.06.14
11:25
Интересно, а FriendVBA работает с макросами из 2010 Excel ?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс