Тормозит печать принтера чеков в терминальном режиме
Ситуация такова:
Есть терминальный сервер с 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, но предварительно надо запустить модуль приема на сервере.
Как это работает:
Клиент запускает ярлыком бат файл, который запускает программу проброса COM портов на сервер.
Запускается терминальная сессия клиента, в которой еще один батник запускает вначале серверную часть программного комплекса.
Затем запускается 1С Предприятие.
Пока 1С запускается, наша программа устанавливает связь с COM портом на рабочей станции.
После закрытия 1С, на сервере убиваются модули работы с пробросом портов, и на клиенте тоже выкидываются из оперативной памяти модули связи.
В результате внедрения такого решения, печать чеков стала быстрее в несколько раз. Стабильность связи выросла.