Как создать внешнее событие из компоненты или службы C#

1. oleg-x 26 29.06.21 17:14 Сейчас в теме
Есть задача, написать программу/службу/компоненту, которая бы опрашивала оборудование по списку. Здесь проблем не возникло. А вот застряли на передачи значений в 1С.
Суть такова, есть весы. С весов нужно получать значения, так как весы пассивные их нужно постоянно опрашивать и выводить на печать этикетку. И все бы ничего, но как сгенерировать внешнее событие на форме 1С. Почему именно внешнее событие? 1С не умеет печатать на сервере, хотели сделать фоновое задание, которое бы проверяло новые записи в регистре, но вариант отпал. А обработчик ожиданий может опрашивать один раз в секунду и подвешивает интерфейс.
1С 8.3.17 конфигурация УТ 10.3 обычные формы. Клиент-Сервер.
Все уже сделали, но программист C# не работал раньше с 1С и не понимает как создать сгенерировать внешнее событие на форме.
Все примеры для делфи и С+, а вот для C# ничего толкового по внешним событиям не нашли.
Что сейчас получилось:
1) Подключить внешнюю компоненту как COM объект.
2) Вызвать функцию, которая генерирует внешнее событие, но при этом "подвешивает интерфейс", то есть 1С ждет, пока компонента вернет значение, а это не подходит.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
24. user856012 13 29.06.21 23:56 Сейчас в теме +5 $m
(23)
меня интересует сам механизм вызова внешнего события 1С
Ну, тогда последнее, что могу предложить: https://infostart.ru/public/19248/

P.S. На всякий случай: ссылка на исходники в комментарии (79)
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
26. Serginio 938 01.07.21 12:22 Сейчас в теме
3. starik-2005 3036 29.06.21 17:32 Сейчас в теме
А почему нельзя этикетку напечатать из C#? Нарисовали в бартендере этикетос, на выходе шаблон, запросили у 1С данные для него (через HTTP-сервис), засунули в шаблон, отправили на принтер. И не нужна никакая внешняя компонента.
4. oleg-x 26 29.06.21 17:40 Сейчас в теме
(3) Это усложняет разработку, тогда придется весь функционал реализовывать в сторонней программе. И стоимость разработки соответственно увеличится.
Если мы что то захотим изменить, придется каждый раз обращаться к программисту C#, а если реализовать только получение данный, то все остальное будет делать штатный программист 1С.
5. starik-2005 3036 29.06.21 17:45 Сейчас в теме
(4)
то все остальное будет делать штатный программист 1С
Я при таком раскладе много как делал. Например, печатал этикетки после фиксации веса на терминале сбора данных. Как? На терминале мобильное приложение 1С дергало 1С, 1С дергала весы, отправляла вес в терминал, одновременно с этим записывала данные в регистр сведений. Клиентская 1С висела и раз в 3 секунды опрашивала регистр сведений, после чего печатала этикетку по данным из регистра, если они там были, ну и устанавливала признак "Напечатано". И никакого C#. Я вообще не понимаю, зачем Вам с весов данные получать через C#?
6. starik-2005 3036 29.06.21 17:50 Сейчас в теме
ЗЫ: мы как-то одному мясному цеху делали автоматизацию: поставили несколько терминалов (моноблоков с тачскрином), подоткнули к моноблокам весы, принтера, сканеры. В итоге кусок мяса на весы - в интерфейсе 1С вес (обработка ожидания в модуле управляемого приложения 5 раз в секунду опрашивала весы через их COM-объект). Нажимаешь "Печать" - вылезает этикетка. Причем этих этикеток - 100 вариантов для каждого покупателя/товара (PLU), используется встроенный в БСП редактор этикеток. Замучились со вкусвилловскими этикетками, которые еще отдельно на короб печатались при закрытии короба - там в одном случае ЕАН, во втором код128.
7. oleg-x 26 29.06.21 17:56 Сейчас в теме
(5) Стандартный драйвер от производителя (Масса К серии R) может опрашивать весы. То есть все можно сделать без стороннего программирования.
Но возникла проблема, драйвер одновременно может подключаться только к 1 весам. Время получения данных составляет 5-6 секунд.
То есть чем больше весов одновременно работает, тем дольше ожидание.
Все это нужно для фасовки и приемки и ожидание даже в 2 секунды увеличивает время каждой операции, что для нас критично.
А покупать каждым весам (и так не дешевым весам и принтерам) еще и компьютер, выйдет совсем дороговато.
10. starik-2005 3036 29.06.21 18:15 Сейчас в теме
(7)
Время получения данных составляет 5-6 секунд.
Это создание COM-объекта, я его сохраняю, в итоге массу получаю 5 раз в секунду в 1С.
8. oleg-x 26 29.06.21 17:58 Сейчас в теме
(6) Так же проблема с установкой компьютера, цех моется или надо покупать влагозащищенный моноблок (не из дешевых). Так же реальность такова, что конкретного рабочего места нет, то есть моноблок еще как то надо установить на стол, где уже весы и принтер этикеток.
Вообщем для нас не вариант.
9. starik-2005 3036 29.06.21 18:12 Сейчас в теме
Ну норм. Там протокол - детский сад. Посылается в порт 0x45, из порта вываливается два байта с массой и знаком.
https://massa.ru/upload/iblock/7db/1mhbbf6oxn9cy0060urc8tr3d1ebgzgn/MACCA_­K_Protocol2_2021.pdf

Я бы на каком-нить ESP8266 сделал бы в два счета такой механизм, который бы в WIFI валил бы через MQTT номер весов и данные, а 1С могла бы получать оттуда, постоянно опрашивая какого-нить кролика.
11. oleg-x 26 29.06.21 18:16 Сейчас в теме
(9) протокол простой, это уже реализовано. Только не получение массы, получение регистрации в памяти весов. Не нужно проверять на стабилизацию и случайный груз
12. starik-2005 3036 29.06.21 18:18 Сейчас в теме
(11) вообще, штука правильная - с весами должен отдельный сервак работать, который должен у себя сохранять данные, полученные с весов. И если нужно этикетки печатать, то 1С должна к этому серваку обращаться и, если там есть данные, печатать этикетки (хотя и это лучше было бы отдельно вынести). Чем не нравится вариант с очередью? C# валит в какой-нить RqbbitMQ, 1С опрашивает очередь, если есть событие - печатает этикетку.
14. oleg-x 26 29.06.21 18:24 Сейчас в теме
(13) а опрашивать сервер через обработчик ожидания?
15. starik-2005 3036 29.06.21 18:25 Сейчас в теме
(14) можно в бесконечном цикле опрашивать - какие проблемы? Ну или обработчик ожидания запускает 100 циклов опроса раз в минуту... Как угодно.
16. oleg-x 26 29.06.21 18:29 Сейчас в теме
(15) Тут возникает проблема подвешенного интерфейса. А в идеале хотелось бы подключить весы как сканер штрих кодов. Нажал кнопку, пришло внешнее событие о взвешивание. В таком варианте время отклика будет минимально и фасовщик не будут думать что все повисло и жать кнопку несколько раз
17. user856012 13 29.06.21 19:02 Сейчас в теме
(16)
А в идеале хотелось бы подключить весы как сканер штрих кодов.
А почему не подключить именно как сканер? Данные весов помещаем в буфер консоли (клавиатуры) и принимаем их в 1С точно так же, как штрихкод?
Нажал кнопку
На весах? Или на форме 1С?
18. oleg-x 26 29.06.21 21:38 Сейчас в теме
(17) кнопка на весах.
Потому что весы это не сканер и обработки как для сканера штрих кодов в природе нет
20. user856012 13 29.06.21 21:56 Сейчас в теме
(18)
Потому что весы это не сканер
Сканер, включенный в разрыв клавиатуры - это, по сути, тоже "не сканер", а еще одна (специфическая) клавиатура. В этом легко убедиться при помощи Блокнота.

Тем не менее, внешнее событие при его использовании генерируется: https://forum.infostart.ru/forum9/topic32830/

Впрочем, вы до сих пор не написали - каким образом у вас подключены эти весы, что они выдают и т.д.

Так что очень может быть, что все вышеприведенные советы "мимо кассы".
19. oleg-x 26 29.06.21 21:39 Сейчас в теме
(17) По сути, поэтому и разрабатывается своя программа, но возникли технические трудности
21. oleg-x 26 29.06.21 22:08 Сейчас в теме
(20) Сканер может работать в двух режимах.
1) Как эмулятор клавиатуры и тогда курсор должен быть спозиционирован в поле ввода.
2) В режиме ком порта, тогда при сканированиев блокнот он ничего не выведет, а в 1с требуется специальная обработка, которая будет генерировать внешнее событие при каждом сканирование.

Весы подключены пол сети. Сами по себе весы ничего не выдают, они записывают данные в память своей "головы". Так же можно через дравейр выводить вес в форму, но это работа с одним устройством.
22. user856012 13 29.06.21 22:21 Сейчас в теме
(21)
Как эмулятор клавиатуры и тогда курсор должен быть спозиционирован в поле ввода.
Не обязательно: при этом тоже может генерироваться внешнее событие, но программно, специальным драйвером (например, Атоловским): https://forum.mista.ru/topic.php?id=696922
Сами по себе весы ничего не выдают, они записывают данные в память.
В какую память? Свою? Или ПК?

И как вы хотите их добыть из этой памяти?

Впрочем, это уже не очень интересно - разговор получается как на приеме у ясновидящего. Вот только тут ясновидящих нет...
23. oleg-x 26 29.06.21 22:36 Сейчас в теме
(22) Почитайте внимательно первый пост. Все уже сделано, данные уже получены и расшифрованы с весов, их просто необходимо передать в 1С сгенерировав событие в 1С. Я не спрашиваю как получить данные из весов, я спрашиваю как их передать. По сути не имеет значение что передавать, меня интересует сам механизм вызова внешнего события 1С.
UDP значения веса хранится в памяти весов (терминал регистратор весов).
24. user856012 13 29.06.21 23:56 Сейчас в теме +5 $m
(23)
меня интересует сам механизм вызова внешнего события 1С
Ну, тогда последнее, что могу предложить: https://infostart.ru/public/19248/

P.S. На всякий случай: ссылка на исходники в комментарии (79)
25. acces969 344 30.06.21 08:05 Сейчас в теме
Я такое делал двумя способами - непосредственно по com-соединению с библиотекой и второй способ - по http (https://infostart.ru/public/1459010/) .Оба варианта надежны и просты. Уточните вопрос.
27. oleg-x 26 01.07.21 13:02 Сейчас в теме
(24) Спасибо, то что надо. Я эту публикацию видел, но там не было исходников, а они в комментариях оказывается выложены. И пример очень хороший, с генерацией параллельных событий с заданным интервалом.

Всем спасибо, получилось добиться желаемого результата.
28. oleg-x 26 01.07.21 13:04 Сейчас в теме
(26) Видели эту статью, но по ней не получилось добиться желаемого результата.
29. Serginio 938 01.07.21 17:39 Сейчас в теме
(28) Ну вообще то там и то, что в (24) предлагали как внешнее событие. Если, что исходники здесь
https://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802
30. oleg-x 26 01.07.21 18:02 Сейчас в теме
(29) Я не сомневаюсь, но ксожалению программист не смог разобраться. Возможно не хватает понимания или нужно получше разобраться. Я C# не знаю, поэтому судить не могу, для меня это темны лес, а изучать это все ксожалению сейчас нет времени. Хотя в будущем вернусь к этой теме и выделю время на изучение вопроса, так как ВК очень интересная и полезная вещь.
За еще одну ссылку спасибо, и исходники есть и ссылки на статьи в одном месте.
Если говорить про внешние события, то по ссылке из 24 сообщения идеальный пример на мой взгляд, показывающий различные возможности внешних событий. Разбираться надо по коду, но здесь особых сложностей нет, так как там все достаточно просто.
31. Serginio 938 01.07.21 19:12 Сейчас в теме
(30) Ну ВК то тебе писать так или иначе придется на C#
Вот пример создания ВК Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF

Можно не использовать саму компоненту, а взять уже готовые вещи для своей ВК
32. user856012 13 01.07.21 23:45 Сейчас в теме
(31)
Ну ВК то тебе писать так или иначе придется на C#
Конечно, придется... только вряд ли ему:
Все уже сделали, но программист C# не работал раньше с 1С и не понимает как создать сгенерировать внешнее событие на форме.
И далее:
Если мы что то захотим изменить, придется каждый раз обращаться к программисту C#, а если реализовать только получение данный, то все остальное будет делать штатный программист 1С.

Угадайте, кем с наибольшей вероятностью является автор - "программистом C#" или "штатным программистом 1С"?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот