Как программно изменить кассу ККМ и обойти фиксированную структуру в РМК 1С:Управление торговлей 11

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе кастомизации рабочего места кассира (РМК) в «1С:Управление торговлей 11» разработчики часто сталкиваются с необходимостью динамической смены Кассы ККМ. Типовой функционал РМК жестко привязан к одной кассе, определенной при открытии сессии. Одной из главных преград на пути к реализации выбора кассы «на лету» является использование объектами системы типа ФиксированнаяСтруктура. В этой статье мы подробно разберем, как обойти это ограничение и заставить систему печатать чеки на выбранное устройство.

Разбираемся с ограничением Фиксированной структуры

Объект ФиксированнаяСтруктура в 1С предназначен для хранения данных, которые не должны меняться после создания. В РМК УТ 11 переменная ПараметрыКассыККМ инициализируется именно в этом формате. Если мы попытаемся напрямую перезаписать свойство такой структуры, система выдаст ошибку, так как объект доступен только для чтения.

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


// Получаем текущие параметры в редактируемую структуру
ВремСтруктура = Новый Структура(ПараметрыКассыККМ);

// Устанавливаем новое значение кассы
ВремСтруктура.КассаККМ = Объект.КассаККМ;

// Если в структуре есть связанные параметры оборудования, их также нужно обновить
// Например, ИдентификаторУстройства или Организация

// Заменяем старую фиксированную структуру новой
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(ВремСтруктура);

Важный нюанс: при смене структуры на сервере или клиенте необходимо учитывать контекст выполнения. Если вы меняете переменную формы, которая объявлена как ФиксированнаяСтруктура, то после присвоения нового объекта все последующие вызовы процедур будут использовать обновленные данные. Однако, как отмечают опытные разработчики, если параметры передаются «по значению» в глубокие вложенные процедуры, простая подмена переменной формы может не сработать для уже запущенных процессов.

Почему чек все равно печатается на старую кассу?

Даже если нам удалось успешно подменить реквизит в документе ЧекККМ и обновить структуру параметров, мы можем столкнуться с ситуацией, когда физическая печать все равно уходит на первый фискальный регистратор. Разберем причины этой проблемы по шагам.

В УТ 11 связь между логической Кассой ККМ и физическим устройством осуществляется через справочник Подключаемое оборудование. Процесс фискализации (печати) опирается не столько на ссылку на кассу, сколько на Идентификатор устройства (UUID устройства). Этот идентификатор кэшируется в модуле формы РМК при инициализации оборудования.

Шаг 1: Обновление идентификатора устройства

При интерактивной смене Кассы ККМ нам необходимо принудительно найти оборудование, связанное с новой кассой, и обновить внутренние переменные формы. Выясним, какие именно параметры нужно переопределить:

  1. ИдентификаторУстройства — ссылка на конкретный экземпляр в справочнике подключаемого оборудования.
  2. ПараметрыФискализации — структура, содержащая настройки налогообложения, признак агента и другие специфические данные.

Для поиска актуального устройства можно использовать методы общего модуля МенеджерОборудованияУТ. Проанализируем примерную логику:


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

Шаг 2: Проверка состояния кассовой смены

Типовой механизм 1С не позволит пробить чек, если по выбранной кассе не открыта смена. При «сером» и «белом» учете на одном рабочем месте у вас фактически должны быть открыты две параллельные кассовые смены. Программа при пробитии чека проверяет наличие активного документа КассоваяСмена для текущего пользователя и устройства.

Рассмотрим ситуацию: если вы переключили кассу, но не обновили ссылку на текущую смену в параметрах формы, система выдаст ошибку «Смена другого пользователя» или «Смена не открыта». Обязательно убедитесь, что при смене структуры ПараметрыКассыККМ вы также актуализируете данные о текущей смене.

Шаг 3: Пересчет налогов и СНО

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

Для этого в форме РМК следует вызвать обработчики, аналогичные ПриИзменении для цен и налогов. Это обеспечит корректное заполнение структур, которые будут переданы в драйвер торгового оборудования.

Резюме для реализации в расширении

Подводя итог, для реализации полноценного переключения касс в РМК УТ 11 выполним следующие действия:

  1. Создадим в расширении поле выбора КассаККМ в интерфейсе РМК.
  2. В обработчике ПриИзменении этого поля вызовем серверный код для пересоздания ФиксированнаяСтруктура (как показано выше).
  3. Обновим ИдентификаторУстройства, найдя его по новой кассе и рабочему месту.
  4. Проверим наличие открытой смены для нового устройства и подменим ссылку на КассовуюСмену в контексте формы.
  5. Инициируем пересчет налогов в корзине товаров под параметры новой кассы.

Использование связки Структура -> ФиксированнаяСтруктура позволяет «обмануть» типовые механизмы, не прибегая к масштабному переписыванию общего модуля фискализации. Это сохраняет обновляемость конфигурации и решает задачу клиента минимальными усилиями.

← На главную