gifts2017

Подключение торгового оборудования по rdp.

Опубликовал Денис Аграновский (de0nis) в раздел Оборудование - ККМ

Задача следующая, есть две розничные точки и центральная оптовая. Пользователи работают в терминале на Win Server 2003, база находится на центральной точке, розничные подключаются по интернету. Необходимо подключить сканеры штрих-кода в центральной точке на складе и Сканеры и ФР в розничных точках. При чем в розничных точках один сканер должен переподключаться между кассовым узлом и компьютером в приёмке. Сканеры ШК - Datalogic QuickScan I QM2100 (беспроводной), Honeywell Eclipse 5145, ФР - Штрих-М-ФР-К. Все устройства с интерфейсом USB.

1. Подключение сканеров Datalogic.

В самом начале, т.к. сканер беспроводной, необходимо подружить сканер с подставкой. Включаем подставку в USB и в соответсвии с руководством пользователя привязываем сканер к базе. Для этого необходимо считать управляющие штрихкоды и ввести ПИН-код сканера из 4-х цифр. Цифры задаём так же считывая штрих коды из таблицы, приведённой в руководстве. Т.к. сканеров у нас было несколько, то для каждого был заведён свой пин-код. После ввода пин-кода сканер сообщит о подключении к подставке радостным пиканьем :) Далее считываем управляющие штрихкоды для перевода сканера в режим "USB в эмуляции COM" и на всех рабочих станциях, где подключено оборудование установливаем драйвера эмуляции COM порта. Драйвера брали последние с официального сайта Datalogic. Сканер имеет три режима работы при потери связи с базой:

  1. При потери связи не передавать ничего. 
  2. Передавать считанные штрихкода при восстановлении связи 
  3. Собирает все штрих коды во внутренней памяти и выгружает на компьютер после считывания управляющего штрихкода о выгрузке.

Режимы настраиваются так же путём считывания управляющих штрихкодов из руководства. При тестировании второй режим не всегда передавал данные, в третьем так же были замечены потери данных при передаче (видимо 1С не успевает отрабатывать поток штрихкодов), оставили работать в первом режиме. В этом случае, если штрихкод не передан на базу, сканер сообщает длительным бипом, удачная передача сопровождается двойным бипом.

Проброс COM портов осуществляется установкой флажка порты на закладке локальные ресурсы rdp.

RDP

Так же на сервере необходимо проверить разрешение на подключение COM портов удалённого клиента: Администрирование-Службы терминалов-Конфигурация служб терминалов, закладка Параметры клиента:

Параметры клиента на сервере


Т.к. порты виртуальные, то на сервере в диспетчере  задач они не появляются, но исправно работают. Проверить, что порты подключены можно в реестре в ветке HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM или различными утилитами. Т.к. устройств несколько, то на каждой рабочей станции желательно присвоить им разные номера COM портов, что б при одновременном подключении они не комфликтовали.

Далее устанавливаем на сервере драйвер сканера штирхкода SCANOPOS и настраиваем сканеры в 1С как локальные.


2. Подключение сканера Honeywell.

Тут процедура по сути аналогичная, не требует заморочек с подключением подставки, но так же необходимо перевести сканер в режим "USB в эмуляции COM" путём считывание управляющего штрих кода и установить драйвера эмулятора на рабочих станциях. Тут возникла другая проблема в связи с тем, что сканеры переключаются между компьютером кассы и приёмке, при возвращении сканера на место слетает установленный в диспетчере устройств номер COM-порта. Сейчас реализовано следующее, сканер был определен во всех USB портах, далее в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\ находим нужное устройство, в нем подчинённые ветки для каждого USB порта, для каждого меняем параметр FriendlyName (влияет только на отображение устройства в диспетчере задач) и во вложенной ветке \Device Parameters\ меняем параметр PortName на нужный номер COM порта. Пока порты не слетали. Если будут другие предложения, готов обсудить.

3. Подключение ФР.

