Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 08:20

Помогите пожалуйста разобраться с DCOM объектом (1C + PHP)

Автор dima_si, 28 мар 2013, 11:47

0 Пользователей и 1 гость просматривают эту тему.

dima_si

Уважаемые форумчане, прошу помощи в решении своего вопроса, возможно, кто-то сталкивался с вопросами интеграции 1С 7.7 в приложения WEB.  Даже и не знаю на каком из форумов задавать данный вопрос. Имеется WEB приложение, написанное на PHP (Windows + Apache + PHP + MySQL), реализован модуль формирования документов 1С через WEB-интерфейс (модуль рабочий), 1С установлена на WEB-сервере, для интеграции используется DCOM объект «V77.GeneralPropPage».
Алгоритм действия: пользователь заходит через WEB-интерфейс, совершает какое-то действие (нажимает кнопку), в 1С создается необходимый документ.
Встал вопрос о разделении серверов, 1С переезжает на отдельный сервер, не удается подключить DCOM объект удаленного сервера

Тестовый код подключения  DCOM-объекта на PHP (локальный вариант, код работает)

$path="C:\\Base\\1c_base";
$myCom = new COM("V77.Application") or die("Unable to instantiate");
if ($myCom->Initialize($myCom->RMTrade,"/d$path /nUser /pPassword","NO_SPLASH_SHOW")==0)
   echo "ERROR [$path]";
else
   echo "OK! [$path]";


Для подключения удаленного сервера используется следующий код PHP

$path="C:\\Base\\1c_base";
$server="192.168.1.2";   //$server="Server1C";
$myCom = new COM("V77.Application",$server) or die("Unable to instantiate");
if ($myCom->Initialize($myCom->RMTrade,"/d$path /nUser /pPassword","NO_SPLASH_SHOW")==0)
   echo "ERROR [$path]";
else
   echo "OK! [$path]";

Ответ сервера:
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `V77.Application': Отказано в доступе. ' in F:\home\test\www\index.php:9 Stack trace: #0 F:\home\test\www\index.php(3): com->com('V77.Application', '192.168.1.2') #1 {main} thrown in F:\home\test\www\index.php on line 3

Была мысль, что нужна авторизация, в мануалах PHP практически нет примеров (и толкогого описания) авторизованного доступа, есть строчка: «If server_name is an array, it should contain the following elements (case sensitive!). Note that they are all optional (although you need to specify both Username and Password together); if you omit the Server setting, the default server will be used (as mentioned above), and the instantiation of the object will not be affected by the directive.», тогда поменял код и добавил авторизацию ассоциированным массивом:

$path="C:\\Base\\1c_base";
$server=array("Server"=>"192.168.1.2","Username"=>"user1","Password"=>"MyPassword");
$myCom = new COM("V77.Application",$server) or die("Unable to instantiate");
if ($myCom->Initialize($myCom->RMTrade,"/d$path /nUser /pPassword","NO_SPLASH_SHOW")==0)
   echo "ERROR [$path]";
else
   echo "OK! [$path]";

Ответ сервера:
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `V77.Application': Сервер RPC недоступен. ' in F:\home\test\www\index.php:3 Stack trace: #0 F:\home\test\www\index.php(3): com->com('V77.Application', Array) #1 {main} thrown in F:\home\test\www\index.php on line 3

Как видим это не массив.

Еще была мысль, что это структура (класс), попробовал следующим кодом:

class myClass {
   var $Server='192.168.1.2';
   var $Username='user1';
   var $Password='MyPassword';
}

$server= new myClass();
$path="C:\\Base\\1c_base";
$myCom = new COM("V77.Application",$server) or die("Unable to instantiate");
if ($myCom->Initialize($myCom->RMTrade,"/d$path /nUser /pPassword","NO_SPLASH_SHOW")==0)
   echo "ERROR [$path]";
else
   echo "OK! [$path]";

Ответ сервера:
Fatal error: Uncaught exception 'com_exception' with message 'Could not create COM object - invalid arguments!' in F:\home\test\www\index.php:9 Stack trace: #0 F:\home\test\www\index.php (9): com->com('V77.Application', Object(myClass)) #1 {main} thrown in F:\home\test\www\index.php on line 9

Тоже не подошло...

Системный администратор клянется и божиться, что доступ до объекта имеется. Пробовали и через определенного пользователя и давали доступ для всех пользователей, не помогло.

У кого имеется опыт в данном вопросе, прошу подскажите, каким образом организовать связь с DCOM-объектом удаленного сервера? Желательно авторизованный доступ, но мне будет интересен и опыт не авторизованного доступа.

Herby

new COM("V77.Application",$server)

а вы уверены что эта правильная запись?

эта конструкция: new COM("V77.Application") просто создает объект V77, и сервер в эту конструкцию впихнуть по моему не получится.

по идее локальный вариант, который рабочий вариант - должен работать и для сетевого. просто нужно указывать путь к базе не тот который локальный, а уже сетевой путь.

dima_si

Цитата: Herby от 28 мар 2013, 13:15
new COM("V77.Application",$server)

а вы уверены что эта правильная запись?

эта конструкция: new COM("V77.Application") просто создает объект V77, и сервер в эту конструкцию впихнуть по моему не получится.

по идее локальный вариант, который рабочий вариант - должен работать и для сетевого. просто нужно указывать путь к базе не тот который локальный, а уже сетевой путь.
Да, конечно, вы рассуждаете логично. Но дело в том, что DCOM объект расположен на другом сервере. В мануалах есть такой синтаксис, вот только со вторым параметром я так до конца и не разобрался.

$obj = new COM("Application.ID")
Methods
COM::COM ( string $module_name [, mixed $server_name [, int $codepage [, string $typelib ]]] )

Herby

Цитировать
Но дело в том, что DCOM объект расположен на другом сервере.

ну и что? ну подключаются же без проблем базы 1С к другу другу, даже если физически находятся на разных серверах.

вы пробовали указывать сетевой путь к базе?

и кстати вот нашел на примере 8:


// OLE

OLE_Соединение=СоздатьОбъект("V81.application");

// COM

COM_Соединение=СоздатьОбъект("V81.COMConnector");


и может для вашего примера, поскольку у вас COM подключение .application не подходит? хотя если локально работает, то не в этом дело.

в общем пробуйте указать сетевой путь к базе


dima_si

Цитата: Herby от 28 мар 2013, 15:09
Цитировать
Но дело в том, что DCOM объект расположен на другом сервере.

ну и что? ну подключаются же без проблем базы 1С к другу другу, даже если физически находятся на разных серверах.

вы пробовали указывать сетевой путь к базе?

и кстати вот нашел на примере 8:


// OLE

OLE_Соединение=СоздатьОбъект("V81.application");

// COM

COM_Соединение=СоздатьОбъект("V81.COMConnector");


и может для вашего примера, поскольку у вас COM подключение .application не подходит? хотя если локально работает, то не в этом дело.

в общем пробуйте указать сетевой путь к базе
Нет, не работает.
$myCom = new COM("V77.Application",$mas) or die("Unable to instantiate");

вышеприведенная строка, создает COM объект, переменная $mas задает размещение COM объекта, и собственно на данную строчку ругается компилятор.
пробовал подсунуть в эту строчку путь до шары с базой, результат отрицательный. "Сервер RPC недоступен", все же здесь он ждет размещение COM объекта, нежели базы.

Herby

Цитата: dima_si от 29 мар 2013, 07:28все же здесь он ждет размещение COM объекта, нежели базы.

а здесь и не надо, база указывается в строке Initialize(...

либо с путями что-то не то, либо с правами.

ну я просто тогда не понимаю почему не работает.... такая конструкция (ваш первый вариант рабочего кода)  без проблем работает если подключаются две базы 1С друг к другу. и для системы пофигу подключаются 1С друг к другу или стороннее приложение к 1С. Отличий быть не должно.


Цитата: dima_si от 29 мар 2013, 07:28переменная $mas задает размещение COM объекта, и собственно на данную строчку ругается компилятор.

а в справке подобные примеры не описаны?

dima_si

Цитата: Herby от 29 мар 2013, 09:26
Цитата: dima_si от 29 мар 2013, 07:28все же здесь он ждет размещение COM объекта, нежели базы.

а здесь и не надо, база указывается в строке Initialize(...

либо с путями что-то не то, либо с правами.

ну я просто тогда не понимаю почему не работает.... такая конструкция (ваш первый вариант рабочего кода)  без проблем работает если подключаются две базы 1С друг к другу. и для системы пофигу подключаются 1С друг к другу или стороннее приложение к 1С. Отличий быть не должно.


Цитата: dima_si от 29 мар 2013, 07:28переменная $mas задает размещение COM объекта, и собственно на данную строчку ругается компилятор.

а в справке подобные примеры не описаны?
в том то и дело, что локально все замечательно работает
в справке написано, что есть такая возможность, вот названия переменных, а примеров не приведено. показаны лишь локальные подключения.
http://www.php.net/manual/ru/class.com.php

вопрос наверное в том, что если 1С конектить с 1С на другом сервере через шару, то для соединения используется DCOM текущей машины, у меня же ситуация, что на текущей машине нет объекта DCOM и быть не может, т.к. сервер win2008 (64 бита), следовательно 1С 7.7 сюда не встанет (пользуемся только легальным ПО). Если только есть легальный способ установить 1С 7.7 на 64 бита...

Herby

Цитата: dima_si от 29 мар 2013, 10:04т.к. сервер win2008 (64 бита), следовательно 1С 7.7 сюда не встанет (пользуемся только легальным ПО). Если только есть легальный способ установить 1С 7.7 на 64 бита...

поэтому и не работает.
7.7 ставится легально на x64. читайте форумы, про это много где написано.

Добавлено: 29 мар 2013, 10:28


http://tavalik.ru/index.php/ustanovka_1c_x64/

dima_si

Цитата: Herby от 29 мар 2013, 10:26
Цитата: dima_si от 29 мар 2013, 10:04т.к. сервер win2008 (64 бита), следовательно 1С 7.7 сюда не встанет (пользуемся только легальным ПО). Если только есть легальный способ установить 1С 7.7 на 64 бита...

поэтому и не работает.
7.7 ставится легально на x64. читайте форумы, про это много где написано.

Добавлено: 29 мар 2013, 10:28


http://tavalik.ru/index.php/ustanovka_1c_x64/

спасибо за ссылочку да и вообще за участие - передам сисадмину эту ссылочку...
как вариант решения проблемы данный способ пройдет, но все же тема так до конца и не раскрыта, но хотя бы не в таком темпе решать данный вопрос...
если вдруг решу данную проблему именно задуманным способом - отпишусь

Теги: 1C PHP DCOM 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск