Работа кассиров в удаленном терминальном режиме (RDP) через интернет часто сопровождается двумя неприятными проблемами: внезапной потерей связи с фискальным регистратором (принтером чеков) и критически медленной печатью чеков. Например, пробитие документа из 15–20 позиций может занимать от 1 до 3 минут вместо нескольких секунд. Разберем по шагам, почему возникают эти сложности и как правильно оптимизировать работу оборудования.
Рассмотрим механизм взаимодействия 1С с фискальным регистратором (ККТ/ФР). В типовых и устаревших механизмах интеграции печать чека выполняется в виде синхронного диалога между сервером и кассой:
В локальной сети с минимальным временем отклика (пинг менее 1 мс) этот обмен происходит практически мгновенно. Однако при работе через интернет по RDP с пробросом COM-портов каждый системный вызов ввода-вывода (I/O) натыкается на сетевую задержку. Если сетевой пинг составляет 50–100 мс, то с учетом передачи пакетов, подтверждений TCP и алгоритмов буферизации на каждую строку чека уходит от 100 до 300 мс. В результате чек на 20 позиций пробивается недопустимо долго.
В типовых конфигурациях подключение к ККМ нередко выполняется при открытии экранной формы документа или интерфейса кассира, а отключение — только при ее закрытии. При малейшем микроразрыве интернет-соединения RDP-сессия восстанавливается автоматически, но дескриптор проброшенного COM-порта сбрасывается. В итоге при нажатии кнопки оплаты 1С сообщает, что касса недоступна.
Для устранения этой проблемы перенесем логику подключения оборудования: захватывать COM-порт необходимо строго в момент нажатия кнопки пробития чека и освобождать его сразу после завершения печати или снятия отчета.
Посмотрим на пример логики в модуле документа или обработки обслуживания:
Процедура ПробитьЧекНаККМ(СтруктураЧека)
// Подключаем устройство непосредственно перед операцией
РезультатПодключения = ПолучитьСерверТО().ПодключитьКлиент(ОбъектДрайвера, "ФискальныйРегистратор");
Если Не РезультатПодключения Тогда
Сообщить("Не удалось установить связь с фискальным регистратором!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
Попытка
// Выполняем фискализацию
ПечатьЧекаНаУстройстве(ОбъектДрайвера, СтруктураЧека);
Исключение
Сообщить("Ошибка при печати чека: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
// Немедленно освобождаем порт
ПолучитьСерверТО().ОтключитьКлиент(ОбъектДрайвера);
КонецПроцедуры
Такой подход гарантирует, что 1С держит COM-порт занятым только несколько секунд во время печати, минимизируя влияние нестабильного интернет-канала.
Если архитектуру взаимодействия нельзя изменить оперативно, проанализируем сетевые и системные параметры, которые снижают задержки при стандартном маппинге портов RDP:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID}): создадим DWORD-параметры TcpAckFrequency = 1 и TCPDelAckTicks = 0.Чтобы исключить постоянную пересылку запросов «строка — ответ — проверка» через интернет, сформируем все данные чека целиком на стороне 1С и передадим их в драйвер одной командой (пакетный режим):
Наиболее надежным архитектурным решением при работе удаленных магазинов является отказ от RDP в пользу Тонкого клиента 1С с публикацией базы на веб-сервере (IIS / Apache):