Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
15 Дек 2017, 20:58
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

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

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

Оффлайн dima_si

  • *
  • Сообщений: 5
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-28
  • Сайт: 
  • Профессия: Программист 1С
Уважаемые форумчане, прошу помощи в решении своего вопроса, возможно, кто-то сталкивался с вопросами интеграции 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

  • *****
  • Сообщений: 936
  • РЕПУТАЦИЯ: 164
  • КПД: 18%
  • Регистрация: 2010-08-31
  • Сайт: 
  • Профессия: Программист 7.7
new COM("V77.Application",$server)

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

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

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

Оффлайн dima_si

  • *
  • Сообщений: 5
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-28
  • Сайт: 
  • Профессия: Программист 1С
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

  • *****
  • Сообщений: 936
  • РЕПУТАЦИЯ: 164
  • КПД: 18%
  • Регистрация: 2010-08-31
  • Сайт: 
  • Профессия: Программист 7.7
Цитировать
Но дело в том, что DCOM объект расположен на другом сервере.

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

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

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

// OLE

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

// COM

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

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

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


Оффлайн dima_si

  • *
  • Сообщений: 5
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-28
  • Сайт: 
  • Профессия: Программист 1С
Цитировать
Но дело в том, что 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

  • *****
  • Сообщений: 936
  • РЕПУТАЦИЯ: 164
  • КПД: 18%
  • Регистрация: 2010-08-31
  • Сайт: 
  • Профессия: Программист 7.7
все же здесь он ждет размещение COM объекта, нежели базы.

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

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

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


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

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

Оффлайн dima_si

  • *
  • Сообщений: 5
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-28
  • Сайт: 
  • Профессия: Программист 1С
все же здесь он ждет размещение COM объекта, нежели базы.

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

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

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


переменная $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

  • *****
  • Сообщений: 936
  • РЕПУТАЦИЯ: 164
  • КПД: 18%
  • Регистрация: 2010-08-31
  • Сайт: 
  • Профессия: Программист 7.7
т.к. сервер 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

  • *
  • Сообщений: 5
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-03-28
  • Сайт: 
  • Профессия: Программист 1С
т.к. сервер 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 
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
180 Сообщений
ilyay ilyay
69 Сообщений
alex0402
54 Сообщений
oleg-x
48 Сообщений
AIFrame
46 Сообщений
andron81_81
44 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
Golickoff Golickoff
31 Сообщений
BuhRust
30 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 263
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal