При организации работы торговой точки нередко возникает необходимость подключить несколько рабочих мест кассира (РМК) к одному физическому фискальному регистратору или сетевому серверу печати чеков. Однако при попытке пробить чек со второго терминала пользователи часто сталкиваются с ошибкой: «При печати чека произошла ошибка. Чек не напечатан на фискальном устройстве. Дополнительное описание: Кассовая смена не открыта или истекла».
Разберем по шагам, почему возникает эта коллизия в типовых конфигурациях 1С, как устроена работа подсистемы подключаемого оборудования (БПО) и какими способами можно настроить корректную многопользовательскую печать.
Проанализируем архитектуру подсистемы БПО, используемой в конфигурациях «1С:Управление торговлей 11», «1С:ERP» и «1С:Комплексная автоматизация». Поведение системы обусловлено двумя ключевыми факторами:
РабочиеМеста (уникальному идентификатору клиентского компьютера или сеанса). Документ КассоваяСмена регистрируется с обязательным отбором по связке параметров «Касса ККМ» и «Рабочее место». Когда на первом РМК кассир открывает смену, смена открывается и в базе, и в фискальном накопителе (ФН). При попытке пробить чек со второго РМК конфигурация ищет в табличной части открытую смену именно для текущего сеанса. Не найдя ее, 1С посылает в кассу команду открытия новой смены. В ответ касса возвращает ошибку, так как в самом фискальном накопителе смена уже открыта.В типовых конфигурациях «1С:Розница» и «1С:Управление нашей фирмой» механизм работы с общим оборудованием реализован штатно, тогда как в «1С:Управление торговлей» для разделения кассы между несколькими РМК требуется адаптация логики или настройка отдельного сценария фискализации.
Рассмотрим самый простой способ обхода ошибки без снятия конфигурации с поддержки и без внесения правок в программный код.
Задача сводится к тому, чтобы заставить разные клиентские сеансы (включая RDP-подключения и виртуальные машины) использовать одну и ту же запись в справочнике РабочиеМеста:
В результате все кассиры будут видеть одну открытую смену в базе данных. Проверка состояния смены перед фискализацией чека пройдет успешно, и повторная команда на открытие смены отправляться не будет.
Если специфика учета требует сохранения персональных рабочих мест для каждого сотрудника, скорректируем типовую проверку смены с помощью расширения конфигурации.
Посмотрим на типовой алгоритм: обычно он накладывает фильтр на реквизиты КассаККМ и РабочееМесто. В расширении переопределим функцию поиска открытой смены так, чтобы отбор производился исключительно по объекту КассаККМ.
Пример программного кода для поиска открытой смены по кассе:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| КассоваяСмена.Ссылка КАК Ссылка,
| КассоваяСмена.Состояние КАК Состояние
|ИЗ
| Документ.КассоваяСмена КАК КассоваяСмена
|ГДЕ
| КассоваяСмена.КассаККМ = &КассаККМ
| И КассоваяСмена.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияКассовойСмены.Открыта)";
Запрос.УстановитьПараметр("КассаККМ", ПараметрыКассы.КассаККМ);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
// Возвращаем существующую открытую смену без вызова команды драйвера
ТекущаяСмена = Выборка.Ссылка;
КонецЕсли;
Благодаря такой корректировке второй сеанс увидит смену, открытую первым кассиром, и сразу перейдет к этапу формирования фискальных строк чека.
Рассмотрим наиболее надежный подход для высоконагруженных торговых точек. Прямое обращение нескольких РМК к одной кассе даже при исправленной логике смен может вызывать конфликты параллельного доступа («Порт занят»). Для устранения проблемы организуем очередь чеков:
ЧекККМ со статусом «К фискализации».Этот метод полностью устраняет проблемы блокировок и позволяет распределять нагрузку без риска потери данных.
Реализуя совместную печать чеков, обратим внимание на обязательные требования 54-ФЗ и форматов фискальных документов (ФФД):