Имя: Пароль:
1C
1С v8
ADO + xlsx + Win Server 2008 r2 x64 = бедаааа
,
0 bacila
 
06.06.13
03:07
Потратил я 3 дня и 3 ночи в попытках устранить трабл,а трабл в общем такой , надо загружать файлы экселевские, локально на ноутбуке все работает, но при при переносе на клиент - серверный вариант  работать перестает (вернее загружает только xls а на xlsx валится при открытии) выдавая следующую ошибку:   {ОбщийМодуль.ЧтениеИзЭкселя.Модуль(18)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Access Database Engine): External table is not in the expected format.

причем прошу заметить что accessdatabaseengine2010x64 я ставил, accessdatabaseengine2007 я тоже ставил собственно сам код:
&НаСервере
Функция ПарсингЭкселя(пФайл,Знач ПроверочныйСтолбец = 1, СтруктураКолонок = Неопределено, Знач НачСтрока = 2, Знач КонСтрока = 0) Экспорт
   
   
   Файл = ПолучитьИзВременногоХранилища(пФайл);
   ИмяФайла = ЭлектронныеДокументыСлужебный.ТекущееИмяВременногоФайла();
   Файл.Записать(ИмяФайла);


   СтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+СокрЛП(ИмяФайла);
   //СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+СокрЛП(ИмяФайла);
   СтрокаСоединения = СтрокаСоединения + "; Extended Properties = "+"""Excel 12.0"+";HDR=NO;IMEX=1"";";    

   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.ConnectionString =  СтрокаСоединения;  
   
   Попытка
       Connection.Open();  // в этом месте возникает ошибка

Помогите кто чем может, реально уже утомился.....
1 Stormicon
 
06.06.13
06:51
Extended Properties="Excel 12.0 Xml;HDR=YES
2 Stormicon
 
06.06.13
06:54
Поменяй во-первых опции, а во-вторых, провайдер прописан в х64 консоли или х86 ?
3 Stormicon
 
06.06.13
06:56
microsoft.com/en-us/download/details.aspx?id=13255 - надеюсь стоит? там же на страничке указаны Extended Properties для xlsx.
4 bacila
 
06.06.13
09:46
(3) на ноуте и xls и xlsx грузит, на серваке только xls  с такими параметрами.

microsoft.com/en-us/download/details.aspx?id=13255 да стоит (2) не понял про консоль
5 bacila
 
06.06.13
09:51
(1)  зачем мне заголовки включать?
6 Serginio1
 
06.06.13
11:13
7 bacila
 
06.06.13
11:37
(6)  там задача решилась снеся 1 эксель установив другой, у меня эксель там вообще не стоит, и xls у меня читает , а xlsx нет.
8 Gammi
 
06.06.13
11:48
используй разные строки подключения на сервере и на ноутбуке. Найди нужную для 64-х сервера
9 Serginio1
 
06.06.13
11:53
(7) Ты плохо читал. Для работы в 64 разрядном приложении тебе нужно учтановить Microsoft Access Database Engine 2010 Redistributable

http://www.microsoft.com/en-us/download/details.aspx?id=13255

Предварительно снеся все что относится к 32 разрядному офису. В том числе и 32 разрядный Microsoft Access Database Engine 2010 Redistributable

Две версии драйверов стоять не могут.
По ссылке чел установил 64  Microsoft Access Database Engine 2010 Redistributable

и поставил сверзу офис 2003.
10 Serginio1
 
06.06.13
11:58
На клиенте тебе нужно ставить 32 разрядный вариант. Два варианта драйверов 32 и 64 разрядных не живут
11 bacila
 
06.06.13
13:53
(9) я все так и сделал (10) на клиенте мне вообще зачем драйвер, все делается на сервере
12 Serginio1
 
06.06.13
14:01
У тебя 1С сервер 32 разрядный?
13 Serginio1
 
06.06.13
14:04
А пути то у тебя правильные. Если доходит до Connection.Open();  у тебя проблема с путями. Учти что ты выполняешь код на сервере и пути должны быть относительно него и права доступа
14 Serginio1
 
06.06.13
14:08
15 Serginio1
 
06.06.13
14:14
У меня
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+ИмяФайла;
   СтрокаПодключения = СтрокаПодключения + "; Extended Properties = "+"""Excel 12.0"+";HDR=NO;IMEX=1"";";

   АДОСоединение=Новый COMОбъект("ADODB.Connection");
   
   АДОСоединение.ConnectionString=СтрокаПодключения;
   АДОСоединение.ConnectionTimeout = 15;
   АДОСоединение.CursorLocation = 3;
   
   // Подключаемся
   
   
   Попытка
       АДОСоединение.Open();
       
       
   Исключение
       Сообщить(ОписаниеОшибки());
       Сообщить ("Невозможно подключится к Microsoft Excel Driver!!!
       |Возможно файл ["+ИмяФайла+"] открыт другим пользователем.");
       Возврат Неопределено;
   КонецПопытки;
16 Serginio1
 
06.06.13
14:25
http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/57cb3121-755d-4cd5-8cda-a0630cbf535b/

Я установил пакет MSXML 6.0 на Win 2003 Server и что сделали свое дело.
17 bacila
 
06.06.13
14:32
(12) сервер x64
(13) посмотри код внимательнее, я получаю файл в двоичном виде  сохраняю его на сервере и потом с ним работаю
(16) MSXML 6.0  тоже ставил
говорю же уже уйму вариантов перепробовал
18 bacila
 
06.06.13
14:36
(14) читаю, букв много ))
19 Serginio1
 
06.06.13
14:40
ЭлектронныеДокументыСлужебный.ТекущееИмяВременногоФайла();
На каталог есть параметры Эксель\Центр управления безопасностью\Надежные расположения
20 Serginio1
 
06.06.13
14:43
(18) Там расположение по ключам должно быть  Office14 \ ACEOLEDB.DLL

Вы должны быть в состоянии решить эту проблему, выполнив ремонт установке офисного или Access.

Кроме того, можно изменить раздел реестра изменения DLL путь, чтобы соответствовать вашей версии Access.

Access 2007 следует использовать OFFICE12, Access 2010 - Office14 и доступе 2013 - OFFICE15


(ОС: 64bit офис: 64bit) или (ОС: 32bit офис: 32bit)

Ключ: HKCR \ CLSID \ {3BE786A0-0366-9434-4F5C-25CF162E475E} \ InprocServer32 \

Параметр: (По умолчанию)

Данные значения: C: \ Program Files \ Common Files \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL


(ОС: 64bit офис: 32bit)

Ключ: HKCR \ Wow6432Node \ CLSID \ {3BE786A0-0366-9434-4F5C-25CF162E475E} \ InprocServer32 \

Параметр: (По умолчанию)

Данные значения: C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL
21 bacila
 
06.06.13
14:59
(20) ну я так и понял примерно, спасибо , за последнее время это реально какая то новая инфа и вариант.
22 Serginio1
 
06.06.13
15:05
Еще при записи в xlsx  нужно  явно указать Extended Properties=Excel 12.0 Xml;
может и для чтения поможет
23 bacila
 
06.06.13
15:05
(20) только я чет не совсем понял, как в итоге то должно быть если  уменя 1с сервер x64 и odbc  драйве x 64
24 bacila
 
06.06.13
15:06
(22) я не записываю, а локально при чтении (на ноуте) когда писа xml  отказывалось читать
25 Serginio1
 
06.06.13
15:09
Должен быть C: \ Program Files \ Common Files \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL
26 bacila
 
06.06.13
15:28
у меня нет таких веток НО нашел такой раздел HKEY_CLASSES_ROOT\Microsoft.ACE.OLEDB.12.0\CLSID  где как раз указан этот ключ
27 bacila
 
06.06.13
15:29
{3BE786A0-0366-4F5C-9434-25CF162E475E}
28 bacila
 
06.06.13
15:29
может просто самому создать?
29 Serginio1
 
06.06.13
15:38
Тебе нужен Найди где у тебя ACEOLEDB.DLL и если там не Office14 переделай на Office14 соответственно папка такая должна бытью Ил просто удали и заного установи драйвер отсюда http://www.microsoft.com/en-us/download/details.aspx?id=13255
30 bacila
 
06.06.13
17:12
(29) да я его уже раз 5 переустанавливал, именно этот
31 bacila
 
06.06.13
17:16
HKEY_CLASSES_ROOT\CLSID\{3BE786A0-0366-4F5C-9434-25CF162E475E}\InprocServer32   =  C:\Program Files\Common Files\Microsoft Shared\OFFICE14\ACEOLEDB.DLL


вот нашел :(
32 Serginio1
 
06.06.13
17:31
То есть ключ правильный? А просто файл экселем то открывается? Проверь на загрузку заведомо валидного файла
33 bacila
 
06.06.13
17:40
ну на другой машине открывается, да и я не один файл пробовал
34 Serginio1
 
06.06.13
18:00
Я про то что вместо
 Файл = ПолучитьИзВременногоХранилища(пФайл);
   ИмяФайла = ЭлектронныеДокументыСлужебный.ТекущееИмяВременногоФайла();
   Файл.Записать(ИмяФайла);

попробовать.
ИмяФайла=ВПутьКВалидномуФайлу;
35 bacila
 
10.06.13
01:29
(34) Решил я забить пока что на это, надоело
36 Reaper_1c
 
10.06.13
01:43
xlsx - это zip с нулевым сжатием набитый XML-ками. Уже сто лет в интенетах лежат готовые обработки для работы с ним без всяких ADO, COM и прочего...
37 bacila
 
10.06.13
02:26
(36) метод нужен универсальный для чтения любых экселей
38 bacila
 
10.06.13
02:27
Задача решена, добавлены в ручную соответсвующие ветки из 20 ого поста, и все заработало   Serginio1-у  большое спасибо за то что натолкнул на мысль, хоть и не напрямую
39 bacila
 
11.06.13
14:26
теперь другая проблема, xlsx загружается без лидирующих нулей
40 Jaap Vduul
 
11.06.13
14:39
(39)
Это, скорее всего, просто форматирование соответствующее в ячейках.
Так что просто форматируй аналогичным образом.
41 bacila
 
11.06.13
14:51
ну 1с так сохраняет , криво как то в каком то неведомом формате
42 bacila
 
11.06.13
14:52
когда ставишь у ячейки формат текст 0 исчезают в экселе, в итоге фигня получается
43 bacila
 
11.06.13
14:53
потому что эти нули нужны
44 Jaap Vduul
 
11.06.13
14:55
Имелось в виду форматировать уже на стороне 1цэ, ну или в момент выборки, в запросе.
45 Serginio1
 
11.06.13
16:52
А ты в 1С поставь ф ячейке содержит значение и тип значения строка
46 bacila
 
11.06.13
21:03
(45) да я то не сохраняю из 1с, это всякие прайсы и тд, которые присылают контрагенты
47 bacila
 
11.06.13
21:04
причем когда до этого делал загрузку локально на ноуте, нули загружались, но в данный момент уже радостно что на серваке хоть как то работает
48 romansun
 
11.06.13
23:17
лидирующие нули в экселе

http://forum.infostart.ru/forum26/topic58277/
49 Serginio1
 
13.06.13
10:39
50 Serginio1
 
13.06.13
11:52
Или попробуй
АДОЗапись.Open("Select ''+F1 as A from ["+ИмяЛиста+"$]");
Где F1 это первая колонка A
'' должен указать, что строка. С кастами у меня не получилось
51 Serginio1
 
14.06.13
16:45
Кстати из соседней ветки v8: Есть ли способ оптимизации скорости при обращении к строкам xls?

АДОЗапись.Open("Select ''+Format(F1,'text') as Цвет from ["+ИмяЛиста+"$]");
52 Eugeneer
 
14.06.13
16:55
Можете не долбится даже.
Все решено от и до включая работы всех форматов во всех режимах 1С - тонкий, толстый, вэб-клиент, Линус и вин сервера 32/64. И так далее.
Все проблемы с лидирующими нулями и прочими гемморами, включая файлы с кривыми символами и так далее и так далее
http://subsystems.ru/catalog/27/159/
53 Eugeneer
 
14.06.13
16:58
Адо не будет работать нормально - уже прожевано на протяжении 4 лет.
54 Serginio1
 
14.06.13
17:15
(53) Да нет вариант
АДОЗапись.Open("Select ''+F1 as A from ["+ИмяЛиста+"$]");
Читает ведущие нули где '' это пара одинарных ковычек
55 bacila
 
19.06.13
13:57
да беда в том что читает то он как текст, а 1с сохраняет в каком то смешенном формате,  проблема в драйверах , мучаться не захотелось, все читаю в базе и загружаю убирая лидирующие нули там где они есть,чтоб привести к одному формату, а то мучаться времени нет