1с ошибка разбора манифеста внешней компоненты
Работа с внешними компонентами Native
- 1 С использованием Native API
- 2 С использованием технологии COM
При работе компоненты на сервере, вызов ПодключитьВнешнююКомпоненту() необходимо выполнять каждый раз перед созданием экземпляра внешней компоненты, т. к. в общем случае неизвестно, на каком сервере будет исполняться вызов (это может быть Windows, Linux, 32-разрядная или 64-разрядная ОС). |
Я бы добавил, что метод ПодключитьВнешнююКомпоненту лучше использовать всегда, независимо от типа клиента.
1. Допустим ВК у нас расположена в определенном каталоге на диске :
Возможно использование в "Толстом Клиенте (обычное приложение)";
Это самый простой пример работы с компонентой Native. Следует обратить внимание на то, что компонент этого типа не требует регистрацию в системе, что значительно упрощает администрирование.
2. Рассмотренный выше пример совсем не жизненный. Чаще всего компонент располагают в макете. Макет должен содержать zip архив c файлами компонента и файлом MANIFEST.xml
Пример файла манифеста:
- MIKO_phone_IP.dll (компонент native)
- MANIFEST.xml
- 1CEAdnWebFF.xpi (zip архив - расширение для Mozilla FF, содержит компонент native)
3. При работе в тонком и web клиенте обязательно использования метода УстановитьВнешнююКомпоненту() .
Цитата с ИТС:
В момент установки внешние компоненты устанавливаются в каталог %APPDATA%\1C\1Cv82\ExtCompT. Каталог установки внешних компонент не считается кешем и не очищается при вызове «1С:Предприятия» с ключом командной строки ClearCache. Использование метода УстановитьВнешнююКомпоненту() для тонкого клиента является обязательным. |
пояснение:
%APPDATA%\1C\1Cv82\ExtCompT - каталог установки компонентов для Толстого, Тонкого клиентов.
%APPDATA%\Roaming\Mozilla\Extensions - каталог (в моем случае) расширений для Mozilla FF/
При использовании метода УстановитьВнешнююКомпоненту() , в зависимости от используемого клиента, в соответствующий каталог будут распакованы расширения.
Пример процедуры установки внешнего компонента:
УстановитьВнешнююКомпоненту - метод должен вызываться лишь при первичной установке компонента и в случае, когда необходимо обновить установленную версию компонента.
В случае тонкого и толстого клиента:
Достаточно повторно выполнить операцию установки внешней компоненты с помощью метода УстановитьВнешнююКомпоненту ().
- Необходимо удалить плагин через механизм работы с дополнениями веб-браузера (Mozilla FF)
- Воспользоваться методом УстановитьВнешнююКомпоненту
Если компонент не был установлен, то будет вызвано исключение.
2. бывают случаи, когда компонент необходимо установить из временного хранилища (файл получен со стороннего источника, внешняя обработка), в этом случае необходимо первым параметров в методы ПодключитьВнешнююКомпоненту и УстановитьВнешнююКомпоненту адрес архива во временном хранилище. Ниже приведу возможный пример работы:
Упаковал два файла, как макет подключил.
// Устанавливает компоненту сканирования
Процедура УстановитьКомпоненту() Экспорт
КодВозврата = ПодключитьВнешнююКомпоненту ("ОбщийМакет.TrayMessenger", "TrayMessenger", ТипВнешнейКомпоненты.Native);
Если КомпонентаТрей = Неопределено Тогда
КодВозврата = ПодключитьВнешнююКомпоненту ("ОбщийМакет.TrayMessenger", "TrayMessenger", ТипВнешнейКомпоненты.Native);
Если КодВозврата Тогда
// Состояние(НСтр("ru = 'Компонента сканирования уже установлена!'"));
Иначе
УстановитьВнешнююКомпоненту("ОбщийМакет.TrayMessenger");
КодВозврата = ПодключитьВнешнююКомпоненту ("ОбщийМакет.TrayMessenger", "TrayMessenger", ТипВнешнейКомпоненты.Native);
Если КодВозврата Тогда
// РаботаСФайламиВызовСервера.ОчиститьНастройкиФормНовогоФайла();
В тонком клиенте работает без проблем, надо на Web сделать.
При подключении пишет:
Установка внешней компоненты не выполнена!
В процессе установки произошла ошибка!
Возможно, отсутствует компонента для используемого клиентского приложения
Странно, у меня и на тонком не работает
// код модуля формы внешней обработки
&НаКлиенте
Процедура Команда1(Команда)
УстановитьВнешнююКомпоненту("ОбщийМакет.s");// Здесь выдает фэйл-окно про "Возможно, отсутствует компонента для используемого клиентского..
х = ПодключитьВнешнююКомпоненту("ОбщийМакет.s","InterLib",AddInType.Native);
// Зато последняя строчка на стороне сервера работает норм, безо всяких УстановитьВнешнююКомпоненту
Скорее всего некропост, но манифест для всех вариантов:
Name – имя внешней компоненты (требуется только для мобильной версии платформы); должно быть уникальным, сформированным по правилам описанным в разделе "Правила формирования имени внешней компоненты";
Os – операционная система (Windows, Linux, MacOS, WindowsRuntime, Android, iOS);
Path – название файла в архиве;
Type – тип компоненты (plugin – расширение для браузера, native – Native-компонента, com – COM-компонента). Для внешней компоненты мобильной платформы доступно только значение nativ,;
Object – название объекта, который будет создаваться браузером;
Arch – для какой архитектуры процессора должна использоваться компонента:
i386 – 32-х разрядный процессор,
x86_64 – 64-х разрядный процессор,
ARM – 32-х разрядный процессор с архитектурой ARM;
ARM64 – 64-х разрядный процессор с архитектурой ARM;
Universal – универсальный бинарный файл для операционной системы iOS, содержащий исполняемый код для ARM и ARM64;
Client – используется для Веб-клиента: указывает для какого браузера компонента (MSIE – Internet Explorer, Mozilla Firefox);
clientVersion – версия браузера. Обязательна для браузера Mozilla Firefox;
buildType – тип целевого приложения (developer – приложение, загружающее файл предназначено для разработчика; release – для публикуемой версии приложения). Параметр применяется для ОС iOS;
codeType – язык программирования библиотеки (c++ - библиотека написана на c++; java – библиотека написана по технологии Java Native Interface). Параметр применяется для ОС Android.
Компонента получает широковещательные оповещения, может получать/помещать текст и отслеживать изменения буфера обмена, а также осуществляет связь с bluetooth устройствами с последовательным доступом. Рекумендуется для использования с лазерными и bluetooth сканерами терминалов сбора данных. Предназначена для ОС Андроид.
(2)Добрый день! Напиши пожалуйста как ты настраивал компоненту. Четвертый день ума не могу дать ТСД Honeywell EDA50K
(10) Там основные настройки надо на ТСД производить:
в ТСД:
Настройки --> Scan Settings --> Internal Scanner --> Default profile --> Data Processing Settings -->
Поставить галку Scan to Intent. Ткнуть в поле Data Intent (Именно в строку, а не в галку), откроются настройки Data Intent. Там поставить галку Data Intent и в поле Action вбить произвольное уникальное имя действия. Я ввел: "scan.rcv.message" (без кавычек).
Дальше, в конфигурации-примере Игоря, надо немного код изменить с батарейки на ШК:
В конфигурации, в общей форме FormMain можно прям в ПриСозданииНаСервере() прописать ИмяСобытия = "scan.rcv.message"; (этот имя события, которое задал в настройках ТСД, у меня это "scan.rcv.message").
А в процедуре ПриОткрытии() вместо строк с получением состояния батареи прописать поле "data", из которого получать данные:
barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"data",XMLСтрока(Ложь),XMLСтрока(0));
Компонента.УстановитьПараметр("CaptureData",barcode);
(11) Заработало на ТСД Honeywell EDA50K. Спасибо! До этого были сомнения, т.к. другой сервис для Android? работающий чкерез локальные уведомления не взлетел на 8.3.13.50
(4) Спасибо. Да, похоже дело в версии Андроида, на телефоне с 6-м работает, а на телефоне с 4-м такое же поведение. К сожалению ТСД на 4-м и ее не обновить, попробую с платформой 8.3.9 поэкспериментировать.
(5) Проверил на эмуляторе 4-го андроида - пример к статье работает. Увы, физических устройств с этой версией у меня нет. На терминале с 5-м адроидом тоже все в порядке.
Сканер использует datawedge, Сканер LPT82
В настройках datawedge стоит send Barcode data - clipboard (Есть еще keyboard )
пример с батарейкой работает превосходно.
Но совершенно не могу поймать Шк, Событие есть, а шк в XML нет. Прошу подсказки.
ИмяСобытия = "DATA_SCAN";
имя поля как написано выше "com.symbol.datawedge.data_string"
barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"com.symbol.datawedge.data_string",XMLСтрока(Ложь),XMLСтрока(8));
Компонента.УстановитьПараметр("CaptureData",barcode);
пожалуйста подскажите, что не так.
(150) и да и нет. сейчас часть терминалов использует эту обработку а часть самописную (написанную тоже благодаря бесплатной статье автора).Но насколько мне известно автор доработал функционал с буфером и все работает.
Сканер использует datawedge, Сканер LPT82
В настройках datawedge стоит send Barcode data - clipboard (Есть еще keyboard )
пример с батарейкой работает превосходно.
Но совершенно не могу поймать Шк, Событие есть, а шк в XML нет. Прошу подсказки.
ИмяСобытия = "DATA_SCAN";
имя поля как написано выше "com.symbol.datawedge.data_string"
barcode = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонДанных,"com.symbol.datawedge.data_string",XMLСтрока(Ложь),XMLСтрока(8));
Компонента.УстановитьПараметр("CaptureData",barcode);
пожалуйста подскажите, что не так.
Спасибо. Обновленная версия примера работает стабильно, по крайней мере на имеющемся у меня телефоне с Android 5.0.1 и на ТСД с Android 7.1.1 проблем больше нет. На ТСД перенастроил компоненту на событие от сканера штрихкода, ШК перехватываются замечательно. Специально проверил на предмет описанных в некоторых статьях пропусков при сканировании ШК, у меня на ТСД не получилось заставить пример пропускать сканирования, даже при очень интенсивной работе, при последовательном сканировании нескольких ШК, все работало.
Добрый день, помогите пожалуйста. Установил на ТСД с андроид 4.4, интент ловит и батарейки и сканШК, но данных в них нет. Что можно с этим сделать? Прилагаю скан на Андр8 и на 4.4
Странное поведение компоненты.
Связь ТСД с компьютером через кабель (ADB.exe, Интернет тоже через кабель)
Сценарий 1:
Добавляю на мобильной платформе мобильное приложение, оно загружается на ТСД, сразу вхожу
пользовательский режим.
ПодключитьВнешнююКомпоненту("ОбщийМакет.Component", "Broadcasts", ТипВнешнейКомпоненты.Native)
отрабатывает успешно и впоследствии работает в этом приложении.
Сценарий 2:
После загрузки мобильного приложения на ТСД отключаю кабель, затем вхожу в пользовательский
режим.
ПодключитьВнешнююКомпоненту("ОбщийМакет.Component", "Broadcasts", ТипВнешнейКомпоненты.Native)
не отрабатывает ! И впоследствии не запускается.
Сценарии 1 и 2 запускал несколько раз, поведение не меняется, именно такое, как описано.
Такое ощущение, что при первом подключении компонента обращается к внешнему интернет-ресурсу
и начинает затем работать, только если этот ресурс был доступен.
Если доступ к сети интернет перекрыт службой безопасности, то использовать компоненту проблематично (
Такое поведение наблюдается и в собственном приложении и в приложении, загруженном из конфигурации broadcast.cf, размещенной в публикации.
(15) Никаких обращений к внешним ресурсам через интернет компонента не выполняет. Собирайте приложение сборщиком. Но если хотите запускать через платформу, для приложений с внешними компонентами есть нюансы, приложение должно быть опубликовано на сервере отладки и тогда действительно идет обращение в интернет.
(17)Я настроил сервер отладки (проверил, отладка идет), но ошибка компонента не подключена все равно выходит. Можно как-нибудь отключить этот нюанс?
ТСД Caribe PL-40L (Android 7.0)
(114)Подскажите пожалуйста. Этот код вы исполняете где то при запуске 1с мобильного приложения или при открытии приложения у вас программно запускается форма и при открытии этой формы уже исполняется код?
(67) Подскажите пожалуйста. Этот код вы исполняете где то при запуске 1с мобильного приложения или при открытии приложения у вас программно запускается форма и при открытии этой формы уже исполняется код?
(248)
ПередНачаломРаботыСистемы - вызывается инициализация и помещается в глобальную переменную.
ПриЗавершенииРаботыСистемы - устройство отключается.
Не забудьте что компоненты работают лишь в скомпилированном приложении.
(251) А правильно ли я понял, что после инициализации, где нибудь в форме в которой мы будем находиться во время сканирования, мне надо слушать событие "ОбработкаОповещения" с именем события "scan.rcv.message"?
(331) У меня веб сервер Apache, добавил в mime.types параметры (so apk dylib a). Опубликовал мобильное приложение, подключаюсь к нему, все нормально. Но при выполнении кода "Компонента.Подключить()" выдает код ошибки "0". Не получали такой ошибки? А если собрать APK файл. всё работает нормально).
Пробовал установить демонстрационное приложение на два устройства (в обоих случаях мобильная платформа 8.3.12.64, согласно вашей рекомендации):
1. ТСД Urovo V5100, Android 4.3
2. Чистый телефон Nexus 5, голый андроид 6.0.1
При выполнении команды Компонента.Подключить() приложение вылетает. На Андроиде 4.3 без отображения информации об ошибке, в 6.0.1 выдает следующий текст:
Не подскажете, в чем может быть проблема?
Спасибо.
У меня на ТСД Honeywell тоже самое, хотя на прошлой версии компоненты все работало.
(21) Добрый день!
К сожалению ошибка осталась:
(19) Для Urovo есть нормальный драйвер. Можно на сайте скачать, либо в конфигурации 1С Мобильная касса в макетах. Я дл Urovo 5100 делал приложение в прошлом году, драйвер рабочий.
Тогда все сложнее. Я ошибку воспроизвести не могу, на доступных мне устройствах все работает. В моем коде даже нет такого места Intent.addFlags(int). Максимум что могу, это позже попробовать на эмуляторе nexusa.
(23)
(105)
Добрый день!
К сожалению нет. Что то я наверное не так делаю раз у всех работает а у меня нет.
Результат в виде XML-строки - это здорово.
Но недавно наткнулся на проблему обработки XML-строки платформой 1С.
Вот XML, полученный при считывании штрихового кода на образце упаковки сигарет:
) платформой не обрабатывается.
Приходится вставлять "костыль" СтрЗаменить перед УстановитьСтроку.
Это просто константация факта, особенности обработки XML-представления данных, возвращаемых компонентой.
Для иллюстрации проблемы - изображение этикетки на блоке сигарет.
Обработка строки XML, возвращаемой компонентой при чтении
кода DataMatrix с этикетки, вызывает исключение в платформе 1С
( ЧтениеXML.Прочитать() )
С выходом 1С 839 появился баг в работающей до этого компоненте.
На серверной базе (на файловой все работает отлично) хоть тресни сыпет ошибки Тип не определен на всех попытках вызова классов.
Причем появлятся это только после второго использования.
То есть первый раз - все работает замечательно!
Но стоит только второй раз запустить туже обработку с компонентой - сыпет баг и хоть тресни.
Повторюсь - на файловой версии все отлично.
На серверной - баг после повторного использования.
Он сам не знает и не понимает - уже переколошматили все.
Все отлично работает за исключением сказанного.
Сервер - второй запуск.
А повторное подключение любой другой компоненты работает нормально?
Если да, то проблема именно в этой конкретной ВК, может, завершается там где-то чего-то некорректно.
Если с другими компонентами так же, может, это "фича" платформы.
(2) Значит ВК уже выгрузилась. Смотри где Ссылки на ВК обнуляются. Я на 64 разрядной пробовал все нормально.
(10) для серверной этот метод не доступен.
Единственный метод который доступен это ПодключитьВНешнююКомпоненту и он работает
(3) Ну то есть разработчик с дебаггером студии не смог отловить процесс инициализации компоненты и ошибку, которая в этот момент возникла, а мы тут по кофейной гуще всё угадаем?
Клиент х64 только в 8.3.9 появился, до этого только х86 (значит, все файловые версии х86), а сервера часто х64, компонента компилится отдельно для х86, отдельно для х64 - ты хоть сказал бы, какая архитектура. У тебя там вообще разные билды этой компоненты могут быть.
Платформа содержит оптимизацию - она в кэше хранит ВК и повторно подключает не так, как первый раз.
1. Попробовать поменять дурацкое имя XLS (которое в середине. Его определяет тот, кто использует метод ПодключитьВнешнююКомпоненту во втором параметре). Возможно, происходит конфликт где-то из-за имени
2. Если не помогает, генерить новое произвольное имя при каждом использовании. Это заполонит кэш, но по идее будет работать
(15) Так глюка с подключением во внешней обработке, когда на первое открытие обработки все ОК, а если повторно то нифига не сервере не пашет.
Потому что некоторые дятлы до сих пор не смогли понять что такое клиент-серверная УФ 1С.
Эта статья дает представление о работе внешних компонент в системе «1С: Предприятие».
Будет показан процесс разработки внешней компоненты для системы «1С: Предприятие» версии 8.2, работающей под управлением ОС семейства Windows с файловым вариантом работы. Такой вариант работы используется в большинстве решений, предназначенных для предприятий малого бизнеса. ВК будет реализована на языке программирования C++.
Внешние компоненты «1C: Предприятие»
- с использованием Native API
- с использованием технологии COM
Структура ВК
Внешняя компонента системы «1С: Предприятие» представлена в виде DLL-библиотеки. В коде библиотеки описывается класс-наследник IComponentBase. В создаваемом классе должны быть определены методы, отвечающие за реализацию функций внешней компоненты. Более подробно переопределяемые методы будут описаны ниже по ходу изложения материала.
Запуск демонстрационной ВК
- Выполнить сборку внешней компоненты, поставляемой с подпиской ИТС и предназначенной для демонстрации основных возможностей механизма внешних компонент в 1С
- Подключить демонстрационную компоненту к конфигурации 1С
- Убедиться в корректной работоспособности заявленных функций
Компиляция
Демонстрационная ВК расположена на диске подписки ИТС в каталоге «/VNCOMP82/example/NativeAPI».
Для сборки демонстрационной ВК будем использовать Microsoft Visual Studio 2008. Другие версии данного продукта не поддерживают используемый формат проекта Visual Studio.
Открываем проект AddInNative. В настройках проекта подключаем каталог с заголовочными файлами, необходимыми для сборки проекта. По умолчанию они располагаются на диске ИТС в каталоге /VNCOMP82/include.
Результатом сборки является файл /bind/AddInNative.dll. Это и есть скомпилированная библиотека для подключения к конфигурации 1С.
Подключение ВК к конфигурации 1С
Создадим пустую конфигурацию 1С.
Ниже приведен код модуля управляемого приложения.
Если при запуске конфигурации 1С не было сообщено об ошибке, то ВК была успешно подключена.
В результате выполнения приведенного кода в глобальной видимости конфигурации появляется объект ДемоКомп, имеющий свойства и методы, которые определены в коде внешней компоненты.
Демонстрация заложенного функционала
Произвольное имя внешней компоненты
Задача: Изменить имя внешней компоненты на произвольное.
В предыдущем разделе использовался идентификатор AddInNativeExtension, смысл которого не был пояснен. В данном случае AddInNativeExtension — это наименование расширения.
В коде ВК определен метод RegisterExtensionAs, возвращающий системе «1С: Предприятие» имя, которое необходимо для последующей регистрации ВК в системе. Рекомендуется указывать идентификатор, который в известной мере раскрывает суть внешней компоненты.
Приведем полный код метода RegisterExtensionAs с измененным наименованием расширения:
В приведенном примере имя ВК изменено на SomeName. Тогда при подключении ВК необходимо указывать новое имя:
Расширение списка свойств ВК
- Изучить реализацию свойств ВК
- Добавить свойство строкового типа, доступное для чтения и записи
- Добавить свойство строкового типа, доступное для чтения и записи, которое хранит тип данных последнего установленного свойства. При установке значения свойства никаких действий не производится
- Убедиться в работоспособности произведенных изменений
Полное описание методов, включая список параметров подробно описан в документации, поставляемой на диске ИТС.
Рассмотрим реализацию приведенных методов класса CAddInNative.
В демонстрационной ВК определены 2 свойства: Включен и ЕстьТаймер (IsEnabled и IsTimerPresent).
В глобальной области видимости кода библиотеки определено два массива:
которые хранят русское и английское названия свойств. В заголовочном файле AddInNative.h определяется перечисление:
- Добавить имя добавляемого свойства в массивы g_PropNames и g_PropNamesRu (файл AddInNative.cpp)
- В перечисление Props (файл AddInNative.h) перед ePropLast добавить имя, однозначно идентифицирующее добавляемое свойство
- Организовать память под хранение значений свойств (завести поля модуля компоненты, хранящие соответствующие значения)
- Внести изменения в методы GetPropVal и SetPropVal для взаимодействия с выделенной на предыдущем шаге памятью
- В соответствии с логикой приложения внести изменения в методы IsPropReadable и IsPropWritable
Перечисление Props будет иметь вид:
Для значительного упрощения кода будем использовать STL C++. В частности, для работы со строками WCHAR, подключим библиотеку wstring.
Для сохранения значения метода Тест, определим в классе CAddInNative в области видимости private поле:
Для передачи строковых параметров между «1С: Предприятие» и внешней компонентов используется менеджер памяти «1С: Предприятие». Рассмотрим его работу подробнее. Для выделения и освобождения памяти соответственно используются функции AllocMemory и FreeMemory, определенные в файле ImemoryManager.h. При необходимости передать системе «1С: Предприятие» строковый параметр, внешняя компонента должна выделить под нее память вызовом функции AllocMemory. Ее прототип выглядит следующим образом:
где pMemory — адрес указателя, в который будет помещен адрес выделенного участка памяти,
ulCountByte — размер выделяемого участка памяти.
Пример выделения памяти под строку:
Для удобства работы с строковыми типами данными опишем функцию wstring_to_p. Она получает в качестве параметра wstring-строку. Результатом функции является заполненная структура tVariant. Код функции:
Тогда соответствующая секция case оператора switch метода GetPropVal примет вид:
Метода SetPropVal:
Для реализации второго свойства определим поле класса CaddInNative
в котором будем сохранять тип последнего переданного значения. Для этого в метод CaddInNative::SetPropVal добавим команду:
Теперь при запросе чтения значения второго свойства будем возвращать значение last_type, чего требует обозначенное задание.
Проверим работоспособность произведенных изменений.
Для этого приведем внешний вид конфигурации 1С к виду:
Расширение списка методов
- Расширить функционал внешней компоненты следующим функционалом:
- Изучить способы реализации методов внешней компоненты
- Добавить метод-функцию Функц1, которая в качестве параметра принимает две строки («Параметр1» и «Параметр2»). В качестве результата возвращается строка вида: «Проверка. Параметр1, Параметр2»
- Убедиться в работоспособности произведенных изменений
- Добавить имя метода в массивы g_MethodNames и g_MethodNamesRu (файл AddInNative.cpp)
- Добавить осмысленный идентефикатор метода в перечисление Methods (файл AddInNative.h)
- Внести изменения в код функции GetNParams в соответствии с логикой программы
- При необходимости внести изменения в код метода GetParamDefValue, если требуется использовать значения по умолчанию параметров метода.
- Внести изменения в функцию HasRetVal
- Внести изменения в логику работы функций CallAsProc или CallAsFunc, поместив туда непосредственно исполняемый код метода
Отредактируем функцию GetNProps, чтобы она возвращала количество параметров метода «Тест»:
Внесем изменения в функцию CAddInNative::GetParamDefValue:
Благодаря добавленной строке
в случае отсутствия одного или нескольких аргументов соответствующие параметры будут иметь пустое значение (VTYPE_EMPTY). Если необходимо наличие значения по умолчанию для параметра, следует задать его в секции eMethTest оператора switch функции CAddInNative::GetParamDefValue.
Так как метод «Тест» может возвращать значение, необходимо внести изменения в код функции HasRetVal:
И добавим исполняемый код метода в функцию CallAsFunc:
Скомпилируем компоненту и приведем код конфигурации к виду:
Таймер
- Изучить реализацию таймера в демонстрационной ВК
- Модифицировать метод «СтартТаймер», добавив возможность передавать в параметрах интервал срабатывания таймера (в миллисекундах)
- Убедиться в работоспособности произведенных изменений
Рассмотрим реализацию таймера в демонстрационной ВК.
Так как мы рассматриваем процесс разработки внешней компоненты для ОС семейства Windows, не будем рассматривать реализацию таймера в других операционных системах. Для ОС GNU/Linux, в частности, реализация будет отличаться синтаксисом функции SetTimer и TimerProc.
В исполняемом коде вызывается метод SetTimer, в который передается функция MyTimerProc:
Идентефикатор созданного таймера помещается в переменную m_uiTimer, чтобы в последствии его можно было отключить.
Функция MyTimerProc выглядит следующим образом:
Приведем код метода CallAsProc к виду:
Теперь проверим работоспособность. Для этого в модуле управляемого приложения конфигурации напишем код:
Взаимодействие с системой «1С: Предприятие»
Тип данных tVariant
При обмене данными между внешней компонентой и системой «1С: Предприятие» используется тип данных tVariant. Он описан в файле types.h, который можно найти на диске с ИТС:
- смесь (union), предназначенную непосредственно для хранения данных
- идентификатор типа данных
- Определение типа данных, которые в данный момент хранятся в переменной
- Обращение к соответствующему полю смеси, для непосредственного доступа к данным
Приложение
Читайте также: