Имя: Пароль:
1C
1С v8
COMConnector - разные версии предприятия
,
0 wladimir90
 
27.08.12
15:07
Всем добрый день.
В череде нормальных баз существует одна, коию в нормальный вид преобразовать нельзя - висит на старой версии.
Все базы нужно через ком коннектор выгрузить. Разумеется на "той самой" базе выходит ошибка несоответствия версий.

Я пробовал обойти ошибку, вызывая перед проблемной базой regsvr32 "...старая82..\comcntr.dll"
Однако это не помогает.
Есть ли возможность обойти ошибку и как-то запустить ком коннектор из под старой версии 8.2?

Выгрузку делает vbs скрипт.
1 Широкий
 
27.08.12
15:10
как это?
2 jk3
 
27.08.12
15:12
(0) >regsvr32 "...старая82..\comcntr.dll"
Оно иногда криво отрабатывает, всё равно потом приходится реестр править.

А раз выгрузку делает vbs-скрипт, то будет, видимо, проще править реестр перед вызовом, а потом возвращать значение на место.
3 le_
 
27.08.12
15:19
А без коннектора выгрузить не?
4 almar
 
27.08.12
15:25
(0) я делаю через COM+ http://marinenok65.livejournal.com/1496.html
5 wladimir90
 
27.08.12
15:56
(2) Да - с n-го раза регистрация прошла. Но это не дело для скрипта. Через реестр тоже вариант, только я пока нужные ветки не отследил.
(3) ?
(4) Не слышал. Посмотрю, спасибо.
6 jk3
 
27.08.12
16:30
(5) А чего там сложного, запускаешь поиск по реестру по номеру релиза и всего делов-то.
Там буквально в 1-2 местах нужно править.
7 trantor77
 
27.08.12
16:36
Как вариант, скопируйте в реестре ветку существующего com-объекта.
Задайте новый GUID com-объекта, поменяйте путь и назовите его типа COMConnector2.
Должно сработать и каждый раз реестр не переписывать.
8 wladimir90
 
27.08.12
17:53
(6) Не скажи - мест пара десятков. Как бы во время замены не задеть лишнего.
(7) К сожалению вываливает ошибку "Невозможно создание объекта контейнером ActiveX. Наверное не все скопировал, пока не нашел что(гуиды в копиях новые поставил, как и имена).

(4) Отваливается на добавлении dll в компоненты. Либо говорит что файла нет, либо что он уже зарегестрирован. (Пробовал отменять регистрацию и переименовывать файл).
9 jk3
 
28.08.12
12:19
(8) Аха, пара десятков, ну-ну.

Вот полный список, всего 8 мест и это при том, что половина тупо повторяет друг друга (т.е. изменив в 1 месте сразу же само меняется в другом).


[HKEY_CLASSES_ROOT\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32]
@="C:\\Program Files (x86)\\1cv82\\8.2.16.352\\bin\\comcntr.dll"


Т.о. там место всего 2 или максимум 4, определяется экспериментальным путём.
10 НаборДанных
 
28.08.12
12:23
(0)Странно у меня обертка для запуска разных версий предприятия и там тупо regsvr32 нужной comcntr.dll и запуск нужной версии платформы, все робит.
11 jk3
 
28.08.12
13:45
(10) Всё верно, в идеале так и должно работать.
Но иногда не прокатывает и приходится лезть в реестр.
12 wladimir90
 
28.08.12
14:32
(10) А какая у тебя винда? jk3 прав, regsvr32 может глючить - я на server 2008 r2

(9)(11) Да, ты прав. Я не правильно вчера поисковый запрос писал. На всякий случай перепроверил - у меня получился точно такой же список из 8 элементов.
Но должен признаться в своем бессилии - несмотря на то что во все 8 элементов пишу путь к старой базе, выходит та же ошибка несовместимости версий.
Факты:
Если в коде считать значение записи реестра после ее изменения, она дает верный результат, т.е. там путь к старой версии длл.
Если в реестре провести поиск по имении длл после изменений записей, там не найти путей на новую версию.
Скрипт каким то образом подцепляет для исполнения именно новую версию несмотря на отсутствие ссылок на нее в реестре.

Возможно данные хранятся не только в реестре? Или может реестр нужно еще как-то обновить по типу обновления бд?

Если интересно, его величество код (vbs):
В Obj хранится в том числе one1CPath  - т.е. путь до папки 1с.

Set WshShell=WScript.CreateObject("WScript.Shell")

       RrunString = "regsvr32 " + Obj.one1CPath + "bin\comcntr.dll"
       RrunString = Replace(RrunString, Chr(34), "", 1, 30)
       RrunString = Replace(RrunString, "regsvr32 ", "regsvr32 " + Chr(34), 1, 30)
       RrunString = Replace(RrunString, "dll ", "dll" + Chr(34), 1, 30)
               
'        Формируем строку регистрации длл        
       runString = Obj.one1CPath + "bin\comcntr.dll"
       runString = Replace(runString, Chr(34), "", 1, 30)  


       WshShell.Run RrunString, 0, False
       
       WScript.Sleep 1000    
       
           WshShell.RegWrite "HKEY_CLASSES_ROOT\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32\", runString, "REG_SZ"
           WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\TypeLib\{2EC2A380-9200-4067-AE35-A6586D1B2888}\1.0\0\win32\", runString, "REG_SZ"
13 Homer
 
28.08.12
14:33
(12) аналогично менял все пути в реестре, не помогает!
14 Homer
 
28.08.12
14:33
я уже удалил все версии, и поставил новую на клиенте, не помогло. Все равно пишет что

Различаются версии клиента и сервера (8.2.15.289 - 8.2.15.317), клиентское приложение: COM-соединение
15 wladimir90
 
28.08.12
15:22
(14) Странно. В твоем случае проблем вообще быть не должно - с n-го раза regsvr32 все таки отрабатывает как надо, жаль что только вручную а не внутри скрипта. Ну или я не отследил какие-то зависимости.
16 jk3
 
28.08.12
16:53
(12) Попробуй после изменений в реестре пересоздай WshShell, ты же дальше по коду через него обращаешься к 1с?
17 wladimir90
 
28.08.12
20:54
(16) Да, WshShell я не пересоздаю - использую один. Даже не подумал что может быть из-за этого. Завтра попробую.
18 wladimir90
 
29.08.12
09:17
(16) Не, не так. WshShell действительно в дальнейшем используется для запуска 1с, но на данном этапе это не важно, т.к. вылетает на этапе коннекта через только что созданный объект ком коннектор (ниже блок кода).
WshShell прямо перед этим кодом пересоздаю, бесполезно. Возможно это какая то непонятная особенность реестра, или просто баг. Думаю отказаться от идеи "все в одном" и запускать скрипт с двух разных машин (или терминальных аккаунтов сервера).

   ObC = "V82.COMConnector"
   Set connector = CreateObject(ObC)
   Set AgentConnection = Connector.ConnectAgent(Old_ClusServerName) 'ВОТ ТУТ НЕСООТВЕТСТВИЕ ВЕРСИЙ
   Set Cluster = AgentConnection.GetClusters()(0)
19 wladimir90
 
29.08.12
12:25
В терминале похоже, один реестр на все аккаунты. Так что только разные физические машины остаются.
20 jk3
 
30.08.12
10:51
(18) Ну тогда в отдельный скрипт выноси и вызывай его.
Возможно кэшируются значения на уровне скрипта, хз.