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