При подключении ФР Штрих в терминальном доступе, для корректной работы ФР в драйвере необходимо увеличить таймаут (в зависимости от скорости соединения порядка 1000~3000мс ) Рекомендую установить драйвер Штрих в начале локально на рабочей станции. Настроить параметры обмена и таймаут, потом передать выбранные параметры на ФР нажатием кнопки Установить параметры в настройках свойств драйвера. И только потом устанавливать драйвер на сервере и проверять соединение. Если на ФРе установлен маленький таймаут, то установка параметров сразу из терминала может не сработать, о чём драйвер не сообщает. 

Тест драйвера

По информации с сайта тех. поддержки Штриха, при использовании контроллера доменов, для корректного проброса COM портов необходимо что б рабочая станция вошла в домен иначе порт не пробрасывается. У нас проверить не получилось, т.к. используются рабочие группы и порты пробросились без проблем. 

4. Разделение оборудования по сессиям.

В типовых конфигурациях до сих пор не реализован механиз разделения оборудования по сессиям, и в нашем случае при открытии товарных документов любым пользователем, 1С пытается включить всё подключенное к текущему компьютеру оборудование (в нашем случае это 8 сканеров и два ФР) естественно сделать этого не может, о чём радостно сообщает пользователю несметным количеством ошибок. 

Было решено использовать следующий алгоритм. Т.к. оборудование подключено к рабочим станциям, то перед подключением оборудования получаем имя компьютера с которого подключается сеанс. Для этого обращаемся к переменной среды CLIENTNAME. В регистр сведений Торговое оборудование добавлено строковое поле ИмяКлиента. И в модуле обработки СерверТО в процедуре ПодключитьОборудование() добавлена проверка на совпадение имени подключенного клиента с именем клиента для оборудования:

// Добавим проверку по клиенту, если это терминал. 
Если ЗначениеЗаполнено(СтрокаТО.ССБ_ИмяКлиента) Тогда 
  WshShell = Новый COMОбъект("WScript.Shell"); 
  ИмяКомпьютераКлиента = WshShell.expandEnvironmentStrings("%CLIENTNAME%"); 
  Если НЕ СтрокаТО.ССБ_ИмяКлиента = ИмяКомпьютераКлиента Тогда 
    Продолжить; 
  КонецЕсли; 
КонецЕсли;

Лучше выполнить этот кода в попытке, т.к. переменная среды доступна только в контексте терминального подключения и при вызове из локальных подключений может вызвать ошибку.

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Самошин (saiten) 14.08.13 12:08
ФР подключали через сервер печати драйвера или напрямую? Проблем со скоростью печати не было?
2. Денис Аграновский (de0nis) 14.08.13 12:50
На прямую. По сути, как я понимаю сервер нужен для работы с несколькими источниками, тут такой задачи не было. Не большая задержка при печати есть, но не критичная.
3. Андрей Епишин (EpiSH) 14.08.13 15:55
"В типовых конфигурациях до сих пор не реализован механиз разделения оборудования по сессиям, и в нашем случае при открытии товарных документов любым пользователем, 1С пытается включить всё подключенное к текущему компьютеру оборудование (в нашем случае это 8 сканеров и два ФР) естественно сделать этого не может, о чём радостно сообщает пользователю несметным количеством ошибок. "
Брешете. В УТ11 (и других конфигурациях на базе БСП) эта проблема давно решена. Но предложенное Вами решение я по умолчанию использовал на всех внедрениях УТ10.
4. Денис Аграновский (de0nis) 14.08.13 16:36
Согласен.. Как-то про БСП даже не подумал. Спасибо за дополнение :) Последнее время всё комплексная, да УПП, для них собственно и писал. По-моему на обычных формах нигде ещё не сделано.
Ещё делали не некоторых проектах аналогичную привязку к пользователю, но тут надо было именно к клиенту привязаться, т.к. пользователи меняются.
5. Юрий Семенчук (MsDjuice) 21.09.13 22:21
Для теста перекидки на сервер СОМ портов я использовал команду на серваке "change port". Для теста устройств программу "HYPERTERMINAL". Может кому пригодится.
6. Денис Аграновский (de0nis) 22.09.13 14:26
(5) MsDjuice, к сожалению, по-моему, начиная с Win Vista HYPERTERMINAL не включен в стандартные. Не пробовали его запускать от старых версий на новых? Работает?
И по "change port", там проблема в том, что нам надо знать номер ком порта на клиенте. А т.к. у нас USB в эмуляции, то иногда номер ком порта может меняться. Решается исправлением ключей реестра.
7. Юрий Семенчук (MsDjuice) 22.09.13 15:27
HYPERTERMINAL от старых на новых не пробовал, качал триал версию, на сайте пишется что подходит для Вин 7,8. Ну так узнать номер Ком порта на клиенте не проблема.
8. Денис Аграновский (de0nis) 22.09.13 16:51
(7) MsDjuice, Ну не проблема, если посмотреть в диспетчер задач. А если неопытный пользователь вытащил сканер и воткнул вместо него флешку и порт поменялся, то он сам не перенастроит потом всё. Т.е. нужен какой-то универсальный механизм, без перенастройки. Была идея сделать скрипт, который бы проверял все номера портов. Но в итоге остановились на изменении реестра.
9. Дмитрий Воробьев (fieryfist) 10.11.13 18:32
Если пользователь переподключается по rdp (потеря связи) у вас оборудование перестает работать?
10. Денис Аграновский (de0nis) 10.11.13 18:59
(9) fieryfist, никто не жаловался, точно не могу сказать, но раз не жалуются, то работает. Обрывы связи точно были. Думаю тут может ещё от настроек терминала зависеть, разрешает ли в новый сеанс подключиться или новое соединение делает.
11. Роман nolodin (nolodin) 04.02.14 22:41
Ну, кстати, зря вы пишите, что нет гипертерминала в windows, начиная с Висты. Насчет именно Висты не могу точно сказать - может действительно там нет, но и в windows 7 и в 8 есть. Просто он отключен.
12. Роман nolodin (nolodin) 04.02.14 22:41
Пуск - Панель управления - Программы и компоненты - Включение или отключение компонентов windows - Клиент Telnet (ставим галочку).
PLAstic; Rustig; +2 Ответить
13. berator37 (berator37) 19.02.14 17:10
Самое лучшее решение, это разделять оборудование не по сессиям, а по пользователям и запрещать для пользователя несколко сессий.
Проброс портов - это тривиальное решение.
14. Денис Аграновский (de0nis) 21.02.14 09:52
(13) berator37, Разделять оборудование по пользователям - это полный бред, а не решение. Оборудование подключено к компьютеру, а не к пользователю. И ЛЮБОЙ пользователь входящий в терминал с этого компьютера должен иметь возможность работать с подключенным оборудованием. Это может и применимо для каких-то задач, но явно, не в описанной задаче.
Проброс может и тривиальное решение, за то рабочее. На научную диссертацию и не претендую, просто описал узкие места с которыми столкнулся сам и сталкиваются коллеги.
15. Петр Усольцев (prohorp) 12.03.14 08:08
Здравствуйте!
Воспользовался вашим постом - все заработало, Спасибо!
Но почему-то после перезагрузки сервера оборудование становится недоступным из 1С.
Пишет что Порт недоступен (System Error. Code: 2.Не удается найти указанный файл)
Хотя при этом я открываю "драйвер ккм"(на удаленном рабочем столе) - там указываю порт нужный и нажимаю "Проверка связи" - успешно!
Это на терминальном сервере так.
Может дело в том что кассир(у которого ФР подключен) - заходит в 1С на терминале далеко не первый?
16. Денис Аграновский (de0nis) 12.03.14 12:48
17. ASDF2 Егор (ASDF2) 12.03.14 14:38
Может кому пригодится идея: В моём случае связь по rdp была настолько плохой, что чек или выходил через минуту или не выходил вообще. Был сделан костыль - данные чека записывались в файл на фтп, у клиента небольшая программа проверяла наличие файла и если он появлялся, то данные отправлялись на ккм.
Костыль, но уже год работает:)
dima_home; Rustig; +2 Ответить 1
18. Денис Аграновский (de0nis) 12.03.14 16:25
(17) ASDF2, Да тоже как-то делали такую штуку. И еще для кассы и для ТСД, там вообще была беда с передачей большого объема данных. Идея рабочая ))
19. Андрей Тарлыков (Tarlich) 16.03.14 09:24
я решаю так

Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
Если Константы.ТорговоеОборудованиеИспользуетсяНаСервереТерминала.Получить() = истина тогда
мИмяКомпьютера = мИмяКомпьютера + "_"+глЗначениеПеременной("глТекущийПользователь");
КонецЕсли;
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
AgroTehnik; PLAstic; murenysh; fixin; +4 Ответить 1
20. Dark Demonov (goofma) 19.03.14 02:50
Решаю на Linux + RDP, подтверждаю ФР от Штрих так работают, даже с сервером ФР. C принтерами чеков, сканерами COM->TCP софтом на терминалах, на серве или в обратку TCP->COM (довольно устойчиво порты видны не только в сессии) или вовсе использую из 1с как IP:port.
21. Денис Аграновский (de0nis) 19.03.14 09:56
(19) Tarlich, Опять же привязка по пользователю. И если пользователю разрешено несколько сессий и они могут входить с других компьютеров, то не будет работать. Один и тот же пользователь будет подключаться к терминалу с разных рабочих станций - имя компьютера будет одинаковое. А в данном случае это постоянно, т.к. сотрудники меняются между магазинами. Нужно что б подключенное к рабочей станции оборудование работало для ЛЮБОГО пользователя.
22. Осипов Сергей (fixin) 25.07.14 12:02
Классная статья.
Спасибо, что подсказали, где в реестре посмотреть, какие ком-порты подключены.

Хочу добавить, что в процедуре Подключить оборудование нужно менять и запрос:

		Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|    РегТО.Идентификатор       КАК Идентификатор,
		|    РегТО.Модель.Наименование КАК Наименование,
		|    РегТО.Модель              КАК Модель,
		|    РегТО.ИмяКлиента              КАК ИмяКлиента,
		|    РегТО.Параметры           КАК Параметры
		|ИЗ
		|    РегистрСведений.ТорговоеОборудование КАК РегТО
		|ГДЕ
		|    РегТО.Вид = &Вид
		|    И РегТО.Компьютер                      = &Компьютер
		|    И РегТО.Подключено
		|");
...Показать Скрыть



А также, чтобы удобно было настраивать в обработке ТОНастройка в процедуре ОткрытьФормуНастройки нужно дописать:

		Обработка.НастроитьОборудование(ТП.ТекущиеДанные.Модель, Параметры);
		Набор[0].Параметры = ЗначениеВСтрокуВнутр(Параметры);
		Попытка
			WshShell = Новый COMОбъект("WScript.Shell"); 
			Набор[0].ИмяКлиента = WshShell.expandEnvironmentStrings("%CLIENTNAME%"); 
		Исключение КонецПопытки;
		Набор.Записать();
...Показать Скрыть


А вообще конечно плохо что не почитал сразу комменты, вариант с виртуальным именем компьютера мне больше понравился. ;-)
23. Сергей Муравьёв (murenysh) 11.02.15 03:08
Я скомбинировал лучшее, что предложили автор статьи и комментатор Tarlich и сделал следующее:

Функция ПолучитьИмяКомпьютераТО() Экспорт

	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера());
                Если Константы.ТорговоеОборудованиеИспользуетсяНаСервереТерминала.Получить() = Истина тогда 
                         WshShell = Новый COMОбъект("WScript.Shell"); 
                         ИмяКомпьютераКлиента = WshShell.expandEnvironmentStrings("%CLIENTNAME%"); 
                         мИмяКомпьютера = мИмяКомпьютера + "_"+ ИмяКомпьютераКлиента;
                КонецЕсли;	
	КонецЕсли;

	Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()
...Показать Скрыть


Больше ничего и делать не нужно.
Тоже жалею, что не почитал вначале комментарии, сэкономил бы кучу времени
24. Алекс Свк (sancho86) 18.03.15 21:59
Кто-нибудь с ФР от Штрихов решил проблему с медленной печатью чеков.
Проверял просто из драйвера.
Тестовый стих из драйвера "Мой дядя самых честных правил..." печатается с очень большой задержкой. Пользовался только драйвером 4.10, Новые 4.11 и 4.12 еще не пробовал.
Короткие одиночные команды типа "печать x-отчета" проходят быстро, а с методом "Печать строки" какая-то борода...
Чек ККМ с длинными наименованиями, с именами клиентов и прочей строковой информацией печатается мелкими рывками.
Почему драйвер штриха так сильно критичен к пингу?
25. Alex Nikolas (alexnikolas) 18.08.15 11:05
Можно запрос и не менять а в Функцию ПолучитьИмяКомпьютераТО() написать так

WshShell = Новый COMОбъект("WScript.Shell"); 
  	ИмяКомпьютера = WshShell.expandEnvironmentStrings("%CLIENTNAME%"); 
	Если (ИмяКомпьютера = "%clientname%") ИЛИ (ИмяКомпьютера = "Console") Тогда
		ИмяКомпьютера = ВРЕГ(ИмяКомпьютера());
	КонецЕсли;
	мИмяКомпьютера = ИмяКомпьютера;
		
	Возврат мИмяКомпьютера;
...Показать Скрыть


Здесь и определение на локальную машину без терминала
Alexey55; +1 Ответить
26. Alex Nikolas (alexnikolas) 18.08.15 11:08
(24) sancho86,
если еще актуально, то скорее всего дело в скорости.
х-отчет скорее всего уходит на ФР как команда, а строка печатается возможно в графике - тогда вероятно выбрана скорость маленькая
27. Иван Дижа (IDija) 28.09.15 14:13
Коллеги кто сталкивался с проблемой печати ФР:
Пытаемся подключить удаленные магазины к работе в 1С:ERP. Пользователь подключается к терминальному серверу, пробрасываем com порт по VPN каналу. Настраиваем фискальный регистратор, оборудование проходит тестирование, при создании чека ККМ появляется сообщение, что фискальник подключен(зеленая галка), но когда пробиваем чек - печать чека не происходит.
В чем может быть причина?
28. Sergei (kauksi) 18.05.16 11:48
Мой вариант:
1.снимаем галку ТолькоПросмотр с формы списка регистра сведений Торговое оборудование

2.в обработке ТОСервер меняем:

Функция ПолучитьИмяКомпьютераТО() 

	Если мИмяКомпьютера = Неопределено Тогда
	    мИмяКомпьютера = ВРег(ИмяКомпьютера());
	                     WshShell = Новый COMОбъект("WScript.Shell"); 
						 
						 ИмяКомпьютераКлиента = WshShell.expandEnvironmentStrings("%CLIENTNAME%"); 
						 
						 ИмяСессии = WshShell.expandEnvironmentStrings("%SESSIONNAME%");
						  
						 Если ИмяСессии="Console" Тогда
			             	//Имя Компьютера будет равно имени терминального сервера
						 Иначе	 
							  //Терминальный клиент
							  мИмяКомпьютера = мИмяКомпьютера + "_"+ ИмяКомпьютераКлиента;
						 КонецЕсли;
	          
	КонецЕсли;

	Возврат мИмяКомпьютера;
КонецФункции
...Показать Скрыть


редактируем в регистре ИмяКомпьютера по правилу: если это локальное подключение, то остается просто ИмяСервера, если терминал, то ИмяСервера_ИмяКомпаКлиента
29. koder (bashhhh) 15.06.16 12:11
Кто-нибудь встречался с такой проблемой.
При подключение пользователя к УТ 10 режим кассира через RDP и при наличии оборудования, 1С вылетает с записью в дамп.
Пользователь RDP входит только в группу Пользователи удаленного рабочего стола.
При добавлении в группу Администраторы все работает нормально.
30. Денис Аграновский (de0nis) 20.06.16 15:19
(29) bashhhh, попробуй отладчиком отловить в какой момент падает, скорее всего, думаю, не получается какую-нт дллельку драйвера подключить и падает в бесконечный цикл или самой длл не хватает прав для работы. Скоррее всего длл какую-то надо зарегистрировать в системе. В общем желательно отловить попытаться. Там правда есть нюанс с тем, что обработки обслуживания как внешние запускаются.
А как будет понятно в какой момент падает, там можно будет подумать что делать )
А группа обычные пользователи есть у него? Если опытного пользователя добавить тоже падает?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа