1с считать данные с com порта
В этой статье я расскажу о многих особенностях взаимодействия между базами 1С по COM технологии, накопленных за годы развития и использования интеграционного коммерческого продукта 2iS:Интеграция нашей компании 2iS.
Термины
ОС – операционная система
COM-клиент – процесс(поток) ОС, запросивший создание COM-объекта
COM-сервер – COM-объект, созданный по запросу клиента
Издание платформы – подстрока до 2-й точки версии платформы (например 8.2, 8.3)
Automation-сервер – он же OLE-сервер, COM-объект V8X.Application для создания приложений 1С
Сборка платформы – полная строка версии платформы (например 8.2.19.130, 8.2.16.352)
COM классы платформы
Виды COM классов
Для каждого издания платформы в системном реестре регистрируются собственные классы для взаимодействия с базами. Символ “X” обозначает место подстановки номера издания платформы (например 0,1,2,3,4).
С помощью данного объекта выполняется установка внешнего соединения с информационной базой 1С:Предприятия 8 и администрирование кластера серверов. С помощью одного экземпляра объекта может быть установлено неограниченное число соединений.
Отмена регистрации: Regsvr32 “incomcntr.dll” /u
V8X.Application — Automation-сервер толстого клиента
Предоставляет доступ ко всем свойствам и методам глобального контекста клиентского приложения, а также включение и выключение пользовательского интерфейса (главного окна приложения).
Может запускать как обычное, так и управляемое приложение в зависимости от параметров конфигурации и пользователя базы, но явно задавать тип приложения нельзя.
Отмена регистрации — 1cv8.exe /unregserver
V8Xc.Application — Automation-сервер тонкого клиента
Предоставляет доступ ко всем свойствам и методам глобального контекста клиентского приложения, а также включение и выключение пользовательского интерфейса (главного окна приложения).
Отмена регистрации — 1cv8c.exe /unregserver
Привязка COM классов к dll-файлам
Привязка имени COM класса к конкретному dll-файлу осуществляется через ветку HKEY_CLASSES_ROOT системного реестра, которая собирается следующим образом :
Берется содержимое ветки HKEY_CURRENT_USERSoftwareClasses
Добавляется содержимое ветки HKEY_LOCAL_MACHINESoftwareClasses, но только те ключи, которые отсутствуют в п.1.
Поэтому регистрация класса от имени пользователя имеет приоритет над общей регистрацией.
64-b — c:Program Files1cv8*incomcntr.dll
32-b — c:Program Files (x86)1cv8*incomcntr.dll
Подключение внешнего соединения
Рассмотрим алгоритм подключения внешнего соединения в деталях
Если издание платформы COM-клиента совпадает с изданием платформы COM-сервера, то также требуется равенство сборки платформы COM-клиента и COM-сервера.
Он регистрируется при установке платформы с опцией «Внешнее соединение». В любой момент его можно зарегистрировать командой «Regsvr32 comcntr.dll» в каталоге исполняемых файлов платформы.
COM-объект создается в памяти COM-клиента
Затраты на создание примерно – 0.01(первое)/0.001(второе) cек
КомСоединитель = Новый COMОбъект ( “V83 . ComConnector” );
ВнешнееСоединение = КомСоединитель . Connect ( СтрокаСоединения );
Внепроцессное локальное (local)
COM-объект создается в памяти служебного хост-процесса (dllhost.exe) на компьютере COM-клиента
Затраты на создание примерно – 0.06(первое)/0.03(второе) сек
КомСоединитель = Новый COMОбъект ( “V83 . ComConnector” );
ВнешнееСоединение = КомСоединитель . Connect ( СтрокаСоединения );
Внепроцессное нелокальное (DCOM)
Необходимо настроить на нелокальном компьютере роль «Сервер приложений»/«Application server» и включить нелокальный доступ к COM+, выбрав опцию «Сетевой доступ к COM+»/”COM+ network access”. Подробнее рассмотрено далее.
COM-объект создается в памяти служебного хост-процесса (dllhost.exe) на другом компьютере
Затраты на создание примерно
Задержка канала, мс
Длительность создания COM-объекта, мс
На графике видно, что длительность создания этого COM-объекта прямо пропорциональна задержке канала и коэффициент пропорциональности составляет примерно 24. Можно предположить, что при создании этого COM-объекта происходит 24 вызова через канал.
КомСоединитель = Новый COMОбъект ( “V83 . ComConnector” , ИмяКомпьютера );
ВнешнееСоединение = КомСоединитель . Connect ( СтрокаСоединения );
2. Выполнение метода Connect (создание внешнего соединения)
Создание сеанса – 1 сек
Инициализация сеанса – [0;?] сек
Подгрузка нужных метаданных (кэш метаданных не используется)
Инициализация параметров сеанса
Подключение Automation-сервера (OLE)
Создание COM-объекта Automation-сервера (Имя класса — V8X.Application).
Затраты на создание примерно – 0.5 cек
Выполнение метода Connect
Создание сеанса – 1 сек
Инициализация сеанса – [0;?] сек
Подгрузка нужных метаданных (кэш метаданных используется, если база есть в списке пользователя)
AutomationСервер = Новый COMОбъект ( «V83.Application» );
AutomationСервер . Connect ( СтрокаСоединения );
Затраты на COM-вызовы
Каждый раз, когда мы обращаемся во встроенном языке к свойству или методу COM-объекта (выполняем COM-вызов), происходит ряд дополнительных действий по сравнению с обращением к родному объекту встроенного языка. Если COM-сервер находится в другом локальном процессе, то при этом еще сначала выполняется перенос всех параметров из COM-клиента в COM-сервер и в конце выполняется обратный перенос параметров в COM-клиент. Для такого переноса информация естественно должна быть сериализована на стороне отправителя и затем десериализована на стороне получателя, что в совокупности с некоторыми другими действиями получило название маршалинга и демаршалинга. В нелокальном режиме (DCOM) такой перенос будет еще тратить время на сетевые коммуникации и при первом обращении к новому COM-объекту на передачу его «скелета», и поэтому задержка канала будет играть решающую роль ( Подробнее о COM вызовах , DCOM в википедии , Технический обзор DCOM ,)
Соотношение затрат на вызов по типам расположения COM-сервера
Минимальные для внутрипроцессного Com-сервера
Средние для локального внепроцессного Com-сервера
От средних до больших для нелокального внепроцессного Cоm-сервера в зависимости от качества канала связи
Минимизация количества COM-вызовов
Создаем базовую внешнюю обработку с набором общих методов для приема вызовов от COM-клиента на стороне COM-сервера
Теперь нам не нужно изменять конфигурацию базы COM-сервера, чтобы использовать там сложный функционал.
В нашем продукте мы назвали ее «Сервисный процессор». На ее передачу и инициализацию уходит около 1 сек
Проектируем взаимодействие с COM-сервером по принципу «минимум COM-вызовов”, т.е. готовим все нужное на стороне COM-клиента и передаем в качестве параметров «большого» вызова
Создаем встроенную обработку для выполнения такого вызова в COM-клиенте
Передача агрегатных объектов
Сериализуем все входные параметры на стороне COM-клиента
Десериализуем все входные параметры на стороне COM-сервера
Сериализуем все выходные параметры на стороне COM-сервера
Десериализуем все выходные параметры на стороне COM-клиента
В нашем продукте мы назвали ее «Выполнение сервиса инфобазы»
Для многократных COM-вызовов предусматриваем регулируемую частоту
Например, информационные вызовы могут выполняться с изменяемой частотой
Обратная связь
При использовании принципа «минимум COM-вызовов» значительную часть времени код будет выполняться в чужом контексте, что серьезно усиливает некоторые неудобства COM-вызовов:
Нельзя прервать поток COM-Клиента и его соединение с сервером приложений 1С, пока не завершится вызов COM-сервера
У COM-Клиента нет информации о прогрессе выполнения вызова в COM-сервере
информацию о прогрессе выполнения
Схема принципа “минимум COM-вызовов”
Такая схема дружественна к большим задержкам каналов связи. Поэтому она во многом похожа на вызов веб-сервиса. А следовательно используя ее для COM взаимодействия, вы значительно снижаете затраты на возможные переходы между COM и веб-сервисом в обоих направлениях.
Отладка
При использовании принципа «минимум COM-вызовов» облегчить отладку выполнения кода на COM-сервере можно, сделав опциональное модальное окно подключения к базе в COM-клиенте. В этом окне должны быть возможности задания одноразовых параметров подключения, выполнения вспомогательных функций и просмотра информации о подключенном сеансе. Ниже в качестве примера показано такое окно из нашего продукта
Чтобы включить возможность отладки внешних соединений, в подкаталоге conf нужно создать файл comcntrcfg.xml с соответствующим содержимым. В окне подключения можно сделать кнопку/флажок для программного создания такого файла. Однако много версий платформы содержат ошибку, из-за которой предметы отладки внешних соединений не видны в отладчике даже с этим корректно настроенным файлом. На платформе 8.3 эти проблемы вроде бы решены.
Пример файла comcntrcfg.xml:
Также нельзя забывать о необходимости запускать конфигуратор для отладки с той же (до регистра букв) строкой соединения, что и предмет отладки. Поэтому в этом диалоге нужно сделать кнопку для запуска конфигуратора COM-сервера с правильной строкой соединения.
В какой-то мере обойти проблему невидимости предмета отладки внешнего соединения и ряд других неудобств можно путем однократного выполнения кода на толстом клиенте с заменой режима «Внешнее соединение» на «Automation-сервер» (приложение), т.е. используя COM класс V8X.Application и включенную видимость. Поэтому в окне подключения нужны параметры для выбора режима подключения.
После создания подключения на стороне COM-клиента обычно требуется подключение отладчика базы COM-сервера и установка там точки останова в нужном месте. Поэтому в окне подключения нужно расположить кнопку подключения отладчика/конфигуратора COM-сервера. Если COM-сервер запущен в режиме видимого приложения, то для подключения отладчика можно воспользоваться асинхронным вызовом исключения в нем. Из диалога с ошибкой в приложении COM-сервера через кнопку «Конфигуратор» можно будет открыть конфигуратор и в большинстве случаев сразу подключить отладчик. Если подключение отладчика таким способом недоступно, то оператору поможет отображение информации о сеансе (его номера) в базе COM-сервера. Также нужна кнопка открытия в открытом отладчике файла внешней обработки, которая будет выполняться в нем.
Управление COM+ приложениями 1С
Далее можно изменить тип активации (внутрипроцессный/внепроцессный) на закладке Активация/Activation.
В нашем продукте имеется инструмент «Управление COM классами 1С» для просмотра/регистрации/изменения всех COM классов и COM+ приложений 1С на указанном компьютере:
Настройка DCOM-сервера
Для Windows 2008 Server нужно добавить роль «Сервер приложений» (Application server). Для этого необходимо открыть панель управления компьютером, щелкнуть правой кнопкой мыши в ветки «Роли» и выбрать пункт меню «Добавить роль».
Появится око в котором необходимо выбрать роль «Сервер приложений»/»Application server». На этапе выбора ролей сервера приложений необходимо указать пункт «Сетевой доступ к COM+»/»COM+ network access». Если это не сделать, то при попытке создания COM-объекта вы будете получать ошибку «Ошибка при вызове конструктора (COMОбъект): The component or application containing the component has been disabled».
Настройка сетевого экрана
DCOM процессам для связи между собой динамически выдаются порты из диапазона (по умолчанию) от 1024 до 65535. Поэтому в сетевых экранах обоих компьютеров (com-клиента и com-сервера) должны быть открыты порты RPC (135, 139, 445, 593) и диапазон 1024-65535 (TCP/UDP).
Можно ограничить этот диапазон портов. Для этого открываем Администрирование – Службы компонентов (или в командной строке набираем dcomcnfg.exe). В открывшейся программе находим ветку «Мой компьютер» и открываем её свойства (см. скриншот).
В свойствах открываем вкладку «Набор протоколов», там, в свою очередь, открываем свойства «TCP/IP с ориентацией на подключения»
В свойствах TCP/IP по умолчанию – пустой список. В него можно добавить конкретный диапазон портов, которые будут использоваться DCOM. Какие именно порты выбрать – решать вам. Главное, чтобы не было других стандартных служб, уже занявших выбранные порты. Мне встречались рекомендации открывать не менее 1000 портов, так как очень многие системные программы используют DCOM. Так на скриншоте ниже я указываю, что DCOM должен работать по диапазону портов 20000-21000.
После этого нужно перезагрузить компьютер (перезапустить отдельно DCOM нельзя, слишком много на него завязано), и DCOM станет работать только по указанным портам.
Проблемы
Высокие затраты на подключение/инициализацию
Удержание com-серверов – эффективное средство борьбы. Варианты:
Повторное использование возвращаемых значений. Очищаются каждые 20 мин
Разные сборки платформы клиента и сервера при одинаковом издании платформы
Для обхода для каждой отличной от COM-клиента сборки платформы назначаем и настраиваем DCOM сервер
Отсутствие информации о типах вложенных в COM-объекты объектов 1С (вместо типа объекта 1С везде получаем тип «COMОбъект») и отсутствие контекстной подсказки по ним
Для обхода применяем принцип «минимум COM-вызовов»
При передаче исключения из COM-сервера оно принимает краткую форму из-за ошибки платформы
Для обхода оборачиваем каждый вызов на стороне COM-сервера в попытку и в исключении перевызываем исключение с полным описанием ошибки
При создании COM-объекта ошибка “Версия компоненты ‘comcntr’ (8.X.XX.XXX) отличается от версии корневого модуля ‘core82’ (8.X.YY.YYY)”
Для обхода создаем COM+ приложение с внепроцессной активацией. Тогда COM-сервер будет создаваться в отдельном процессе и совпадения версий этих модулей не потребуется.
Медленные каналы (большие задержки)
Каждой подсети за отдельным медленным каналом назначаем и настраиваем свой DCOM сервер и при обращении к базам за этим каналом COM-серверы создаем на этом компьютере, минимизируя количество и объемы вызовов Com-клиентCom-сервер
Кешируем (повторно используем) COM-серверы
Невозможно разорвать соединение рабочего процесса, в котором ожидается завершение вызова COM-сервера
Для обхода можно использовать создание COM-объектов в выделенных хост-процессах, настроив соответствующим образом COM+ приложение, и регистрировать идентификаторы этих процессов в привязке к сеансам COM-клиентов. Тогда при необходимости завершить серверное соединение такого сеанса можно сначала убить процесс COM-сервера, а потом и сам сеанс.
При обращении к COM-объекту может возникать ошибка «Неизвестная ошибка». Возможные причины:
Com-сервер перестал существовать. Возможные причины:
Потеря связи с нелокальным COM-сервером
Совпадение имен свойств и методов без параметров объекта создает неоднозначность обращения к ним через COM
Например, если у справочника есть реквизит ПолноеНаименование, то из-за наличия метода ПолноеНаименование() обращение к реквизиту ПолноеНаименование через COM может привести к вызову метода ПолноеНаименование()
Для обхода используем принцип “минимум COM-вызовов”
При создании COM-объекта через DCOM может возникать ошибка «Сервер RPC недоступен»
Проверьте работу службы “Remote Procedure Call (RPC)” на обоих компьютерах
Com-технология VS веб-сервисы в локальной сети
Недостатки
Рассмотренные выше сложности с взаимодействием разных сборок платформы 1C, требующие для своего решения сервисный механизм
Высокие затраты на подключение/инициализацию, поэтому при отсутствии кеширования неэффективно для частых мелких вызовов
Привязка к семейству операционных систем (платформе) Windows
Преимущества
Отсутствие необходимости изменять конфигурацию баз, к которым подключаемся
Не требуется разворачивать и поддерживать веб-сервер
Захват клиентских лицензий
В большинстве случаев всем клиентским приложениям, частным случаем которого являются Automation-сервер и внешнее соединение, в одном сеансе ОС требуется всего лишь одна на всех лицензия. Однако если клиентскому приложению не удалось получить аппаратную лицензию (от локального HASP или сетевого HASP) и программную лицензию (платформы или базовой конфигурации), то предпринимается попытка получить отдельную лицензию с сервера 1С:Предприятия. Сервер 1С:Предприятия может выдать лицензию только, если в свойствах базы разрешена выдача лицензий сервером 1С:Предприятия. В таком случае каждое клиентское приложение и внешнее соединение может захватывать свою собственную лицензию.
Заключение
Если вы хотите подробнее узнать об описанных особенностях, приобретайте продукт 2iS:Администратор . Несмотря на наличие в конфигурации защищенного модуля, 99% программного кода конфигурации открыто, то есть Вы можете изучить реализацию описанных приемов.
В этой статье я расскажу о многих особенностях взаимодействия между базами 1С по COM технологии, накопленных за годы развития и использования интеграционного коммерческого продукта 2iS:Интеграция компании 2iS.
Термины
ОС – операционная система
COM-клиент – процесс(поток) ОС, запросивший создание COM-объекта
COM-сервер – COM-объект, созданный по запросу клиента
Издание платформы – подстрока до 2-й точки версии платформы (например 8.2, 8.3)
Automation-сервер – он же OLE-сервер, COM-объект V8X.Application для создания приложений 1С
Сборка платформы – полная строка версии платформы (например 8.2.19.130, 8.2.16.352)
COM классы платформы
Виды COM классов
Для каждого издания платформы в системном реестре регистрируются собственные классы для взаимодействия с базами. Символ “X” обозначает место подстановки номера издания платформы (например 0,1,2,3,4).
Привязка COM классов к dll-файлам
Привязка имени COM класса к конкретному dll-файлу осуществляется через ветку HKEY_CLASSES_ROOT системного реестра, которая собирается следующим образом:
- Берется содержимое ветки HKEY_CURRENT_USER\Software\Classes
- Добавляется содержимое ветки HKEY_LOCAL_MACHINE\Software\Classes, но только те ключи, которые отсутствуют в п.1.
Поэтому регистрация класса от имени пользователя имеет приоритет над общей регистрацией.
- 64-b - c:\Program Files\1cv8*\\bin\comcntr.dll
- 32-b - c:\Program Files (x86)\1cv8*\\bin\comcntr.dll
Подключение внешнего соединения
Рассмотрим алгоритм подключения внешнего соединения в деталях
Задержка канала, мс | Длительность создания COM-объекта, мс |
0 | 60 |
30 | 700 |
80 | 2000 |
170 | 4000 |
На графике видно, что длительность создания этого COM-объекта прямо пропорциональна задержке канала и коэффициент пропорциональности составляет примерно 24. Можно предположить, что при создании этого COM-объекта происходит 24 вызова через канал.
- Создание сеанса – 1 сек
- Инициализация сеанса – [0;?] сек
- Подгрузка нужных метаданных (кэш метаданных не используется)
- Инициализация параметров сеанса
- Событие ПриНачалеРаботыСистемы
Подключение Automation-сервера (OLE)
- Создание COM-объекта Automation-сервера (Имя класса - V8X.Application).
- Затраты на создание примерно – 0.5 cек
- Создание сеанса – 1 сек
- Инициализация сеанса – [0;?] сек
- Подгрузка нужных метаданных (кэш метаданных используется, если база есть в списке пользователя)
- Инициализация параметров сеанса
- ПередНачаломРаботыСистемы
- ПриНачалеРаботыСистемы
Затраты на COM-вызовы
Каждый раз, когда мы обращаемся во встроенном языке к свойству или методу COM-объекта (выполняем COM-вызов), происходит ряд дополнительных действий по сравнению с обращением к родному объекту встроенного языка. Если COM-сервер находится в другом локальном процессе, то при этом еще сначала выполняется перенос всех параметров из COM-клиента в COM-сервер и в конце выполняется обратный перенос параметров в COM-клиент. Для такого переноса информация естественно должна быть сериализована на стороне отправителя и затем десериализована на стороне получателя, что в совокупности с некоторыми другими действиями получило название маршалинга и демаршалинга. В нелокальном режиме (DCOM) такой перенос будет еще тратить время на сетевые коммуникации и при первом обращении к новому COM-объекту на передачу его «скелета», и поэтому задержка канала будет играть решающую роль (Подробнее о COM вызовах, DCOM в википедии, Технический обзор DCOM,)
Соотношение затрат на вызов по типам расположения COM-сервера
- Минимальные для внутрипроцессного Com-сервера
- Средние для локального внепроцессного Com-сервера
- От средних до больших для нелокального внепроцессного Cоm-сервера в зависимости от качества канала связи
Минимизация количества COM-вызовов
- Создаем базовую внешнюю обработку с набором общих методов для приема вызовов от COM-клиента на стороне COM-сервера
- Теперь нам не нужно изменять конфигурацию базы COM-сервера, чтобы использовать там сложный функционал.
- В нашем продукте мы назвали ее «Сервисный процессор». На ее передачу и инициализацию уходит около 1 сек
Пример универсальной передачи файла в COM-сервер
Пример вызова обработки
- Создаем встроенную обработку для выполнения такого вызова в COM-клиенте
- Передача агрегатных объектов
- Сериализуем все входные параметры на стороне COM-клиента
- Десериализуем все входные параметры на стороне COM-сервера
- Выполняем действия с параметрами на стороне COM-сервера
- Сериализуем все выходные параметры на стороне COM-сервера
- Десериализуем все выходные параметры на стороне COM-клиента
- Например, информационные вызовы могут выполняться с изменяемой частотой
Обратная связь
При использовании принципа «минимум COM-вызовов» значительную часть времени код будет выполняться в чужом контексте, что серьезно усиливает некоторые неудобства COM-вызовов:
- Нельзя прервать поток COM-Клиента и его соединение с сервером приложений 1С, пока не завершится вызов COM-сервера
- У COM-Клиента нет информации о прогрессе выполнения вызова в COM-сервере
Схема принципа “минимум COM-вызовов”
Такая схема дружественна к большим задержкам каналов связи. Поэтому она во многом похожа на вызов веб-сервиса. А следовательно используя ее для COM взаимодействия, вы значительно снижаете затраты на возможные переходы между COM и веб-сервисом в обоих направлениях.
Отладка
При использовании принципа «минимум COM-вызовов» облегчить отладку выполнения кода на COM-сервере можно, сделав опциональное модальное окно подключения к базе в COM-клиенте. В этом окне должны быть возможности задания одноразовых параметров подключения, выполнения вспомогательных функций и просмотра информации о подключенном сеансе. Ниже в качестве примера показано такое окно из нашего продукта.
Чтобы включить возможность отладки внешних соединений, в подкаталоге conf нужно создать файл comcntrcfg.xml с соответствующим содержимым. В окне подключения можно сделать кнопку/флажок для программного создания такого файла. Однако много версий платформы содержат ошибку, из-за которой предметы отладки внешних соединений не видны в отладчике даже с этим корректно настроенным файлом. На платформе 8.3 эти проблемы вроде бы решены.
Пример файла comcntrcfg.xml:
Также нельзя забывать о необходимости запускать конфигуратор для отладки с той же (до регистра букв) строкой соединения, что и предмет отладки. Поэтому в этом диалоге нужно сделать кнопку для запуска конфигуратора COM-сервера с правильной строкой соединения.
В какой-то мере обойти проблему невидимости предмета отладки внешнего соединения и ряд других неудобств можно путем однократного выполнения кода на толстом клиенте с заменой режима «Внешнее соединение» на «Automation-сервер» (приложение), т.е. используя COM класс V8X.Application и включенную видимость. Поэтому в окне подключения нужны параметры для выбора режима подключения.
После создания подключения на стороне COM-клиента обычно требуется подключение отладчика базы COM-сервера и установка там точки останова в нужном месте. Поэтому в окне подключения нужно расположить кнопку подключения отладчика/конфигуратора COM-сервера. Если COM-сервер запущен в режиме видимого приложения, то для подключения отладчика можно воспользоваться асинхронным вызовом исключения в нем. Из диалога с ошибкой в приложении COM-сервера через кнопку «Конфигуратор» можно будет открыть конфигуратор и в большинстве случаев сразу подключить отладчик. Если подключение отладчика таким способом недоступно, то оператору поможет отображение информации о сеансе (его номера) в базе COM-сервера. Также нужна кнопка открытия в открытом отладчике файла внешней обработки, которая будет выполняться в нем.
Управление COM+ приложениями 1С
Далее можно изменить тип активации (внутрипроцессный/внепроцессный) на закладке Активация/Activation.
В нашем продукте имеется инструмент «Управление COM классами 1С» для просмотра/регистрации/изменения всех COM классов и COM+ приложений 1С на указанном компьютере:
Также управлять COM классами 1С можно через инструмент “Управление COM классами 1С” из подсистемы Инструменты разработчика
Настройка DCOM-сервера
Для Windows 2008 Server нужно добавить роль «Сервер приложений» (Application server). Для этого необходимо открыть панель управления компьютером, щелкнуть правой кнопкой мыши в ветки "Роли" и выбрать пункт меню "Добавить роль".
Появится око в котором необходимо выбрать роль "Сервер приложений"/"Application server". На этапе выбора ролей сервера приложений необходимо указать пункт "Сетевой доступ к COM+"/"COM+ network access". Если это не сделать, то при попытке создания COM-объекта вы будете получать ошибку "Ошибка при вызове конструктора (COMОбъект): The component or application containing the component has been disabled".
Настройка сетевого экрана
DCOM процессам для связи между собой динамически выдаются порты из диапазона (по умолчанию) от 1024 до 65535. Поэтому в сетевых экранах обоих компьютеров (com-клиента и com-сервера) должны быть открыты порты RPC (135, 139, 445, 593) и диапазон 1024-65535 (TCP/UDP).
Можно ограничить этот диапазон портов. Для этого открываем Администрирование – Службы компонентов (или в командной строке набираем dcomcnfg.exe). В открывшейся программе находим ветку «Мой компьютер» и открываем её свойства (см. скриншот).
В свойствах открываем вкладку «Набор протоколов», там, в свою очередь, открываем свойства «TCP/IP с ориентацией на подключения»
В свойствах TCP/IP по умолчанию – пустой список. В него можно добавить конкретный диапазон портов, которые будут использоваться DCOM. Какие именно порты выбрать – решать вам. Главное, чтобы не было других стандартных служб, уже занявших выбранные порты. Мне встречались рекомендации открывать не менее 1000 портов, так как очень многие системные программы используют DCOM. Так на скриншоте ниже я указываю, что DCOM должен работать по диапазону портов 20000-21000.
После этого нужно перезагрузить компьютер (перезапустить отдельно DCOM нельзя, слишком много на него завязано), и DCOM станет работать только по указанным портам.
Проблемы
Com-технология VS веб-сервисы в локальной сети
Недостатки
- Рассмотренные выше сложности с взаимодействием разных сборок платформы 1C, требующие для своего решения сервисный механизм
- Высокие затраты на подключение/инициализацию, поэтому при отсутствии кеширования неэффективно для частых мелких вызовов
- Привязка к семейству операционных систем (платформе) Windows
- Требуется закрытая сеть (LAN, VPN)
Преимущества
- Отсутствие необходимости изменять конфигурацию баз, к которым подключаемся
- Широкая функциональность
- Проще отладка
- Не требуется разворачивать и поддерживать веб-сервер
- Программно доступен интерактивный режим подключенной базы
Захват клиентских лицензий
В большинстве случаев всем клиентским приложениям, частным случаем которого являются Automation-сервер и внешнее соединение, в одном сеансе ОС требуется всего лишь одна на всех лицензия. Однако если клиентскому приложению не удалось получить аппаратную лицензию (от локального HASP или сетевого HASP) и программную лицензию (платформы или базовой конфигурации), то предпринимается попытка получить отдельную лицензию с сервера 1С:Предприятия. Сервер 1С:Предприятия может выдать лицензию только, если в свойствах базы разрешена выдача лицензий сервером 1С:Предприятия. В таком случае каждое клиентское приложение и внешнее соединение может захватывать свою собственную лицензию.
Заключение
Если вы хотите подробнее узнать об описанных особенностях, приобретайте продукт 2iS:Администратор. Несмотря на наличие в конфигурации защищенного модуля, 99% программного кода конфигурации открыто, то есть Вы можете изучить реализацию описанных приемов.
Была поставлена задача, написать внешнюю компоненту для работы из 1C v8 с COM портом. Компонента должны была снимать показания веса с очень необычных весов, а именно Весы вагонные тензометрические ЭлВВ-150/2 (III) и Весы автомобильные тензометрические ЭлВА-1660 (III). Доступа к ним не было, по всей видимости, они были не подъемные и находились далеко от меня.
Для разработки dll была выбрана среда разработки Delphi. Окончательное готовое решение было выполнено на 3й день после начала работ. Код был не полностью мой, основывался на примерах из Интерента.
Долго не мог найти девайс который бы работал через нужный мне порт. Сперва была найдена мышь, но она на посланные команды в ответ нечего не слала обратно. Потом у приятеля нашелся модем, на котором я и проводил испытание свежеиспеченной динамической библиотеки.
Вот, что в итоге получилось:
1С работа с COM портом
Для мониторинга того что происходило на COM порте использовал утилиту PortMon компании Sysinternals которую пару лет назад купила преславутая Microsoft.
Portmon прослушивает COM порт
Для загрузки компоненты в следует поместить ее в директорию где установлина 1С в папку bin
После чего исполнить в 1C следующий код:
COMПорт = Новый ( «Addin.rs232″ );
// Открываем порт COM1, COM2, COM3 ….
Для того что бы получить значени следует использовать процедуру обработки Внешнего События
Процедура ВнешнееСобытие ( Источник , Событие , Данные )
Сообщить ( « Получено значение: « + Данные );
Нашлись команды получения веса для: Весы вагонные тензометрические ЭлВВ-150/2 (III) и Весы автомобильные тензометрические ЭлВА-1660 (III).
01h — Получение значения R
61h — Получение значения весаВ обработке осылаю команду на устройство персонализации проксимити карточек и хочу получить номер карточки.
То, что устройство возвратило коды трех карточек, подтверждает Portmon:
0 0.01302819 1cv8.exe IRP_MJ_CREATE cyg_ser0 SUCCESS Options: Open
1 0.00000279 1cv8.exe IOCTL_SERIAL_GET_BAUD_RATE cyg_ser0 SUCCESS
2 0.00000168 1cv8.exe IOCTL_SERIAL_GET_LINE_CONTROL cyg_ser0 SUCCESS
3 0.00000196 1cv8.exe IOCTL_SERIAL_GET_CHARS cyg_ser0 SUCCESS
4 0.00000168 1cv8.exe IOCTL_SERIAL_GET_HANDFLOW cyg_ser0 SUCCESS
5 0.00000168 1cv8.exe IOCTL_SERIAL_GET_BAUD_RATE cyg_ser0 SUCCESS
6 0.00000168 1cv8.exe IOCTL_SERIAL_GET_LINE_CONTROL cyg_ser0 SUCCESS
7 0.00000140 1cv8.exe IOCTL_SERIAL_GET_CHARS cyg_ser0 SUCCESS
8 0.00000168 1cv8.exe IOCTL_SERIAL_GET_HANDFLOW cyg_ser0 SUCCESS
9 0.00678857 1cv8.exe IOCTL_SERIAL_SET_BAUD_RATE cyg_ser0 SUCCESS Rate: 9600
10 0.00298557 1cv8.exe IOCTL_SERIAL_CLR_RTS cyg_ser0 SUCCESS
11 0.00307022 1cv8.exe IOCTL_SERIAL_CLR_DTR cyg_ser0 SUCCESS
12 0.00280734 1cv8.exe IOCTL_SERIAL_SET_LINE_CONTROL cyg_ser0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
13 0.00397537 1cv8.exe IOCTL_SERIAL_SET_CHAR cyg_ser0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:0 XOFF:0
14 0.00396391 1cv8.exe IOCTL_SERIAL_SET_HANDFLOW cyg_ser0 SUCCESS Shake:0 Replace:0 XonLimit:28672 XoffLimit:7168
15 0.00000223 1cv8.exe IOCTL_SERIAL_GET_TIMEOUTS cyg_ser0 SUCCESS
16 0.00000168 1cv8.exe IOCTL_SERIAL_SET_TIMEOUTS cyg_ser0 SUCCESS RI:1 RM:1 RC:10 WM:0 WC:0
17 0.10989860 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
18 0.11033218 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
19 0.00093420 1cv8.exe IRP_MJ_WRITE cyg_ser0 SUCCESS Length 3: n..
20 0.05856052 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 12: ;0F0004D836?
21 0.11033497 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
22 0.11033777 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
23 0.11032715 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
24 0.00031261 1cv8.exe IRP_MJ_WRITE cyg_ser0 SUCCESS Length 3: n..
25 0.11033218 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
26 0.01168500 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 12: ;0F00C02248?
27 0.11033721 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
28 0.11032492 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
29 0.11032827 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
30 0.00014806 1cv8.exe IRP_MJ_WRITE cyg_ser0 SUCCESS Length 3: n..
31 0.11033246 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
32 0.01169562 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 12: ;0F00C089C1?
33 0.11032184 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
34 0.11033106 1cv8.exe IRP_MJ_READ cyg_ser0 TIMEOUT Length 0:
35 0.00000447 1cv8.exe IRP_MJ_CLEANUP cyg_ser0 SUCCESS
36 0.05259775 1cv8.exe IRP_MJ_CLOSE cyg_ser0 SUCCESSУстройство подключено к USB.
cyg_ser0 это COM4.Но Процедура ВнешнееСобытие(Источник, Событие, Данные) не отлавливает эти посылки. Что посоветуете?
Может есть описание rs232.dll?
gluar
на указаный email выслал измененную версию библиотеки. возможно заработаетСсылка на скачивания уже не работает, можна ли получить компоненту на почту? И пробовали будет ли она работать на win2003 Server?
Cуществует такая удобная штука, как соединение по COM порту c базой данных 1С. Сам COM порт очень старое соединение и используется в огромном количестве компьютеров. Не смотря на свой возраст COM порт до сих пор очень популярен и позволяет удобно передавать информацию между различными программами на разных машинах.
Часто в связи с проблемами подключения многие начинающие программисты 1С не могут нормально организовать подключение. На самом деле не совсем ясно в чем возникает проблема подключений 1С по COM порту. В целом настройка данной функции не доставляет никаких проблем и далее будет показано как нормально настроить COM соединение с 1С.
1С Документооборот нужно соединить по COM порту к информационной базе 1C УПП:
- Ищем документ, который нам нужен, к примеру его имя будет 123
- Получаем статус документа
- В том случае если документ изменяется то, что нужно это изменить и указать в нашем документообороте
Выполним наше задание:
Создание подключения к базе 1C по COM
Для начала мы соединяемся с 1С и далее смотрим код, который поможет нам выполнить подключение по COM соединению к другой базе 1С, которая использует режим файлов.
Данный программный код 1С поможет установить соединение по COM порту и у нас появится возможность работать с другой бд 1С.
Если мы используем программу с выделенным сервером нам придется использовать другой программный код, и он не будет немного иным, чем мы использовали для файлового режима:
Далее вам нужно выбрать именно подходящую версию 1С, к которой вы подключаетесь по COM порту.
Поиск нужного документа 1С с помощью COM соединения.
Для образца мы возьмем имя нашего документа 1234 и начнем его поиск с помощью процедуры.
С помощью нашего кода мы нашли по COM соединению искомый нами документ и узнали его статус. Если он не совпадает с нужным, то вносятся изменения.
Возможно ли из 1С управлять такими устройствами, как шлагбаум, домофон, кондиционер, телевизор, холодильник и т.д.? Да, возможно. С помощью микроконтроллера можно управлять любыми устройствами при помощи замыкающих реле, ИК-передатчиков и другой периферии. Но как подключить сам контроллер к 1С, чтобы получить функцию, отправляющую данные на МК и возвращающую с него ответ? В этой статье будет описано подключение через usb-интерфейс, а точнее — через серийный порт.
Платформа Arduino позволяет подключить к себе практически всё. На просторах интернета можно найти много информации об этом, поэтому мы не будем тратить на это время, а ограничимся 2 компонентами: 1) реле, 2) ультразвуковой датчик расстояния. На фотографии присутствует ещё сетевой шилд, в нашем случае он не нужен (просто лень было снимать).Перед подключением Arduino необходимо установить драйвер CH341SER.EXE (приложен к статье) либо другой, а для её прошивки ещё нужна среда разработки.
const int Trig = 22; // Пин для подачи 5 вольт на уз датчик расстояния
const int Echo = 23; // Пин для приёма информации о расстоянии
char s[3]; // Для хранения команды полученной из 1С
int i=0; // Для счётчика
unsigned int time_us=0; // Для хранения длительности импулься в мк сек. полученного с уз датчика
unsigned int distance_sm=0; // Для хранения расстояния до объектаvoid setup()
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(7, OUTPUT); // Пин 7 используем для управления реле (5 вольт — реле включено, 0 — выключено)
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
>void loop()
<
s[0] = '0'; // При каждой итерации обнуляем переменные
i=0;while (Serial.available() > 0) // Пока в буфере серийного порта есть данные — читаем
<
s[i]=Serial.read(); // Записываем их в S, в нашем случае команда занимает 1 символ, 2-й перенос строки, 3 — на всякий случай))
i++;
if (i>=3) break;
>if (s[0] == '1') if (digitalRead(7) == 1)
// Проверяем состояние, если включено выключаем и отправляем ответ 1
else> // Если выключено — включаем и отправляем ответ 2 else if (s[0] == '2') digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig, LOW); // Затем убираем
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
Serial.print(distance_sm); // Выводим на порт
>
>Теперь 1С. Для отправки данных достаточно использовать метод «ЗаписьТекста». Пишем напрямую в ком порт:
Команда = 1; // 1- для реле, 2- для датчика расстояния
модемЗ = Новый ЗаписьТекста("\\.\Com5", КодировкаТекста.ANSI);
модемЗ.ЗаписатьСтроку(Команда + Символы.ПС);
модемЗ.Закрыть();Ответ получаем с помощью «ЧтениеТекста», делаем всё аналогично:
МодемЧ= Новый ЧтениеТекста();
МодемЧ.Открыть("\\.\Com5", КодировкаТекста.ANSI);// важный момент, если вместо ответа выполучаете "", Неопределено — это значит ком порт не успевает
// после открытия записать получанные данные в буфер, поэтому делаем в этом месте небольшую задержку
// 15 миллисекунд хватит. Раскомментировать следующие 3 строчки в случае проблемы
// т = ТекущаяУниверсальнаяДатаВМиллисекундах() + 15; // Задержка 15 миллисекунд
// Пока т > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл // Все супер-пупер проффи с чрезвычайно прямыми руками
// КонецЦИкла; // идут лесом. и нечего срать в комментариях коль по делу сказать нечегоОтвет= МодемЧ.ПрочитатьСтроку(); // Читаем буфер ком порта
модемЧ.Закрыть();Ну вроде бы и всё, но есть НО, очень большое НО. Ком порт должен быть проинициализирован.
Про то, как это сделать, есть много статей, однако все они довольно сложные, поэтому ниже будет предложен более
простой вариант.При первом обращении к ком порту необходимо установить некоторые парамерты в регистрах контроллера. В типовых
конфигурациях 1С есть встроенные драйвера для тестирования фискального оборудования, они находятся в общих макетах
в виде двоичных данных. Один из них — ДрайверАТОЛФискальныеРегистраторы, его мы и будем использовать (файл приложен к статье, так же его можно взять из типовой конфигурации). С помощью этой компоненты мы протестируем наш контроллер. Результат, естественно, будет отрицательным, ведь у нас Arduino, а не АТОЛ, но во время теста драйвер установит все нужные параметры.Итак, драйвер залит в макет в виде двоичных данных:
НомерКомПорта = 5;
ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет(«ДрайверАТОЛФискальныеРегистраторы»)), «АтолУниверсальный»);
ОбъектДрайвера = Новый («AddIn.АтолУниверсальный.ATOL_KKM_1C82»);
ОбъектДрайвера.УстановитьПараметр(«BaudRate», 7); // цифра 7 означает скорость 9600
ОбъектДрайвера.УстановитьПараметр(«PortNumber», 1000 + НомерКомПорта);
ОбъектДрайвера.ТестУстройства(,);Читайте также: