Есть задача, написать программу/службу/компоненту, которая бы опрашивала оборудование по списку. Здесь проблем не возникло. А вот застряли на передачи значений в 1С.
Суть такова, есть весы. С весов нужно получать значения, так как весы пассивные их нужно постоянно опрашивать и выводить на печать этикетку. И все бы ничего, но как сгенерировать внешнее событие на форме 1С. Почему именно внешнее событие? 1С не умеет печатать на сервере, хотели сделать фоновое задание, которое бы проверяло новые записи в регистре, но вариант отпал. А обработчик ожиданий может опрашивать один раз в секунду и подвешивает интерфейс.
1С 8.3.17 конфигурация УТ 10.3 обычные формы. Клиент-Сервер.
Все уже сделали, но программист C# не работал раньше с 1С и не понимает как создать сгенерировать внешнее событие на форме.
Все примеры для делфи и С+, а вот для C# ничего толкового по внешним событиям не нашли.
Что сейчас получилось:
1) Подключить внешнюю компоненту как COM объект.
2) Вызвать функцию, которая генерирует внешнее событие, но при этом "подвешивает интерфейс", то есть 1С ждет, пока компонента вернет значение, а это не подходит.
А почему нельзя этикетку напечатать из C#? Нарисовали в бартендере этикетос, на выходе шаблон, запросили у 1С данные для него (через HTTP-сервис), засунули в шаблон, отправили на принтер. И не нужна никакая внешняя компонента.
(3) Это усложняет разработку, тогда придется весь функционал реализовывать в сторонней программе. И стоимость разработки соответственно увеличится.
Если мы что то захотим изменить, придется каждый раз обращаться к программисту C#, а если реализовать только получение данный, то все остальное будет делать штатный программист 1С.
то все остальное будет делать штатный программист 1С
Я при таком раскладе много как делал. Например, печатал этикетки после фиксации веса на терминале сбора данных. Как? На терминале мобильное приложение 1С дергало 1С, 1С дергала весы, отправляла вес в терминал, одновременно с этим записывала данные в регистр сведений. Клиентская 1С висела и раз в 3 секунды опрашивала регистр сведений, после чего печатала этикетку по данным из регистра, если они там были, ну и устанавливала признак "Напечатано". И никакого C#. Я вообще не понимаю, зачем Вам с весов данные получать через C#?
ЗЫ: мы как-то одному мясному цеху делали автоматизацию: поставили несколько терминалов (моноблоков с тачскрином), подоткнули к моноблокам весы, принтера, сканеры. В итоге кусок мяса на весы - в интерфейсе 1С вес (обработка ожидания в модуле управляемого приложения 5 раз в секунду опрашивала весы через их COM-объект). Нажимаешь "Печать" - вылезает этикетка. Причем этих этикеток - 100 вариантов для каждого покупателя/товара (PLU), используется встроенный в БСП редактор этикеток. Замучились со вкусвилловскими этикетками, которые еще отдельно на короб печатались при закрытии короба - там в одном случае ЕАН, во втором код128.
(5) Стандартный драйвер от производителя (Масса К серии R) может опрашивать весы. То есть все можно сделать без стороннего программирования.
Но возникла проблема, драйвер одновременно может подключаться только к 1 весам. Время получения данных составляет 5-6 секунд.
То есть чем больше весов одновременно работает, тем дольше ожидание.
Все это нужно для фасовки и приемки и ожидание даже в 2 секунды увеличивает время каждой операции, что для нас критично.
А покупать каждым весам (и так не дешевым весам и принтерам) еще и компьютер, выйдет совсем дороговато.
(6) Так же проблема с установкой компьютера, цех моется или надо покупать влагозащищенный моноблок (не из дешевых). Так же реальность такова, что конкретного рабочего места нет, то есть моноблок еще как то надо установить на стол, где уже весы и принтер этикеток.
Вообщем для нас не вариант.
Я бы на каком-нить ESP8266 сделал бы в два счета такой механизм, который бы в WIFI валил бы через MQTT номер весов и данные, а 1С могла бы получать оттуда, постоянно опрашивая какого-нить кролика.
(9) протокол простой, это уже реализовано. Только не получение массы, получение регистрации в памяти весов. Не нужно проверять на стабилизацию и случайный груз
(11) вообще, штука правильная - с весами должен отдельный сервак работать, который должен у себя сохранять данные, полученные с весов. И если нужно этикетки печатать, то 1С должна к этому серваку обращаться и, если там есть данные, печатать этикетки (хотя и это лучше было бы отдельно вынести). Чем не нравится вариант с очередью? C# валит в какой-нить RqbbitMQ, 1С опрашивает очередь, если есть событие - печатает этикетку.
(15) Тут возникает проблема подвешенного интерфейса. А в идеале хотелось бы подключить весы как сканер штрих кодов. Нажал кнопку, пришло внешнее событие о взвешивание. В таком варианте время отклика будет минимально и фасовщик не будут думать что все повисло и жать кнопку несколько раз
Сканер, включенный в разрыв клавиатуры - это, по сути, тоже "не сканер", а еще одна (специфическая) клавиатура. В этом легко убедиться при помощи Блокнота.
(20) Сканер может работать в двух режимах.
1) Как эмулятор клавиатуры и тогда курсор должен быть спозиционирован в поле ввода.
2) В режиме ком порта, тогда при сканированиев блокнот он ничего не выведет, а в 1с требуется специальная обработка, которая будет генерировать внешнее событие при каждом сканирование.
Весы подключены пол сети. Сами по себе весы ничего не выдают, они записывают данные в память своей "головы". Так же можно через дравейр выводить вес в форму, но это работа с одним устройством.
Как эмулятор клавиатуры и тогда курсор должен быть спозиционирован в поле ввода.
Не обязательно: при этом тоже может генерироваться внешнее событие, но программно, специальным драйвером (например, Атоловским): https://forum.mista.ru/topic.php?id=696922
Сами по себе весы ничего не выдают, они записывают данные в память.
В какую память? Свою? Или ПК?
И как вы хотите их добыть из этой памяти?
Впрочем, это уже не очень интересно - разговор получается как на приеме у ясновидящего. Вот только тут ясновидящих нет...
(22) Почитайте внимательно первый пост. Все уже сделано, данные уже получены и расшифрованы с весов, их просто необходимо передать в 1С сгенерировав событие в 1С. Я не спрашиваю как получить данные из весов, я спрашиваю как их передать. По сути не имеет значение что передавать, меня интересует сам механизм вызова внешнего события 1С.
UDP значения веса хранится в памяти весов (терминал регистратор весов).
Я такое делал двумя способами - непосредственно по com-соединению с библиотекой и второй способ - по http (https://infostart.ru/public/1459010/) .Оба варианта надежны и просты. Уточните вопрос.
(24) Спасибо, то что надо. Я эту публикацию видел, но там не было исходников, а они в комментариях оказывается выложены. И пример очень хороший, с генерацией параллельных событий с заданным интервалом.
Всем спасибо, получилось добиться желаемого результата.
(29) Я не сомневаюсь, но ксожалению программист не смог разобраться. Возможно не хватает понимания или нужно получше разобраться. Я C# не знаю, поэтому судить не могу, для меня это темны лес, а изучать это все ксожалению сейчас нет времени. Хотя в будущем вернусь к этой теме и выделю время на изучение вопроса, так как ВК очень интересная и полезная вещь.
За еще одну ссылку спасибо, и исходники есть и ссылки на статьи в одном месте.
Если говорить про внешние события, то по ссылке из 24 сообщения идеальный пример на мой взгляд, показывающий различные возможности внешних событий. Разбираться надо по коду, но здесь особых сложностей нет, так как там все достаточно просто.
Все уже сделали, но программист C# не работал раньше с 1С и не понимает как создать сгенерировать внешнее событие на форме.
И далее:
Если мы что то захотим изменить, придется каждый раз обращаться к программисту C#, а если реализовать только получение данный, то все остальное будет делать штатный программист 1С.
Угадайте, кем с наибольшей вероятностью является автор - "программистом C#" или "штатным программистом 1С"?