В розничной и оптовой торговле часто возникает задача совместного использования одного фискального регистратора (онлайн-кассы) сразу несколькими пользователями, работающими в локальной сети или через терминальный сервер. Разберем типичную проблему: в наличии три рабочих места с конфигурацией 1С:Торговля и Склад 7.7 и один фискальный регистратор линейки Штрих-М (например, Штрих-Онлайн). Требуется обеспечить стабильную печать фискальных документов со всех рабочих мест без конфликтов оборудования.
Выясним причину, почему попытка задействовать стандартный сетевой «Сервер ФР» (утилиту SrvFR.exe) часто вызывает затруднения. Во-первых, для штатного сетевого драйвера требуется лицензирование либо тонкая настройка разрешений DCOM и прав запуска в современных версиях Windows, где по умолчанию сетевые вызовы блокируются брандмауэром и политиками безопасности. Во-вторых, даже при успешной сетевой настройке сам драйвер кассы не организует очередь печати. Если два рабочих места попытаются пробить чек одновременно, одно из них получит ошибку блокировки порта или тайм-аута связи. Проанализируем надежные практические решения этой задачи.
Самый стабильный и независимый от платных компонентов метод заключается в управлении очередью доступа на уровне самого кода конфигурации 1С. Поскольку касса не может одновременно обрабатывать два фискальных документа, организуем принцип семафора:
Посмотрим на пример реализации данного алгоритма для 1С:Предприятия 7.7. В качестве семафора используем вызов метода Блокировка() у служебного элемента системного справочника:
// 1. Попытка установить исключительную блокировку на служебный элемент
Если СлужСпр.Блокировка() = 1 Тогда
// Объект уже кем-то заблокирован, касса занята другим пользователем
Предупреждение("Касса в данный момент занята печатью другого чека. Повторите попытку позже.");
Возврат;
КонецЕсли;
Если СлужСпр.Блокировка(1) = 0 Тогда
Предупреждение("Не удалось заблокировать кассу для печати!");
Возврат;
КонецЕсли;
// 2. Если касса подключена через физический COM-порт другого ПК, пробрасываем его
КомандаСистемы("net use COM5: \\" + СокрЛП(ИмяКомпа) + "\com1 /persistent:no");
// 3. Подключение к драйверу ККМ
глФР.Password = глФРПарольПользователя;
глФР.LDNumber = 1;
глФР.SetActiveLD();
ОтветДрайвера(глФР);
глФР.Password = глФРПарольПользователя;
глФР.Connect();
ОтветДрайвера(глФР);
// 4. Проверяем состояние кассы и наличие бумаги перед началом печати
глФР.GetECRStatus();
Если глФР.ResultCode = 0 Тогда
Если глФР.рулончековойлентыесть = 0 Тогда
Предупреждение("В фискальном регистраторе закончилась чековая лента!");
глФР.Disconnect();
СлужСпр.Блокировка(0);
Возврат;
КонецЕсли;
// Выполняем алгоритм печати чека (OpenCheck, Sale, CloseCheck...)
// ...
КонецЕсли;
// 5. Завершение сеанса работы с ККМ
глФР.Disconnect();
// 6. Отключение сетевого порта
КомандаСистемы("net use COM5: /delete /yes");
// 7. Снятие блокировки семафора
СлужСпр.Блокировка(0);
Рассмотрим важные нюансы этого подхода. Обязательно помещайте вызовы отключения кассы (глФР.Disconnect()) и снятия блокировки (СлужСпр.Блокировка(0)) в блоки обработки ошибок. Если связь прервется в середине печати чека, фискальный документ может остаться открытым. При повторном подключении необходимо проверять режим ККМ через GetECRStatus() и при необходимости вызывать метод отмены чека (CancelCheck()).
Если пользователей много и блокировки при интерактивном пробитии чека начинают мешать комфортной работе, разберем более гибкую архитектуру — отложенную печать через очередь документов:
ОбработкаОжидания()) сканирует базу на наличие новых непробитых документов.Такой подход полностью исключает одновременный конфликт доступа к COM-порту или USB-устройству, так как физическое взаимодействие с кассой выполняет только один выделенный процесс.
В ситуациях, когда наряду с 1С 7.7 печать чеков должна выполняться из сторонних программ (например, написанных на FoxPro или веб-приложений), привязка к семафорам внутри базы 1С не сработает. Рассмотрим альтернативные методы взаимодействия:
WinHttp.WinHttpRequest.5.1.Таким образом, наиболее надежным путем для трех рабочих мест в среде 1С 7.7 является либо реализация блокировок на уровне служебного элемента справочника с динамическим разрывом соединения, либо организация служебного сеанса с очередью печати.