Как настроить печать на одну кассу Штрих-М с нескольких компьютеров в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

В розничной и оптовой торговле часто возникает задача совместного использования одного фискального регистратора (онлайн-кассы) сразу несколькими пользователями, работающими в локальной сети или через терминальный сервер. Разберем типичную проблему: в наличии три рабочих места с конфигурацией 1С:Торговля и Склад 7.7 и один фискальный регистратор линейки Штрих-М (например, Штрих-Онлайн). Требуется обеспечить стабильную печать фискальных документов со всех рабочих мест без конфликтов оборудования.

Выясним причину, почему попытка задействовать стандартный сетевой «Сервер ФР» (утилиту SrvFR.exe) часто вызывает затруднения. Во-первых, для штатного сетевого драйвера требуется лицензирование либо тонкая настройка разрешений DCOM и прав запуска в современных версиях Windows, где по умолчанию сетевые вызовы блокируются брандмауэром и политиками безопасности. Во-вторых, даже при успешной сетевой настройке сам драйвер кассы не организует очередь печати. Если два рабочих места попытаются пробить чек одновременно, одно из них получит ошибку блокировки порта или тайм-аута связи. Проанализируем надежные практические решения этой задачи.

Решение 1. Программный семафор и динамическое подключение к ККМ

Самый стабильный и независимый от платных компонентов метод заключается в управлении очередью доступа на уровне самого кода конфигурации 1С. Поскольку касса не может одновременно обрабатывать два фискальных документа, организуем принцип семафора:

  1. Блокируем доступ к оборудованию через служебный элемент справочника или файл блокировки.
  2. Если блокировка не удалась, значит, в данный момент чек пробивает другое рабочее место — ожидаем освобождения ресурса или повторяем попытку.
  3. Динамически подключаемся к фискальному регистратору (при необходимости пробрасываем порт).
  4. Выполняем фискализацию чека.
  5. Корректно разрываем соединение с кассой и освобождаем порт.
  6. Снимаем блокировку со служебного объекта.

Посмотрим на пример реализации данного алгоритма для 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()).

Решение 2. Архитектура выделенного сеанса печати (Очередь документов)

Если пользователей много и блокировки при интерактивном пробитии чека начинают мешать комфортной работе, разберем более гибкую архитектуру — отложенную печать через очередь документов:

  1. Пользователи на всех трех рабочих местах создают документы «Чек ККМ» или «Приходный кассовый ордер» в обычном режиме без прямого обращения к драйверу фискального регистратора. Документ проводится с признаком «Не напечатан».
  2. На компьютере, к которому касса подключена физически, запускается отдельный сервисный сеанс 1С.
  3. Служебный сеанс в цикле (или по обработке ожидания через ОбработкаОжидания()) сканирует базу на наличие новых непробитых документов.
  4. Сервисный сеанс последовательно фискализирует чеки один за другим, проставляет в документе признак завершения печати и номер фискального чека.

Такой подход полностью исключает одновременный конфликт доступа к COM-порту или USB-устройству, так как физическое взаимодействие с кассой выполняет только один выделенный процесс.

Решение 3. Прямое подключение по TCP-сокету или локальный веб-сервис

В ситуациях, когда наряду с 1С 7.7 печать чеков должна выполняться из сторонних программ (например, написанных на FoxPro или веб-приложений), привязка к семафорам внутри базы 1С не сработает. Рассмотрим альтернативные методы взаимодействия:

  1. Подключение через TCP-сокет кассы: большинство современных касс семейства «Штрих-Онлайн» поддерживают сетевой интерфейс (Ethernet, Wi-Fi или RNDIS по USB). В окне настройки свойств драйвера можно выбрать тип подключения «TCP сокет» и указать прямой IP-адрес кассы (порт по умолчанию — 7778). Каждое рабочее место подключается к кассе напрямую по сети. Однако учитывайте: прошивка кассы держит лишь одно входящее соединение. Приложения должны открывать сокет, быстро пробивать чек и моментально закрывать соединение.
  2. Локальный кассовый HTTP-сервер: на ПК с физически подключенной ККТ развертывается промежуточный веб-сервис (на Node.js, Python или готовых утилитах печати чеков). Сервис принимает HTTP POST-запросы с JSON-описанием чека от любых клиентов (1С 7.7, FoxPro), выстраивает их во внутреннюю очередь и последовательно отправляет в драйвер. Из 1С 7.7 такой запрос легко отправляется с помощью COM-объекта WinHttp.WinHttpRequest.5.1.

Таким образом, наиболее надежным путем для трех рабочих мест в среде 1С 7.7 является либо реализация блокировок на уровне служебного элемента справочника с динамическим разрывом соединения, либо организация служебного сеанса с очередью печати.

← На главную