Тормозит печать принтера чеков в терминальном режиме

Ситуация такова:
Есть терминальный сервер с 1С Предприятие. Стоит далеко в центральном офисе. 
Есть рабочие станции по городу - точки розничной торговли. Оборудование самое разное - начиная от обычного системного блока, и заканчивая POS станцией Posiflex на Windows XP Embedded.

На рабочих станциях стоит классическое оборудование - принтеры чеков, ККМ, сканеры штрих-кодов и тому подобное.
Работает это путем проброса Serial (COM) порта на сервер средствами RDP. Работает крайне медленно. Задержки между нажатием кнопки на печать и началом печати черка достигало 2х минут. 

Задача - ускорить печать чеков.

Для этого я решил пробросить COM порт с рабочих станций на сервер средствами, отличными от RDP подключения. В интернете нашел, что идеальное решение - покупка железок, которые и пробрасывают COM порт по TCP/IP. Минимальная цена железки 100$. Поэтому поискав как следует, я наткулся на интересное решение com0com (их сайт тут). Этот набор программ позволяет делать несколько вещей:
1. Пробрасывать COM порт через TCP
2. Создавать виртуальные COM порты на компьютере и связывать их друг с другом
3. Создавать Хабы COM портов (когда инфа с одного порта дублируется на несколько других, и наоборот).

Соответственно первые два пункта нам как раз и нужны.
Для начала надо установить виртуальный порт com0com на сервере.

Идем на сервер.
Запускаем Setup.exe из архива com0com.7z, и начинаем установку. 
Вот единственный экран, где надо выставить галочки:
Далее выставляем все как обычно - далее-далее...

Могут быть проблемы с установкой драйверов на x64 разрядные системы (Windows Vista/Windows Server 2008/Windows 7/8), то надо запустить в командной строке следующее:
bcdedit.exe -set TESTSIGNING ON
И после перезагрузки заново установить программу.

Если вдруг что-то пошло не так, и вы удалили все виртуальные порты, или на системе не стоит .NET Framework, то можно в "Setup Command Prompt" сделать это через консоль. Вот команда установки стандартных 2-х COM портов (CNCA0 и CNCB0):
install - -

Также через консоль можно переименовать порт:
change CNCA0 PortName=COM5

Также можно включить эмуляцию скорости передачи:
change CNCA0 EmuBR=yes
change CNCB0 EmuBR=yes

Либо в графике выставить такие значения (не забываем нажать в конце изменения настроек кнопку "Apply"!):

На самом деле не важно, как называются порты. В моем примере я выставил COM5 в качестве "реального" порта (выбрал из свободных), и CNCB0 в качестве виртуального порта. Два порта надо, т.к. с одним портом будет работать 1С, а с другим будет работать модуль проброса COM порта через интернет. COM порты обычно умеют работать только с одним устройством, поэтому приходится делать такие связки.

Далее скачиваем на сервер и распаковываем в корневой каталог архив com2tcp_server.7z.
Смотрим файл run1c.bat:
@echo off
start /min rfc2217.bat --rfc2217-mode s --baud 115200 \\.\cncb0 ПОРТ_СЕРВЕРА
C:\Progra~2\1cv82\8.2.17.169\bin\1cv8.exe enterprise /fс:\1СDB\DATABASE1C
taskkill /f /IM hub4com.exe /s localhost /u %username%
taskkill /f /IM cmd.exe /s localhost /u %username%
Тут надо прописать порт сервера, на котором будет работать проброс COM порта. Например 10001.
Также можно прописать другую скорость самого COM порта. В моем случае это 115200 бод.
Также можно изменить путь до 1С Предприятия и путь к базе данных. У меня это версия 8.2.17.169 и база с:\1СDB\DATABASE1C.

Далее идем в 1С Предприятие в настройки торгового оборудования, и прописываем использование нашего COM порта (в данном случае COM5), и требуемой скорости обмена.

Далее идем в свойства терминального пользователя и прописываем ему автозапуск батника:

Далее идем на клиента.
Разархивируем com2tcp_client.7z в корень диска C: на клиенте. Редактируем файл start1c.cmd:
@echo off
start /min rfc2217.bat --rfc2217-mode c --baud 38400 \\.\com2 ip_АДРЕС_СЕРВЕРА ПОРТ_СЕРВЕРА
mstsc 1c-server.RDP
taskkill /f /im hub4com.exe
taskkill /f /im cmd.exe
Соответственно подставляем свой адрес сервера и TCP порт, через который будет работать проброс COM порта. Обязательно меняем \\.\com2 на тот COM порт, на котором подключен принтер чеков или ККМ!
Также запускаем mstsc.exe и открываем в нем файл 1c-server.RDP. Также меняем адрес сервера и имя пользователя. Проброс портов в настройках должен быть отключен! Сохраняем настройки.

Этот файл запускает вначале программу проброса COM портов на скорости 38400 (скорость можно менять на нужную), затем открывает терминальный сервер. По окончании сеанса связи - закрывает программу проброса COM портов. Также можно сделать ярлычок на рабочий стол, ведущий на файл start1c.cmd, и прописать ему иконку 1cicon.ico. Делам в настройках делаем запуск окна свернутым в значок. Будет очень похоже на локальную 1С Предприятие.

Важные замечания:
  • Адрес у сервера должен быть статичный, или надо использовать DynDNS или аналоги.
  • Порт TCP надо также пробросить на роутере в офисе, где стоит наш сервер. Проверить, открыт ли порт, можно на сайте 2ip.ru, но предварительно надо запустить модуль приема на сервере.

Как это работает: 
  1. Клиент запускает ярлыком бат файл, который запускает программу проброса COM портов на сервер. 
  2. Запускается терминальная сессия клиента, в которой еще один батник запускает вначале серверную часть программного комплекса.
  3. Затем запускается 1С Предприятие. 
  4. Пока 1С запускается, наша программа устанавливает связь с COM портом на рабочей станции. 
  5. После закрытия 1С, на сервере убиваются модули работы с пробросом портов, и на клиенте тоже выкидываются из оперативной памяти модули связи.
В результате внедрения такого решения, печать чеков стала быстрее в несколько раз. Стабильность связи выросла.
ċ
com0com.7z
(255k)
Raymond superadmin,
14 июл. 2013 г., 19:21
ċ
com2tcp_client.7z
(162k)
Raymond superadmin,
15 июл. 2013 г., 1:07
ċ
com2tcp_server.7z
(158k)
Raymond superadmin,
15 июл. 2013 г., 1:07