babki
21-05-2007, 13:15
У нас есть сервер Виндовс2000сервер. К нему в терминальном режиме (citrix) подключаются клиенты и работают с программой 1С: бухгалтерия.
Есть программа, установленная на сервере под учетной записью администратора. Ее смысл – получения данных с весов (до 10 весов можно подключить одновременно, значение с одних весов должны сниматься для 1клиента, вторых весов – для 2 клиента и тд.) через адаптер подключенный к одному сом порту сервера. Она запускается на сервере и с помощью OLE-технологии может передавать данные в другие программы в частности с 1С бухгалтерию. Вот ее описание:
"Controller.exe – программа связи с оборудованием.
Описание программы.
Программа Controller.exe создана для осуществления доступа к значению текущего веса снимаемого весовым терминалом с тензодатчиков, а так же для поддержки функционирования другого оборудования,например считывателя электронных карточек. Информация поступает в персональный компьютер по интерфейсам RS/232 или RS/485 согласно протоколу обмена.
Controller.exe является полным сервером OLE автоматизации (full server OLE Automation), поэтому может использоваться и как самостоятельное приложение для индикации текущего веса на экране дисплея компьютера, и как компонента сложного многокомпонентного приложения, предоставляя свои методы внешним программам.
В настоящее время большинство офисных и бухгалтерских систем поддерживают OLE-автоматизацию и имеют встроенный язык программирования на котором взаимодействие с внешними компонентами является простым и интуитивно понятным. Встроенный интерпретатор языка сам выполнит всю трудоемкую работу по взаимодействию приложения и внешних компонент, скрыв все детали от офисного программиста. Единственное требование – эти компоненты должны быть зарегистрированными в реестре Windows серверами OLE автоматизации. Этому требованию полностью удовлетворяет программа Controller.exe. Она поддерживает технологию OLE Automation и сама регистрируется в реестре при запуске в качестве обычного приложения Windows. Подчеркнем, т.к. это очень важно, что для использования программы совместно с другими приложениями, необходимо первый раз запустить ее самостоятельно для саморегистрации в реестре Windows. Это же необходимо делать всякий раз при изменении местоположения программы Controller.exe. Под запуском программы подразумевается старт и завершение работы приложения.
Программа экспортирует 4 метода.
Методы:
GetStatus(AdrTerm,ChannelN) - получить текущий статус;
GetWeight(AdrTerm,ChannelN) - получить значение веса;
SetNull(AdrTerm,ChannelN) - обнулить показания (установка нуля).
GetCount(AdrTerm,ChannelN,CountN) - получить показание счетчика.
Все методы, за исключением GetCount, имеют по 2 входных параметра – адрес терминала,№ канала. Входные параметры представляют собой целые числа : AdrTerm от 0 до 255(0 для 232 интерфейса), ChannelN - 1 или 2. ChannelN никак не связан с № СОМ-порта, иными словами 1 канал не обязательно может быть на СОМ1. Метод GetCount помимо аналогичных первых двух параметров имеет дополнительный третий входной параметр – номер счетчика, представляющий собой целое число.
В случае возникновения нестандартных ситуаций, методы могут возвращать следующие значения :
-5000 и -5001 - «Терминал не обнаружен» и «С терминалом нет связи» соответственно. Справедливо
для всех методов.
-5002 - «Команда не поддерживается» для метода GetCount , «Команда выполнена» для метода
SetNull, «Вес стабилен» для метода GetStatus.
-5003 - «Выход за границы диапазона» для метода GetCount, «Вес не стабилен» для метода
GetStatus.
Пример работы с программой в “1С:Предприятие”.
В “Глобальный модуль” поместить код создания объекта. Для этого в секции объявления глобальных переменных объявить соответствующую переменную.
Перем ТВ003 Экспорт;
А в процедуре ПриНачалеРаботыСистемы создать объект
ТВ003 = СоздатьОбъект(“OSScales.ScAuto”);
Создать новый документ или взять существующий, на форме разместить кнопку “Получить вес”, вызывать окно свойств для этой кнопки и на закладке “Дополнительно” в окне “Формула” указать функцию “Опрос()”, которая будет выполняться при нажатии кнопки. Осталось только щелкнув по закладке “Модуль” формы определить функцию Опрос ().
Процедура Опрос()
Var Res
Res = ТВ003.GetStatus(1,1);
Сообщить(“Текущий статус ”+Строка(Res));
Res = ТВ003.GetWeight(1,1);
Сообщить(“Текущий вес ”+Строка(Res));
Res = ТВ003.GetCount(1,1,5);
Сообщить(“Значение счетчика ”+Строка(Res));
Res = ТВ003.SetNull(1,1);
Сообщить(“Состояние обнуления ”+Строка(Res));
КонецПроцедуры."
На самом сервере, под учетной записью администратора значение веса корректно снимаются с любых весов как с помощью самой программы, так и с помощью вызываемых методов через 1С. См. пример выше.
Проблема в том что клиенты (с правами пользователей), работающие в терминале не могут получить значение веса с нужных весов- выдается значение 0. В чем может быть проблема? Технология ОLE может корректно работать в терминальном режиме? Кто основательно знает эту технологию- расскажите в чем может быть загвоздка?
Может ли теоретически клиент в терминале с правами пользователя работать с программой, запущенной другим пользователем – администратором на сервере через технологию OLE?
Может нужно запустить данную программу в качестве службы(программа представляет из себя файл controller.exe c аппаратной защитой ключом hasp-usb)- как это сделать? И с какими правами лучше это сделать (NT Authority , system,администратор)?
В реестре объект OLE программы зарегистрировался так с разрешениями для пользователей «только чтение»
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}]
@="ScAuto Object"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\LocalServer32]
@="c:\\Controller\\Controller.exe"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\ProgID]
@="Controller.ScAuto"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\TypeLib]
@="{D6AEB295-05A2-4D41-A82F-21CB4BE5958F}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\Version]
@="1.0"
У кого какие есть мысли по этому поводу, выскажите их…
Есть программа, установленная на сервере под учетной записью администратора. Ее смысл – получения данных с весов (до 10 весов можно подключить одновременно, значение с одних весов должны сниматься для 1клиента, вторых весов – для 2 клиента и тд.) через адаптер подключенный к одному сом порту сервера. Она запускается на сервере и с помощью OLE-технологии может передавать данные в другие программы в частности с 1С бухгалтерию. Вот ее описание:
"Controller.exe – программа связи с оборудованием.
Описание программы.
Программа Controller.exe создана для осуществления доступа к значению текущего веса снимаемого весовым терминалом с тензодатчиков, а так же для поддержки функционирования другого оборудования,например считывателя электронных карточек. Информация поступает в персональный компьютер по интерфейсам RS/232 или RS/485 согласно протоколу обмена.
Controller.exe является полным сервером OLE автоматизации (full server OLE Automation), поэтому может использоваться и как самостоятельное приложение для индикации текущего веса на экране дисплея компьютера, и как компонента сложного многокомпонентного приложения, предоставляя свои методы внешним программам.
В настоящее время большинство офисных и бухгалтерских систем поддерживают OLE-автоматизацию и имеют встроенный язык программирования на котором взаимодействие с внешними компонентами является простым и интуитивно понятным. Встроенный интерпретатор языка сам выполнит всю трудоемкую работу по взаимодействию приложения и внешних компонент, скрыв все детали от офисного программиста. Единственное требование – эти компоненты должны быть зарегистрированными в реестре Windows серверами OLE автоматизации. Этому требованию полностью удовлетворяет программа Controller.exe. Она поддерживает технологию OLE Automation и сама регистрируется в реестре при запуске в качестве обычного приложения Windows. Подчеркнем, т.к. это очень важно, что для использования программы совместно с другими приложениями, необходимо первый раз запустить ее самостоятельно для саморегистрации в реестре Windows. Это же необходимо делать всякий раз при изменении местоположения программы Controller.exe. Под запуском программы подразумевается старт и завершение работы приложения.
Программа экспортирует 4 метода.
Методы:
GetStatus(AdrTerm,ChannelN) - получить текущий статус;
GetWeight(AdrTerm,ChannelN) - получить значение веса;
SetNull(AdrTerm,ChannelN) - обнулить показания (установка нуля).
GetCount(AdrTerm,ChannelN,CountN) - получить показание счетчика.
Все методы, за исключением GetCount, имеют по 2 входных параметра – адрес терминала,№ канала. Входные параметры представляют собой целые числа : AdrTerm от 0 до 255(0 для 232 интерфейса), ChannelN - 1 или 2. ChannelN никак не связан с № СОМ-порта, иными словами 1 канал не обязательно может быть на СОМ1. Метод GetCount помимо аналогичных первых двух параметров имеет дополнительный третий входной параметр – номер счетчика, представляющий собой целое число.
В случае возникновения нестандартных ситуаций, методы могут возвращать следующие значения :
-5000 и -5001 - «Терминал не обнаружен» и «С терминалом нет связи» соответственно. Справедливо
для всех методов.
-5002 - «Команда не поддерживается» для метода GetCount , «Команда выполнена» для метода
SetNull, «Вес стабилен» для метода GetStatus.
-5003 - «Выход за границы диапазона» для метода GetCount, «Вес не стабилен» для метода
GetStatus.
Пример работы с программой в “1С:Предприятие”.
В “Глобальный модуль” поместить код создания объекта. Для этого в секции объявления глобальных переменных объявить соответствующую переменную.
Перем ТВ003 Экспорт;
А в процедуре ПриНачалеРаботыСистемы создать объект
ТВ003 = СоздатьОбъект(“OSScales.ScAuto”);
Создать новый документ или взять существующий, на форме разместить кнопку “Получить вес”, вызывать окно свойств для этой кнопки и на закладке “Дополнительно” в окне “Формула” указать функцию “Опрос()”, которая будет выполняться при нажатии кнопки. Осталось только щелкнув по закладке “Модуль” формы определить функцию Опрос ().
Процедура Опрос()
Var Res
Res = ТВ003.GetStatus(1,1);
Сообщить(“Текущий статус ”+Строка(Res));
Res = ТВ003.GetWeight(1,1);
Сообщить(“Текущий вес ”+Строка(Res));
Res = ТВ003.GetCount(1,1,5);
Сообщить(“Значение счетчика ”+Строка(Res));
Res = ТВ003.SetNull(1,1);
Сообщить(“Состояние обнуления ”+Строка(Res));
КонецПроцедуры."
На самом сервере, под учетной записью администратора значение веса корректно снимаются с любых весов как с помощью самой программы, так и с помощью вызываемых методов через 1С. См. пример выше.
Проблема в том что клиенты (с правами пользователей), работающие в терминале не могут получить значение веса с нужных весов- выдается значение 0. В чем может быть проблема? Технология ОLE может корректно работать в терминальном режиме? Кто основательно знает эту технологию- расскажите в чем может быть загвоздка?
Может ли теоретически клиент в терминале с правами пользователя работать с программой, запущенной другим пользователем – администратором на сервере через технологию OLE?
Может нужно запустить данную программу в качестве службы(программа представляет из себя файл controller.exe c аппаратной защитой ключом hasp-usb)- как это сделать? И с какими правами лучше это сделать (NT Authority , system,администратор)?
В реестре объект OLE программы зарегистрировался так с разрешениями для пользователей «только чтение»
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}]
@="ScAuto Object"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\LocalServer32]
@="c:\\Controller\\Controller.exe"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\ProgID]
@="Controller.ScAuto"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\TypeLib]
@="{D6AEB295-05A2-4D41-A82F-21CB4BE5958F}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{249E3377-BEB3-4681-A746-D39EFDFF4E0F}\Version]
@="1.0"
У кого какие есть мысли по этому поводу, выскажите их…