1с не срабатывает внешнее событие сканер
Технология создания внешних компонент для "1С:Предприятие 8. Расширение для карманных компьютеров" позволяет расширить возможности "Расширения для карманных компьютеров" за счет использования внешних программ, реализующих те или иные возможности. Например, таким образом может быть организована работа с различным оборудованием, в частности, со сканерами штрих-кодов. При этом такие программы должны быть реализованы с соблюдением ряда требований, описанных ниже.
Встроенный язык "1С:Предприятие 8. Расширение для карманных компьютеров" включает методы и события для работы со внешними компонентами, описание которых приводится ниже.
Метод глобального контекста. Загружает внешнюю компоненту, создает соответствующие COM-объекты и подключает их к платформе исполнения мобильных приложений.
Тип: строка. Имя файла внешней компоненты. должно иметь вид “Имя.Расширение”. Имя файла может содержать полный путь к нему. Если путь не указан, платформа исполнения мобильный приложений осуществляет поиск компоненты в следующей последовательности: каталог ИБ, каталог исполняемых файлов платформы, каталог ОС.
Код возврата от загрузки компоненты. 0 – означет нормальную загрузку, остальное – системные коды ошибки.
Внешние компоненты загружаются функцией встроенного языка ЗагрузитьВнешнююКомпоненту. Файл внешней компоненты должен быть динамически загружаемой библиотекой (например, DLL или OCX), то есть работать как InProc сервер.
Создает COM-объекты внешней компоненты и подключает их к платформе исполнения мобильных приложений.
ProgID (Programmatic Identifier) объекта внешней компоненты. должно соответствовать информации, находящейся в регистрационной базе данных системы (Registry).
Код возврата от загрузки компоненты. 0 – означет нормальную загрузку, остальное – системные коды ошибки.
Внешние компоненты подключаются функцией встроенного языка ПодключитьВнешнююКомпоненту. Внешняя компонента может быть как динамически загружаемой библиотекой (например, DLL или OCX), так и приложением.
При загрузке внешней компоненты функцией ЗагрузитьВнешнююКомпоненту "1С:Предприятие 8. Расширение для карманных компьютеров" определяет ProgID COM—объекта компоненты следующим образом:
- ProgID имеет вид . ;
- в качестве первой части ( ) используется строка “AddIn”;
- в качестве второй части ( ) используется строка с ID 100 из таблицы строк компоненты. Cтрока может иметь вид “Name1|Name2|. |NameN”, и в этом случае будут созданы все объекты с ProgID вида “AddIn.NameX”. Если такая строка отсутствует, то используется имя файла внешней компоненты без расширения.
При использовании функции ПодключитьВнешнююКомпоненту ProgID COM-объекта компоненты передается в качестве параметра функции и также может представляться строкой вида ProgID1| ProgID2|. |ProgIDX.
Инициализация и выгрузка компоненты
Для инициализации и выгрузки компоненты используется интерфейс IInitDone. Этот интерфейс наследован от IUnknown и предназначен для инициализации объекта и завершения работы с объектом.
HRESULT Init(IDispatch *pBackConnection)
Тип: IDispatch. Указатель на интерфейс платформы исполнения мобильных приложений.
При загрузке платформа инициализирует объект компоненты, вызывая метод Init и передавая указатель на IDispatch. Объект может сохранить этот указатель для дальнейшего использования. Все остальные интерфейсы объект может получить, вызвав метод QueryInterface переданного ему интерфейса IDispatch. Объект должен возвратить S_OK, если инициализация прошла успешно, и E_FAIL при возникновении ошибки.
Платформа исполнения мобильных приложений вызывает этот метод при завершении работы с объектом компоненты. Объект должен возвратить S_OK. Этот метод вызывается независимо от результата инициализации объекта (метод Init).
HRESULT GetInfo(SAFEARRAY **pInfo)
Тип: SAFEARRAY**. Двойной указатель на массив структур VARIANT. Память для массива выделяется платформой.
Платформа вызывает этот метод для получения информации о компоненте. В текущей версии компонентной технологии в элемент с индексом 0 необходимо записать версию поддерживаемой компонентной технологии в формате V_I4 — целого числа, при этом старший номер версии записывается в тысячные разряды, младший номер версии — в единицы. Например: версия 3.56 — число 3560. В настоящее время все объекты внешних компонент могут поддерживать версию 1.0 (соответствует числу 1000). Память для pInfo выделяется платформой. Метод должен возвращать S_OK.
Объект внешней компоненты обязан реализовать этот интерфейс. При его отсутствии компонента не будет загружена.
Для расширения встроенного языка компонента должна реализовать интерфейс ILanguageExtender. Этот интерфейс унаследован от IUnknown и предназначен для расширения встроенного языка "1С:Предприятие 8. Расширение для карманных компьютеров". Для использования этого расширения необходимо вызвать функцию Новый, передав ей строку вида “AddIn. ”, где возвращается методом этого интерфейса Затем можно использовать созданный объект, вызывая его методы и свойства.
HRESULT RegisterExtensionAs(BSTR *pExtensionName)
Тип: BSTR*. Наименование расширения встроенного языка "1С:Предприятие 8. Расширение для карманных компьютеров".
В переменную pExtensionName помещается наименование расширения (вторая часть имени объекта). Память для строки выделяется объектом компоненты стандартными системными функциями для работы с COM—строками (например, SysAllocString. Платформа освобождает эту память вызовом SysFreeString).
Первое свойство имеет порядковый номер 0.
HRESULT GetNProps(long *plProps)
Тип: long*. Указатель на переменную, содержащую при возврате количество свойств расширения.
Возвращает количество свойств данного расширения, 0 – при отсутствии свойств. Память для переменной plProps выделяется платформой.
HRESULT FindProp(BSTR pszPropName,long*plPropNum)
Тип: BSTR. Наименование свойства.
Тип: long*. Указатель на переменную, содержащую при возврате порядковый номер свойства.
Возвращает порядковый номер свойства с именем pszPropName; -1, если свойство не найдено. Память для переменной plPropNum выделяется платформой.
HRESULT GetPropName(long lPropNum,long lAliasNum,BSTR *pPropName)
Тип: long. Порядковый номер свойства.
Тип: long. Язык наименования:
0 — английское наименование;
1 — локальное наименование.
Тип: BSTR*. Указатель на строку, содержащую при возврате наименование свойства.
В переменную pPropName помещается имя свойства с порядковым номером lPropNum; если свойство с таким номером отсутствует, в pPropName помещается пустая строка. Память для строки выделяется объектом компоненты стандартными системными функциями для работы с COM—строками (например, SysAllocString. Платформа освобождает эту память вызовом SysFreeString).
HRESULT GetPropVal(long lPropNum,VARIANT *pvPropVal)
Тип: long. Порядковый номер свойства.
Тип: VARIANT*. Указатель на структуру VARIANT, содержащую при возврате значение свойства.
В переменную pvPropVal помещается значение свойства с порядковым номером lPropNum; если свойство с таким номером отсутствует или недоступно для чтения, должен иметь тип VT_EMPTY.
HRESULT SetPropVal(long lPropNum, VARIANT *pvPropVal)
Тип: long. Порядковый номер свойства.
Тип: VARIANT*. Структура VARIANT, содержащая новое значение свойства.
Переменная pvPropVal содержит значение свойства с порядковым номером lPropNum; если свойство с таким номером отсутствует, недоступно для чтения или тип переданного pvPropVal не приводится к необходимому, метод должен возвратить S_FALSE.
HRESULT IsPropReadable(long lPropNum, BOOL *pboolPropReadable)
Тип: long. Порядковый номер свойства.
Тип: BOOL*. Указатель на переменную, содержащую при возврате флаг возможности чтения свойства.
В переменную pboolPropReadable помещается флаг возможности чтения свойства с порядковым номером lPropNum: FALSE(0) — свойство недоступно для чтения, TRUE(1) — свойство допускает чтение. Если свойство с таким номером отсутствует, метод должен возвращать S_FALSE.
HRESULT IsPropWritable(long lPropNum, BOOL *pboolPropWritable)
Тип: long. Порядковый номер свойства.
Тип: BOOL*. Указатель на переменную, содержащую при возврате флаг возможности записи свойства.
В переменную pboolPropWritable помещается флаг возможности записи свойства с порядковым номером lPropNum: FALSE(0) — свойство недоступно для записи, TRUE(1) — свойство допускает запись. Если свойство с таким номером отсутствует, метод должен возвращать S_FALSE.
Первый метод имеет порядковый номер 0. Первый параметр метода имеет порядковый номер 0.
HRESULT GetNMethods(long *plMethods)
Тип: long*. Указатель на переменную, содержащую при возврате количество методов расширения языка.
HRESULT FindMethod(BSTR bstrMethodName,long *plMethNum)
Тип: BSTR. Имя метода
Тип: long*. Указатель на переменную, содержащую при возврате порядковый номер метода с именем methodName.
В переменную plMethNum помещается порядковый номер метода с именем bstrMethodName; -1 — при отсутствии метода.
HRESULT GetMethodName(long lMethodNum, long lAliasNum, BSTR *pbstrMethName)
Тип: long. Порядковый номер метода.
Тип: long. Язык имени метода:
0 — английское наименование;
1 — локальное наименование.
Тип: BSTR*. Указатель на строку, содержащую при возврате имя метода.
В переменную помещается имя свойства с порядковым номером; если свойство с таким номером отсутствует, в помещается пустая строка. Память для строки выделяется объектом компоненты стандартными системными функциями для работы с COM—строками (например, SysAllocString. Платформа освобождает эту память вызовом SysFreeString).
HRESULT GetNParams(long lMethodNum, long *plMethParams)
Тип: long. Порядковый номер метода.
Тип: long*. Указатель на переменную, содержащую при возврате количество параметров метода.
В переменную plMethParams помещается количество параметров метода с порядковым номером lMethodNum; если свойство с таким номером отсутствует или не имеет параметров, в помещается 0. Память для переменной выделяется платформой.
HRESULT GetParamDefValue(long lMethodNum, long lParamNum, VARIANT *pvParamDefVal)
Тип: long. Порядковый номер метода.
Тип: long. Порядковый номер параметра.
Тип: VARIANT*. Указатель на структуру VARIANT, содержащую при возврате значение параметра по умолчанию.
В переменную pvParamDefVal помещается значение по умолчанию параметра lParamNum метода с порядковым номером lMethodNum. В pvParamDefVal помещается тип VT_EMPTY, если метод с таким номером отсутствует, не имеет параметра с номером или параметр не имеет значения по умолчанию. Память для переменной выделяется платформой.
HRESULT HasRetVal(long lMethodNum,BOOL *pboolHasRetVal)
Тип: long. Порядковый номер метода.
Тип: BOOL*. Указатель на переменную, содержащую при возврате флаг наличия возвращаемого значения.
В переменную pboolHasRetVal помещается флаг наличия возвращаемого значения у метода с порядковым номером lMethodNum: TRUE для методов с возвращаемым значением и FALSE в противном случае. Память для переменной выделяется платформой.
HRESULT CallAsProc(long lMethodNum, SAFEARRAY **pVars)
Тип: long. Порядковый номер метода.
Тип: SAFEARRAY**. Двойной указатель на массив структур VARIANT, содержащий значения параметров метода. Если метод не имеет параметров, то содержит NULL.
S_FALSE – отсутствует метод, соответствующий переданному lMethodNum.
Выполняется метод с порядковым номером lMethodNum. Если метод возвращает E_FAIL, возникает ошибка времени выполнения и выполнение модуля. Память для массива параметров выделяется платформой.
HRESULT CallAsFunc(long lMethodNum, VARIANT *pRetValue, SAFEARRAY **pVars)
Тип: long. Порядковый номер метода.
Тип: VARIANT*. Указатель на структуру VARIANT, при возврате содержащую возвращаемое значение.
Тип: SAFEARRAY**. Двойной указатель на массив структур VARIANT, содержащий значения параметров метода. Если метод не имеет параметров, то содержит NULL.
S_FALSE – отсутствует метод, соответствующий переданному lMethodNum.
Выполняется метод с порядковым номером lMethodNum. Если метод возвращает E_FAIL, возникает ошибка времени выполнения и выполнение модуля прекращается. Память для массива параметров и возвращаемого значения выделяется платформой.
Вызов функции компоненты
Соответствие между типами "1С:Предприятие 8. Расширение для карманных компьютеров" и COM:
- неопределенное значение соответствует VT_EMPTY;
- целочисленное значение соответствует VT_I4 и помещается в lVal;
- дробное значение соответствует VT_R8 и помещается в dblVal;
Следует учесть, что внутреннее представление может иметь точность, превосходящую точность типа double (около 15 цифр после запятой), поэтому при конвертации может происходить потеря точности.
значение даты соответствует VT_DATE и помещается в date;
строковое значение соответствует VT_BSTR и помещается в bstrVal;
Возвращение значений из компоненты
Соответствие между типами "1С:Предприятие 8. Расширение для карманных компьютеров" и COM:
- VT_EMPTY соответствует неопределенному значению. При передаче в качестве параметра метода подставляется значение параметра по умолчанию;
- значения типа VT_I2, VT_I4, VT_BOOL, VT_ERROR, VT_UI1 соответствуют целочисленному значению и находятся в lVal;
- значения типа VT_R4, VT_R8, VT_CY соответствуют дробному значению и находятся в dblVal;
- значение типа VT_DATE соответствует значению даты и находится в date;
- значение типа VT_BSTR соответствует строковому значению и находится в bstrVal;
- значение типа VT_ARRAY соответствует массиву и находится в parray;
- Типы VT_DECIMAL, VT_VARIANT, VT_DISPATCH и VT_UNKNOWN не поддерживаются.
При возникновении асинхронного события (например, считывания штрих-кода) объект может использовать интерфейс IAsyncEvent для создания внешнего события. Интерфейс IAsyncEvent унаследован от IUnknown. Все события помещаются в очередь и обрабатываются по порядку появления. Количество запоминаемых событий ограничено длиной очереди. При инициализации длина очереди устанавливается равной 1 и может быть изменена вызовами GetEventBufferDepth и SetEventBufferDepth. Для каждого объекта внешней компоненты поддерживается своя очередь событий. Обработка внешнего события производится предопределенной процедурой ОбработкаВнешнегоСобытия и обработчиками внешних событий в модулях форм.
HRESULT SetEventBufferDepth(long lDepth)
Возможны другие коды возврата, сигнализирующие об ошибке.
Устанавливает размер очереди событий для данного объекта. Если текущее количество событий в очереди больше устанавливаемой длины, последние события обрезаются.
HRESULT GetEventBufferDepth(long *plDepth)
Возможны другие коды возврата, сигнализирующие об ошибке.
В переменную plDepth помещается размер очереди событий для данного объекта.
HRESULT ExternalEvent(BSTR bstrWho, BSTR bstrWhat, BSTR bstrData)
S_OK – событие помещено в очередь
E_FAIL – очередь переполнена или неизвестная ошибка
E_OUTOFMEMORY – отсутствие памяти
Возможны другие коды возврата, сигнализирующие об ошибке.
Помещает событие в очередь, записывая источник события, наименование и параметры события. При обработке события эти данные передаются процедуре ОбработкаВнешнегоСобытия . При вызове метода ExternalEvent дальнейшая обработка события происходит следующим образом: событие записывается в очередь событий (если очередь полностью занята, событие теряется), затем при отсутствии системных событий из очереди берется первое событие (если очередь не пуста) и запускается процесс обработки внешних событий. Этот процесс повторяется для всех объектов внешних компонент. Таким образом, обработка внешних событий синхронизируется с обработкой системных событий.
S_OK — очередь успешно очищена
E_FAIL – при очищении очереди произошла ошибка
Возможны другие коды возврата, сигнализирующие об ошибке.
Очищает очередь событий, удаляя все присутствующие в очереди события.
DimanYa
evgenyatam
DimanYa
evgenyatam
например так:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Не ВводДоступен() Тогда
Возврат; // если не в фокусе = игнорируем все
КонецЕсли;
Если Источник<>"Сканер штрихкода" Тогда
Возврат ; // игнорируем
КонецЕсли;
Если Событие <> "ПолученШтрихкод" тогда
Возврат ;
КонецЕсли;
Штрихкод = Данные;
Если Лев(Штрихкод,1)=Символы.ПС Тогда
Штрихкод=Сред(Штрихкод,2);
КонецЕсли;
СерийныйНомер = Штрихкод;
КонецПроцедуры // ВнешнееСобытие()
DimanYa
Добавлено: Извиняюсь. Уже сам написал =)
Во время работы во внешней компоненте могут срабатывать определенные события, которые не зависят от 1С. Обработка таких событий осуществляется на стороне 1С в предопределенной процедуре формы или модуля приложения. В первом параметре процедуры передается параметр «Источник», он всегда равен: «MediaBuild» и говорит о том, что событие пришло от ВК. Вторым параметром идет тип события «Событие[Число]» (тип Строка обязателен), которые отвечает на вопрос, а что это за событие и от какой камеры оно пришло. И, наконец, третьим параметром идет параметр «Данные» (тип Строка не обязателен). Он хранит данные, которые может передать ВК.
Для того, чтобы можно было принимать события от ВК в открытой форме определите встроенное событие формы ВнешнееСобытие:
Не реагирует на if
Всегда выполняет строку 12 directions.push_back(std::make_pair(currentRow, Down)); независимо от.
как реагирует Я
есть разница между адресами(какой лучше) Nokia%206230-23.html Nokia_6230-23.html
Не реагирует на ПДУ
Добрый день, кто может подсказать в чем проблема: Есть два ПДУ DNS ( 1 оригинальный, другой.
Это решилось, всё работает. Но я что то не понисаю как сделать, чтобы мой штрих код записался в определённое поле ввода.То есть я открываю свою форму сканирую штрих код и у меня в поле ввода "ПолеВводвШтрихКод" записалось значение считываемого штрих кода.
например так:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Не ВводДоступен() Тогда
Возврат; // если не в фокусе = игнорируем все
КонецЕсли;
Если Источник<>"Сканер штрихкода" Тогда
Возврат ; // игнорируем
КонецЕсли;
Если Событие <> "ПолученШтрихкод" тогда
Возврат ;
КонецЕсли;
Штрихкод = Данные;
Если Лев(Штрихкод,1)=Символы.ПС Тогда
Штрихкод=Сред(Штрихкод,2);
КонецЕсли;
СерийныйНомер = Штрихкод;
КонецПроцедуры // ВнешнееСобытие()
СерийныйНомер - атрибут формы.
evgenyatam спасибо ещё раз. Всё разобрался, всё работает. В регистр сведений заносится =)
И вот вопросит немного не по теме ТО.
В документе есть табличное поле. Первая колонка - ОТДЕЛ. Выбираем. И в зависимости от того, что выбрали, у нас в колонке ФАМИЛИЯ открывается соответствующая часть справочника сотрудники из уже выбранного нами группы в первой колонке.
Она точно не срабатывает? В отладчике проверяли? Возможно она сработала и нужно просто обновить форму, или еще что то. Leschyu --> Leschyu
Проверял в отладчике. Срабатывает только после клика или нажатие какой либо клавиши. Vidocq05 --> Vidocq05
Что находится в "Источник", "Событие", "Данные"? Leschyu --> Leschyu
Версия библиотеки какая (версия драйвера) .
Вроде как в ноябрьской что то исправляли касаемо работы в Linux
Leschyu --> LeschyuLeschyu @ Сегодня, 16:07 ,
lsusb
И посмотреть что он отдает
sudo tail -f /dev/[порт на который он зацепился]
Vidocq05 --> Vidocq05По видимому с драйвером косяк. По драйверу ничего не подскажу. Leschyu --> Leschyu
Там он все нормально отдает.
Vidocq05 --> Vidocq05
Leschyu @ Сегодня, 16:57 ,
Из просторов интернета:
Сам сканер ШК при сканировании генерит КОД, который может состоять собственно из самого ШК и префикса с суффиксом. Для того, чтобы сработало "внешнее событие" и ОбработкаВнешнегоСобытия() - должен быть в настройках программы(драйвера) корректно описан СУФФИКС ШК - т.е. спец.символ(последовательность спец.символов), которые "говорят" что ШК "закончился". можно его "обрабатывать". т.е.
- со сканера идет: <Префикс><ОтсканированныйШК><Суффикс>;
- <Префикс> и <Суффикс> настраиваются по книжке с настройками сканера;
- если правильно В ДРОВАХ настроены <Префикс> и <Суффикс> (т.е. такие же, как у сканера), то дрова их отбрасывают, оставляя <ОтсканированныйШК> для 1С-ны.
- если правильно В ДРОВАХ настроен <Суффикс>, то по его приходу и генерится "Внешнее событие". Иначе - ждем это событие до второго пришествия.
- <Суффикс> - это символ(спец.код), который говорит компу о том, что переданная от железа последовательность закончилась;
- <Префикс> - символ, позволяющий отличать "нашу" последовательность (со сканера) от "не нашей" (с фиг знает еще какого устройства) или, например, <префикс> можно использовать чтобы отличать наши "внутренние" ШК от ШК производителей/поставщиков.
В настройках оборудования выставлен суффикс 13 (CR). Такой же я при помощи штрих кодов забил в сканер.
Пытался заставить работать с другим суффиксом (выставлял и в настройках, и забивал в сканер) - безрезультатно. Либо не работает вообще, либо так же ждет нажатия клавиши или клика. twilight_dream --> twilight_dream
Читайте также: