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

Ситуация такова:

Есть терминальный сервер с 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С, на сервере убиваются модули работы с пробросом портов, и на клиенте тоже выкидываются из оперативной памяти модули связи.

В результате внедрения такого решения, печать чеков стала быстрее в несколько раз. Стабильность связи выросла.