При работе в терминальном режиме (RDP) пользователи розничных точек нередко сталкиваются с ситуацией, когда печать обычного фискального чека на кассовом аппарате (например, Штрих-М-01Ф) занимает от 1 до 3 минут вместо положенных 2–5 секунд. При этом локальный тест драйвера на рабочем месте кассира может отрабатывать моментально. Рассмотрим подробно причины возникновения подобных задержек, способы сетевой оптимизации, альтернативные варианты подключения касс и программную обработку сопутствующих ошибок в 1С.
Проанализируем техническую сторону взаимодействия 1С с фискальным регистратором через терминальный сервер:
Разберем по шагам, как выявить и устранить аппаратные и сетевые причины задержки печати:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Идентификатор_Адаптера} установим параметры типа DWORD (32 бита):
TcpAckFrequency = 1
TCPNoDelay = 1
Наиболее надежным решением, исключающим проблемы эмуляции портов через RDP, является прямое подключение фискального регистратора по сети Ethernet:
При периодических лагах сети возникает ситуация, когда 1С отправляет команду фискализации, касса печатает чек и записывает данные в фискальный накопитель, но ответный пакет не успевает вернуться в 1С до истечения установленного таймаута (например, 3000 мс). В результате в 1С возникает исключение, данные фискализации (номер чека, номер смены, фискальный признак) не записываются в документ, а кассир видит ошибку расхождения данных.
Посмотрим, как правильно организовать программную обработку в модулях БПО (Библиотеки подключаемого оборудования), не допуская прерывания транзакции без проверки фактического состояния кассы:
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду("ФискализацияЧека", ...) завершилась по таймауту или перешла в блок Исключение, перед выводом ошибки следует запросить состояние последнего фискального документа из ФН:
Попытка
РезультатКоманды = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду(
"ФискализацияЧека",
ВходныеПараметры,
ВыходныеПараметры,
ОбъектДрайвера,
ПараметрыУстройства,
ПараметрыПодключения
);
Исключение
// В случае сбоя связи опрашиваем параметры последнего закрытого чека
мПараметрыСтенда = Новый Структура;
РезультатОпроса = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду(
"ПолучитьСостояниеККТ",
ВходныеПараметры,
мПараметрыСтенда,
ОбъектДрайвера,
ПараметрыУстройства,
ПараметрыПодключения
);
// Если смена и сумма последнего чека в ККТ совпадают с текущим документом
Если мПараметрыСтенда.СуммаПоследнегоЧека = Объект.СуммаДокумента Тогда
Объект.НомерЧекаККМ = мПараметрыСтенда.НомерПоследнегоЧека;
Объект.НомерСменыККМ = мПараметрыСтенда.НомерСмены;
Объект.ЧекПробитНаККМ = Истина;
Иначе
ВызватьИсключение "Чек не был напечатан на устройстве. Требуется повторная отправка.";
КонецЕсли;
КонецПопытки;
Такой подход защищает информационную базу от задвоения чеков в фискальном накопителе и избавляет пользователей от необходимости вручную сверять кассовую ленту с данными программы.