1с как вызвать внешнее событие
В компанию был куплен аппарат CipherLab RS30, ТСД на базе ОС Android 4.4.2 cо встроенным сканером штрихкода. Было решено разработать приложение для работы с этим чудом техники на базе Мобильной Платформы 1С. Для примера была взята конфигурация "Мобильная Касса", в которой была уже реализована работа со штрихсканером, с помощью внешних компонент (Стандартная от 1С, вторая от компании ScanCode).
После опытов оказалось, что штрихкод считывается во внешнем окне, которое загораживает весь интерфейс, плюс для каждого считывания штрихкода нужно нажимать кнопку для вызова этого окна, что было совершенно неприемлемо. Было принято решение разработать собственную внешнюю компоненту для считывания штрихкода и передачи его в 1С, без дополнительных окон и нажатий лишних кнопок.
Пришлось декомпилировать платформу, изучить весь внутренний код, но все попытки заканчивались неудачей. И вот настал день, когда надо было окончательно решить, каким способом организовать работу с этим аппаратом, и мы было уже отказались от идеи внешней компоненты и подумывали запустить всю систему через RDP, как, о чудо, после еще одной отчаянной попытки решение было найдено.
А теперь самое главное.
Ограничения: Данный способ подходит только для приложений, собранных с помощью Конфигурации "Сборщик мобильных приложений", также способ подразумевает небольшое вмешательство в исходные файлы мобильной платформы.
Дано:
1. CipherLab RS30
2. SDK для вашего сканера
3. Сборщик мобильных приложений
4. Сама мобильная платформа
5. Android Studio
А теперь начинается магия:
1. Распаковываем файлы платформы
2. Нас интересует Android\prjandroid-arm\bin\permissions.xml этот файл
Этот файл используется при сборке приложений и добавляет в AndroidManifest разрешения, которые указаны в конфигурации.
3. Нас интересует секция , которая добавляется, если установлена отметка Локальные Уведомления в требуемых разрешениях мобильного приложения. По умолчанию она выглядит так.
5. Дальше нам нужно добавить фильтр, который будет указывать, какое событие может принять наш receiver, его-то мы и будем передавать из нашей компоненты.
Теперь наша секция должна выглядеть так
6. Теперь запаковываем все обратно, наша мобильная платформа готова.
7. Дальше можно приступать и к разработке в 1С, создаем обработчик локальных уведомлений
Всем большое спасибо за внимание, надеюсь, эта информация будет кому-нибудь полезна.
В результате был написан внешний сервис, работающий в фоновом режиме, который получает штрихкод со сканера и передает его в 1С.
Требуется:
Я нажимаю сочетание клавиш в конфигураторе, при этом генерируется внешнее событие, которое перехватывается формой и вызывается соответствующая процедура во внешней обработке. При этом сочетаний клавиш может быть несколько.
Другими словами - я хочу вызвать некое действие в 1С не переключаясь на его окно
Может ли кто-нибудь поделиться примером, или хотя бы кинуть идею, как это можно было бы реализовать?
Данная задача не одноразовая.
Есть желание сделать что-то подобное, как в этом видео .
Если получится, то решение планирую выложить в виде статьи
(3) ditp, спасибо! Попробую
(4) 6есик, а он сможет сгенерить внешнее событие в 1С ? Или нужна еще вторая программа, которую он должен запустить, чтобы та дернула 1С ?
(5) yurii_host, на счет генерации события не знаю, но вот отослать нужную кобинацию клавиш в окно обработки или же интерактивно на что то нажать сможет.
(7) 6есик, тоже хорошая идея, спасибо. Позже будет время попробовать.
Только есть опасения, что комбинация клавиш может не сработать, если окно неактивно
(4) 6есик, как вариант можно из хоткея генерить файл в зависимости от сочетания с разным содержанием, а на форме через обработчик ожидания проверять наличие этого файла. Если нашли, то считывать и удалять.
Опять же не исключена возможность что AHK может и сделать окно активным - хотя и в свернутые приложения вроде отправляет.
Поидее можно на обработке поле ввода сделать и навесить событие на изменение поля ввода , а хоткеем бросать данные в это поле ввода.
(9) 6есик, без экспериментов не обойтись. После работы смогу уделить им время.
Вариант, предложенный (3) ditp, тоже выглядит многообещающе
На самом деле перехват какой-то комбинации клавиш можно организовать вообще не применительно к какой-либо программе. А вот с откликом УФ на сигнал от перехватчика сложнее.
Требуется:
Я нажимаю сочетание клавиш в конфигураторе, при этом генерируется внешнее событие, которое перехватывается формой и вызывается соответствующая процедура во внешней обработке.
Не хотелось бы огорчать, но автор и читающие, явно упускают из виду - режим "конфигуратор" и режим "предприятие" это несколько разное.
В первом случае все сочетания клавиш уже предопределены, как и вызов служебных обработок.
Для реализации нужно запустить командный файл, написанный на доступном Вам языке. Тогда обработчик перехватит нажатие клавиш, но не конфигуратор, он заточен только на внутренние модули. Батником можно запустить конфигуратор в разных режимах - тестирование, исправление и тд. В документации это есть.
(12) white-mount, не хотелось бы огорчать, но автор не упускает это из виду. Он понимает, что задача не тривиальная, но выполнимая. Именно поэтому он обратился на форум, с надеждой, что кто-нибудь вдруг делал что-либо подобное и сможет подсказать, или натолкнуть на мысль
(13) yurii_host, уважаемый,
судя по комментам, упускают. Все посты о запуске инструментов из предприятия.
(14) white-mount, все правильно. Тут задача состоит из двух частей:
1. Сгенерировать событие из конфигуратора (или находясь в конфигураторе)
2. Перехватить событие в пользовательском режиме.
Я провел несколько экспериментов. К сожалению, на данный момент решения пока не нашел.
Компонента, предложенная в (3) ditp, перехватывает события клавиатуры только при условии что текущим окном является окно предприятия. Т.е. нужно переключаться и нажимать сочетание клавиш. Этот вариант мне не подходит.
Программа, предложенная в (4) 6есик, мне показалась слишком сложной [для меня], в ней свой язык программирования, требуется инсталляция. В общем тоже не подошла по ряду причин.
Пока наиболее перспективным для решения этой задачи является Снегопат. Штудирую информацию в этом направлении.
(15) yurii_host,
"сложное ненужно, нужное несложно".
Попробуйте описать для себя - а для ча?
Простое решение всегда рядом с самой проблемой, найти его мешают стереотипы мышления.
Зачем стучать по молотку, если в соседней комнате согнулся гвоздь?
Интересующее событие отлавливается где? В динамично изменяющихся данных субд.
Тогда причём её редактор?
(17) yurii_host, Уважаемый, не хочу Вас разочаровывать, но с ёС у Вас подобного фокуса не выйдет. Режим предприятия работает только с сохранённым кодом. А это значит обработку или конфигурацию, Вам, необходимо вначале записать . Вы не можете редактировать функционалом 1С, "на лету", уже исполняемый код, он передан менеджеру и находится в ram, если Вам только не удалось найти его адрес. Но это хакерская заморочка конфигуратору 1С не по зубам.
Но Вы дерзайте, а вдруг есть недокументированная возможность?!
Удачи.
(18) white-mount, спасибо за благословение. Куда ж я без него!
Так много утверждений.
Если кто-то чего-то недопонимает или не знает, то это не значит, что это невозможно реализовать))
Давайте подведём черту:
Семантика и Синтаксис 1С позволяет субд 1С( предприятие) создать объект "конфигуратор", что то в него записать, но не позволяет перехватить нажатую клавишу в открытом объекте "конфигуратор".
Нужно прикрутить расширение, скажем скромный аналог диспетчера задач, ибо он должен понимать, какой процесс опубликовал эту клавишу. Без скромного такого модуля на с, с набором dll, тут делать нечего.
Когда хакните 1С, стукните плиз в личку, ибо:
- "учиться,
. учиться,
. и ещё раз учиться. ", как завещал нам Великий Ленин))).
В компанию был куплен аппарат CipherLab RS30, ТСД на базе ОС Android 4.4.2 cо встроенным сканером штрихкода. Было решено разработать приложение для работы с этим чудом техники на базе Мобильной Платформы 1С. Для примера была взята конфигурация "Мобильная Касса", в которой была уже реализована работа со штрихсканером, с помощью внешних компонент (Стандартная от 1С, вторая от компании ScanCode).
После опытов оказалось, что штрихкод считывается во внешнем окне, которое загораживает весь интерфейс, плюс для каждого считывания штрихкода нужно нажимать кнопку для вызова этого окна, что было совершенно неприемлемо. Было принято решение разработать собственную внешнюю компоненту для считывания штрихкода и передачи его в 1С, без дополнительных окон и нажатий лишних кнопок.
Пришлось декомпилировать платформу, изучить весь внутренний код, но все попытки заканчивались неудачей. И вот настал день, когда надо было окончательно решить, каким способом организовать работу с этим аппаратом, и мы было уже отказались от идеи внешней компоненты и подумывали запустить всю систему через RDP, как, о чудо, после еще одной отчаянной попытки решение было найдено.
А теперь самое главное.
Ограничения: Данный способ подходит только для приложений, собранных с помощью Конфигурации "Сборщик мобильных приложений", также способ подразумевает небольшое вмешательство в исходные файлы мобильной платформы.
Дано:
1. CipherLab RS30
2. SDK для вашего сканера
3. Сборщик мобильных приложений
4. Сама мобильная платформа
5. Android Studio
А теперь начинается магия:
1. Распаковываем файлы платформы
2. Нас интересует Android\prjandroid-arm\bin\permissions.xml этот файл
Этот файл используется при сборке приложений и добавляет в AndroidManifest разрешения, которые указаны в конфигурации.
3. Нас интересует секция , которая добавляется, если установлена отметка Локальные Уведомления в требуемых разрешениях мобильного приложения. По умолчанию она выглядит так.
5. Дальше нам нужно добавить фильтр, который будет указывать, какое событие может принять наш receiver, его-то мы и будем передавать из нашей компоненты.
Теперь наша секция должна выглядеть так
6. Теперь запаковываем все обратно, наша мобильная платформа готова.
7. Дальше можно приступать и к разработке в 1С, создаем обработчик локальных уведомлений
Всем большое спасибо за внимание, надеюсь, эта информация будет кому-нибудь полезна.
В результате был написан внешний сервис, работающий в фоновом режиме, который получает штрихкод со сканера и передает его в 1С.
Обработчик внешнего события
Описание. Обработчик внешнего события используется для работы с объектами автоматизации, поддерживающими внешние события. Например, это могут быть драйвера каких-либо устройств. Обработчик вызывается внешним приложением.
Программа поддерживает события следующих видов :
В зависимости от вида события, его включение и порядок обработки различается .
События от внешних компонент 1С.
Если это внешняя компонента программы 1С, то для того чтобы внешние событие вызывалось, необходимо просто создать объект (с помощью функции СОЗДАТЬ_ОБЪЕКТ ). Вызов событий прекращается при завершении работы с объектом (с помощью ЗАКРЫТЬ или при завершении работы алгоритма). Чтобы события вызывались всё время работы программы надо использовать глобальные переменные. Например, можно в обработчике при старте программы инициализировать глобальную переменную типа ОБЪЕКТ , представляющую драйвер устройства:
ГЛОБАЛ ПЕРЕМ ОБЪЕКТ : ДрайверККМ
ФУНКЦИЯ ЖУРНАЛ ( накладные_доп ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
СТАТУС ( "Загрузка драйвера ККМ. " )
ДрайверККМ = СОЗДАТЬ_ОБЪЕКТ ( "Addin.SharpDriver" , "SharpDrv.dll" )
В этом случае события будут вызываться до окончания работы с программой.
При срабатывании внешнего события вызывается обработчик. В него передаются три параметра источник , событие и данные . Все они инициализируются внешним приложением, поэтому содержание этих параметров надо смотреть в документации к этому приложению или драйверу.
Также в обработчик также передается параметр редактор логического типа. Если он истинен, значит, пользователь редактирует запись этого журнала. В этом случае поля объекта ЖУРНАЛ , для которого вызывается обработчик, будут инициализированы полями редактируемой записи и для обработчика будет действовать логика работы обработчиков в диалоге.
Если параметр редактор = НЕТ , поля объекта инициализированы значениями по умолчанию.
ФУНКЦИЯ ЖУРНАЛ ( накладные_доп ) ВнешнееСобытие ( СТРОКА : источник, событие, данные;
// Обрабатываем внешнее событие от драйвера устройства
ЕСЛИ источник = "ДрайверККМ" ТО
ДрайверККМ. CommandID = данные
КодОшибки = ДрайверККМ. GetCommandParams ()
ЕСЛИ КодОшибки = 0 ТО
// Обработка события, например, добавление новой операции
// в журнал накладные
1) Внешние события срабатывают только в случае, если программа не выполняет какой-либо расчет.
2) Обработчик не срабатывает в случае, если вызвана функция ЗАПРОС_ВНЕШНЕГО_СОБЫТИЯ .
Для запуска COM-событий необходимо создать объект (с помощью функции СОЗДАТЬ_ОБЪЕКТ ) и включить обработку событий методом ВКЛ_СОБЫТИЕ . В остальном COM-события работают так же, как и события от внешних компонент 1С. А именно. Вызов событий прекращается при завершении работы с объектом (с помощью ЗАКРЫТЬ или при завершении работы алгоритма). Чтобы события вызывались всё время работы программы надо использовать глобальные переменные. Также глобальные переменные используются при получении параметров внешних событий. Например, можно в обработчике при старте программы инициализировать глобальную переменную и включить обработку событий :
ГЛОБАЛ ПЕРЕМ ОБЪЕКТ: TAPI
ГЛОБАЛ ПЕРЕМ ЧИСЛО: TAPI_EVENT_TYPE
ГЛОБАЛ ПЕРЕМ ОБЪЕКТ: TAPI_EVENT_PARAM
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
СТАТУС ( "Инициализация TAPI. " )
ПЕРЕМ ОБЪЕКТ: addresses_coll, address
TAPI = СОЗДАТЬ_ОБЪЕКТ ( "TAPI.TAPI.1" )
TAPI.Initialize()
// Включаем события. При срабатывании будут заполнятся переменные TAPI_EVENT_TYPE и TAPI_EVENT_PARAM
TAPI. ВКЛ_СОБЫТИЕ ( "" : ДА : 1: "INT,DISPATCH" , TAPI_EVENT_TYPE, TAPI_EVENT_PARAM)
ЦИКЛ ДЛЯ (i = 2, addresses_coll.Count)
// Будем отслеживать внутренние телефоны 13 и 17
ЕСЛИ address.QueryMediaType(TAPIMEDIATYPE_AUDIO) И address.DialableAddress ИЗ [ "13" , "17" ] ТО
TAPI.RegisterCallNotifications(address, ДА, ДА, $00000008 , 2);
В этом случае события будут вызываться до окончания работы с программой.
При срабатывании внешнего события вызывается обработчик. В него передается параметр источник . Он содержит ГУИД класса, который при включении события был передан в метод ВКЛ_СОБЫТИЕ. Для доступа к параметрам события используются глобальные переменные, которые были переданы в ВКЛ_СОБЫТИЕ .
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие)
ПЕРЕМ ОБЪЕКТ: call, address
ЕСЛИ call.CallState = CS_INPROGRESS ТО
ОТЛАДКА (address.DialableAddress + ": Сняли трубку" );
ИНАЧЕ_ЕСЛИ call.CallState = CS_CONNECTED ТО
ОТЛАДКА (address.DialableAddress + ": Соединились с " + call.CallInfoString[CIS_CONNECTEDIDNUMBER]);
ИНАЧЕ_ЕСЛИ call.CallState = CS_DISCONNECTED ТО
ОТЛАДКА (address.DialableAddress + ": Положили трубку" );
ИНАЧЕ_ЕСЛИ call.CallState = CS_OFFERING ТО
ОТЛАДКА (address.DialableAddress + ": Вам звонит " + call.CallInfoString[CIS_CALLERIDNUMBER]);
1) Внешние события срабатывают только в случае, если программа не выполняет какой-либо расчет.
2) Обработчик не срабатывает в случае, если вызвана функция ЗАПРОС_ВНЕШНЕГО_СОБЫТИЯ .
События от потокового серверного сокета.
После вызова функции СЕРВЕР_ПОДКЛЮЧИТЬ данные, отправляемые серверным сокетом программа сможет получать с помощью обработчика внешнего события . Вызов событий прекращается после отключения от серверного сокета. Это делается с помощью той же функции СЕРВЕР_ПОДКЛЮЧИТЬ при передаче пустой строки вместо имени сервера.
Подключиться к серверному сокету можно, например, в обработчике при старте программы:
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
При отправке сервером данных вызывается обработчик. В него передается параметр источник равный "TCPClient" . Параметр событие равен адресу сервера, а параметр данные содержит передаваемые данные (для разбивки данных на фрагменты необходимо указывать разделитель, см. описание функции СЕРВЕР_ПОДКЛЮЧИТЬ ).
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)
ЕСЛИ источник = " TCPClient " ТО
ОТЛАДКА (событие, данные)
События от HID-устройства.
После вызова функции ВКЛ_СОБЫТИЯ_КЛАВИАТУРЫ нажатия на клавиши от заданного HID-устройства перестают приходить в программу и вместо этого начинает срабатывать обработчик внешнего события.
Включить перенаправление можно, например, в обработчике при старте программы:
Примером использования данной функции является работа со сканером, работающим в режиме эмуляции клавиатуры (PS/2). Такой сканер эмулирует нажатия клавиш на клавиатуре, но после вызова функции ВКЛ_СОБЫТИЯ_КЛАВИАТУРЫ вместо нажатий клавиш будет вызываться обработчик внешнего события (более детально см. описание этой функции).
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
Обработчик внешнего события срабатывает не при каждом поступлении сигнала о нажатой клавиши, а только после нажатия на клавишу возврата каретки. Встретив клавишу возврата каретки программа отправляет в обработчик строку из всех нажатых клавиш в параметре данные , источник будет равен "HID", а событие содержит название устройства.
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)
ЕСЛИ источник = "HID" ТО
ОТЛАДКА (событие, данные)
Отправка событий из программы
С помощью функции ПОСЛАТЬ_СОБЫТИЕ можно инициировать вызов обработчика внешнего события. Возможен отложенный вызов, когда событие срабатывает через определенное время.
С помощью функции УДАЛИТЬ_СОБЫТИЯ можно удалить все ранее посланные события (посланные, но не выполненные).
С помощью функции ПОСЛАТЬ_УВЕДОМЛЕНИЕ можно создать уведомление в Центре уведомлений Windows (начиная с Windows 10 и в усеченном виде в Windows 8) . Некоторые из этих уведомлений могут содержать элементы управления (кнопки, меню и т.д.). Пользователь, совершая действия, например нажимая кнопку на уведомлении, будет инициировать вызов обработчика внешнего события (если программа в этот момент еще работает). В него передается параметр источник равный "Toast" . Параметр событие равен идентификатору события, а параметр данные содержит передаваемые данные ( они задаются при создании события ).
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)
В компанию был куплен аппарат CipherLab RS30, ТСД на базе ОС Android 4.4.2 cо встроенным сканером штрихкода. Было решено разработать приложение для работы с этим чудом техники на базе Мобильной Платформы 1С. Для примера была взята конфигурация "Мобильная Касса", в которой была уже реализована работа со штрихсканером, с помощью внешних компонент (Стандартная от 1С, вторая от компании ScanCode).
После опытов оказалось, что штрихкод считывается во внешнем окне, которое загораживает весь интерфейс, плюс для каждого считывания штрихкода нужно нажимать кнопку для вызова этого окна, что было совершенно неприемлемо. Было принято решение разработать собственную внешнюю компоненту для считывания штрихкода и передачи его в 1С, без дополнительных окон и нажатий лишних кнопок.
Пришлось декомпилировать платформу, изучить весь внутренний код, но все попытки заканчивались неудачей. И вот настал день, когда надо было окончательно решить, каким способом организовать работу с этим аппаратом, и мы было уже отказались от идеи внешней компоненты и подумывали запустить всю систему через RDP, как, о чудо, после еще одной отчаянной попытки решение было найдено.
А теперь самое главное.
Ограничения: Данный способ подходит только для приложений, собранных с помощью Конфигурации "Сборщик мобильных приложений", также способ подразумевает небольшое вмешательство в исходные файлы мобильной платформы.
Дано:
1. CipherLab RS30
2. SDK для вашего сканера
3. Сборщик мобильных приложений
4. Сама мобильная платформа
5. Android Studio
А теперь начинается магия:
1. Распаковываем файлы платформы
2. Нас интересует Android\prjandroid-arm\bin\permissions.xml этот файл
Этот файл используется при сборке приложений и добавляет в AndroidManifest разрешения, которые указаны в конфигурации.
3. Нас интересует секция , которая добавляется, если установлена отметка Локальные Уведомления в требуемых разрешениях мобильного приложения. По умолчанию она выглядит так.
5. Дальше нам нужно добавить фильтр, который будет указывать, какое событие может принять наш receiver, его-то мы и будем передавать из нашей компоненты.
Теперь наша секция должна выглядеть так
6. Теперь запаковываем все обратно, наша мобильная платформа готова.
7. Дальше можно приступать и к разработке в 1С, создаем обработчик локальных уведомлений
Всем большое спасибо за внимание, надеюсь, эта информация будет кому-нибудь полезна.
В результате был написан внешний сервис, работающий в фоновом режиме, который получает штрихкод со сканера и передает его в 1С.
Читайте также: