Переключение на Главную Страницу Страницы: [1] 2 3 ... 7 ОтправитьПечать
Очень популярная тема (более 25 ответов) Сервер приложений для v7 (число прочтений - 24188 )
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Сервер приложений для v7
15. Мая 2007 :: 16:03
Печать  
В продолжение темы, начатой тут.
kms писал(а) 15. Мая 2007 :: 07:19:
1. "Сервер" - просто внешний процесс. Он принимает соединения, создает несколько экземпляров 1С в качестве "working threads" и диспетчеризует запросы клиентов в вызовы необходимых процедур модулей ("адресатов") с переданными параметрами.
Может принимать набор даных от клиента и возвращать набор данных клиенту.

2. "Клиент" - для 1С можно сделать компоненту.
Ее функция - в установлении соединения с сервером, авторизации и поддержке протокола обмена.
В 1С нужны всего несколько методов, обеспечивающих посылку данных конкретному "адресату" и прием данных в синхронном и асинхронном режимах.

Авторизация, особенности протокола, обработка ошибок, методы упаковки данных - это детали.


Набросал вот простенький компонент v7AppServer.Connection.
Что нужно, чтобы это заработало:
  • распаковать куда-нибудь файл v7AppServer.dll из архива и выполнить regsvr32 v7AppServer.dll
  • создать COM+ приложение:
    • Панель управления -> Администраирование -> Службы компонентов
    • в дереве консоли найти узел "Приложения Com+" и в контекстном меню этого узла выбрать Создать -> Приложение
    • в мастере установки нажать кнопку "создать новое приложение" и ввести имя приложения "v7AppServer"
    • Способ активации выбрать "серверное приложение" и проклацать "далее" до завершения работы мастера
  • Создать компонент в приложении
    • в только что созданном приложении найти группу "Компоненты" и в контекстном меню выбрать "Создать -> Компонент"
    • в мастере установки компонентов нажать "Установка новых компонентов", указать путь к файлу v7AppServer.dll и нажать "Готово"
    • в свойствах компонента, на закладке "Активация" включить группировку объектов в пул и указать минимальный и максимальный размер пула (например 3 и 10)
    • включить флажок "Включить создание объектов" и в поле "строка конструктора" написать параметры командной строки для 1С (например: /dC:\BAZA\ /NБот /P123)
  • Запустить приложение (через контекстное меню v7AppServer)
    После этого в списке процессов должны появиться n процессов 1cv7.exe, где n-минимальный размер пула объектов
  

v7AppServer.rar ( 6 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #1 - 15. Мая 2007 :: 16:17
Печать  
Пользователь 1С, под которым запускаются "working threads" не должен иметь в настройках рабочий каталог (чтобы могло запуститься несколько экземпляров 1С от этого пользователя).
Клиентское приложение может создавать экземпляры класса v7AppServer.Connection и пользоваться его свойством AppDispatch.
Это свойство аналогично v77.Application при доступе к 1С по OLE.
Каждый клиент, который пытается создать объект v7AppServer.Connection, будет получать его из пула объектов (если есть свободные объекты в пуле) и по окончании работы с ним будет возвращать объект в пул.
Проверить, что AppServer работает, можно при помощи скрипта:
Код
Выбрать все
set v7=CreateObject("v7AppServer.Connection")
MsgBox v7.AppDispatch.EvalExpr("РабочаяДата()") 


Мне пока не удается создать экземпляр v7AppServer.Connection на удаленном компьютере. Но это скорее всего решается настройками DCOM.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #2 - 15. Мая 2007 :: 16:18
Печать  
Что скажет коллективный разум?
Имеет смысл развивать? и если да, то в каком направлении?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Сервер приложений для v7
Ответ #3 - 15. Мая 2007 :: 16:23
Печать  
steban писал(а) 15. Мая 2007 :: 16:18:
Что скажет коллективный разум?
Имеет смысл развивать? и если да, то в каком направлении?

Да, наверное, стоит.
Если объяснишь простыми словами и пример, для чего это нужно. Улыбка
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #4 - 15. Мая 2007 :: 17:20
Печать  
Ну, например, для создания веб-приложений, работающих с 1С.
Или для задач, которые описал Миша kms писал(а) 15. Мая 2007 :: 07:19:
Для чего это нужно:
1. Иногда нужно в оперативном режиме закинуть данные в некую базу, которая находится х.з.
Web расширение не катит (нужем привычный клиент), Terminal - тоже не подходит.
2. Иногда нужно опять же оперативно получать данные из множества мест и релировать их каким-то образом.
То же самое, ни web, ни ts, ни распределенка не подходят.

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #5 - 15. Мая 2007 :: 17:30
Печать  
Компонента просто запускает 1С с параметрами, переданными в строке конструктора, по OLE, удерживает ссылку на 1С и отдает эту ссылку через своё свойство AppDispatch.
Пулинг объектов обеспечивает COM+.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервер приложений для v7
Ответ #6 - 15. Мая 2007 :: 18:43
Печать  
vip

Реально по механике очень похоже на v7web, только лучше.
В принципе, можно делать любой web интерфейс через тот же cgi+web сервер.
Можно писать скрипты, причем в отличие от непосредственного использования v77.Application, здесь есть пулинг воркеров и время жизни воркера не привязано к времени жизни объекта.

steban

Степ, это очень здорово.
Странно, что никто не сделал такое решение раньше.
Наверное, повода не было.

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

Серьезный вопрос у меня только один.
Будет ли это работать в глобальных (неустойчивых, медленных, открытых) сетях?
Надо пробовать.

Еще будет вопрос прохождения трафика DCOM через маршрутизаторы.
Тут надо что-то придумывать.
Или как-то туннелировать DCOM - трафик (никогда этого не делал)
Или везде делать VPN (видимо, от этого все равно никуда не деться, шифровать трафик тоже надо).

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

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


P.S.
Любовь это вам не просто так, ей занимацца нужно... (с) Кнышев
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #7 - 15. Мая 2007 :: 18:57
Печать  
Вах... Степан, побольше бы таких людей как ты! мне идея очень нравится, если можно будет сделать WEB доступ к базе, то... в общем давно мечтаю! Я за!


P.S. trdm, я ж говорил, что в курилке и рождаются мега проекты Улыбка
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #8 - 15. Мая 2007 :: 21:43
Печать  
steban писал(а) 15. Мая 2007 :: 16:18:
Что скажет коллективный разум?
Имеет смысл развивать? и если да, то в каком направлении?

Шутдаун нужен вроде. По расписанию и программно....
И вообще, Степ, ты бы полегче с иновациями ))) не дай бог в тираж пойдут, спины не рагогнешь...
Arta писал(а) 15. Мая 2007 :: 18:57:
P.S. trdm, я ж говорил, что в курилке и рождаются мега проекты Улыбка

провокатор...... а вообще я так думаю не все так просто тут...
  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #9 - 15. Мая 2007 :: 22:22
Печать  
Степ,
Цитата:
V7 = СоздатьОбъект("v7AppServer.Connection");
{\\TSS\SHARE\BASES\BASE\DEVELOP\ТЕСТ.ERT(4)}: Неудачная попытка создания объекта (v7AppServer.Connection)


а в ивент логе вижу
Цитата:
The system has called a custom component and that component has failed and generated an exception. This indicates a problem with the custom component. Notify the developer of this component that a failure has occurred and provide them with the information below.
Component Prog ID:
Method Name: IObjectConstruct::Construct
Server Application ID: {2255F767-E87E-47B1-BB56-B195CB924443}
Server Application Instance ID:
{26AC525B-2BFB-4580-A0B4-DF20594FD85E}
Server Application Name: v7AppServer
The serious nature of this error has caused the process to terminate.
Exception: C0000005
Address: 0x100018BB
Call Stack:
V7APPSERVER!DllUnregisterServer + 0x429
COMSVCS!CoLoadServices + 0x2a33
ole32!CoInitializeSecurity + 0x3a2b
COMSVCS!DispManGetContext + 0x1da85
COMSVCS!DispManGetContext + 0x1e3ef
COMSVCS!DispManGetContext + 0x1e466
COMSVCS!DispManGetContext + 0x1e47c
COMSVCS!DispManGetContext + 0x1e50e
COMSVCS!DispManGetContext + 0x1e5fe
COMSVCS!CoCreateActivity + 0xae8
COMSVCS!CoCreateActivity + 0xac8
COMSVCS!RegisterComEvents + 0x50935
COMSVCS!RegisterComEvents + 0x50b0b
msvcrt!_endthreadex + 0xa3
kernel32!GetModuleHandleA + 0xdf


For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.



P.S. Процесы в системе появились, только один из них постоянно показывает 49-50% загрузки CPU.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #10 - 15. Мая 2007 :: 22:27
Печать  
С третьей попытки заработало!
Хмм... прикольно  Подмигивание
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #11 - 15. Мая 2007 :: 22:58
Печать  
50% загрузки остается, но работает.
Проэкспериментировал на всем, где можно, работает

Пошел играться с php Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #12 - 16. Мая 2007 :: 06:03
Печать  
Хорошая штука, Степану огромное спасибо.
Нужно потестить.
И с удаленным доступом интересно проверить.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #13 - 16. Мая 2007 :: 07:26
Печать  
Есть ведь некоторый предел на количество одновременно запущенных одинэсов. Как собираешься это решать?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервер приложений для v7
Ответ #14 - 16. Мая 2007 :: 07:43
Печать  
trdm писал(а) 15. Мая 2007 :: 21:43:
Шутдаун нужен вроде. По расписанию и программно....

Через WMI можно стартовать/останавливать COM+ приложения.
Кажется можно даже создавать приложения и управлять настройкой компонент.
И еще у COM+ приложений есть настройка "запустить как службу NT". Потом можно обращаться с приложением как с обычной службой.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 7
ОтправитьПечать