Как передать параметры заполнения при создании чека ККМ и настроить интерфейс терминала оплаты?

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

При разработке специализированных рабочих мест (терминалов самообслуживания, сенсорных панелей оплаты или киосков) разработчики часто сталкиваются с задачей создания и пробития чеков ККМ. В типовых журналах документов создание объекта инициируется из динамического списка, что вызывает вопросы: как именно платформа передает реквизиты (кассу, смену, основание), где перехватить эти данные отладчиком и как правильно организовать программное открытие формы или создание документа без использования стандартных списков.

Разберем детально механизм работы платформы и рассмотрим практические сценарии решения этой задачи.

Как платформа передает параметры при интерактивном создании из динамического списка

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

  1. Передача отборов: Если у динамического списка задано свойство ОсновнаяТаблица, платформа автоматически формирует системную структуру ЗначенияЗаполнения. В нее помещаются текущие значения установленных отборов (включая фиксированные отборы и отборы из пользовательских настроек).
  2. Точки перехвата в отладчике:

    Чтобы отследить процесс инициализации нового документа, установим точки останова в следующих процедурах:

    • В модуле объекта документа: процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка). В параметре ДанныеЗаполнения передается структура с отборами списка либо ссылка на документ-основание.
    • В модуле формы документа: процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Входные параметры доступны через коллекцию Параметры.ЗначенияЗаполнения или Параметры.Основание.

Открытие формы документа с явной передачей параметров заполнения

Если для задачи требуется запустить интерфейс мастера или специализированную форму ввода чека с сенсорной панели, использовать динамический список не требуется. Передадим параметры напрямую через метод ОткрытьФорму с использованием ключа ЗначенияЗаполнения.

Посмотрим на пример вызова формы мастера чека ККМ с заполнением кассы и заказа:


ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("КассаККМ", ПолучитьКассуТерминала());
ПараметрыОткрытия.Вставить("ЗаказКлиента", ПолучитьЗаказКлиента());

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыОткрытия);

ОткрытьФорму("Документ.ЧекККМ.Форма.ФормаДокументаМастер", ПараметрыФормы);

В этом случае платформа автоматически передаст структуру ПараметрыОткрытия в обработчик ОбработкаЗаполнения модуля объекта, а также предоставит доступ к значениям в серверном контексте формы.

Альтернативный вариант: Полностью программное создание и фискализация чека

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

Разберем по шагам создание документа на стороне сервера:


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

Особенности работы с кассовой сменой и эквайрингом

При реализации автоматизированного пробития чеков обратим внимание на следующие требования:

  1. Контроль кассовой смены: Документ ЧекККМ требует обязательного указания открытого документа КассоваяСмена. Смена не должна превышать 24 часа.
  2. Эквайринговая транзакция: При безналичной оплате сначала отправляется запрос на терминал эквайринга через функции БПО (Библиотеки подключаемого оборудования). Только после получения подтверждения успешной транзакции (с RRN-кодом и номером чека) выполняется проведение документа и отправка XML-пакета на фискальный регистратор.
  3. Обработка исключений: Все операции взаимодействия с оборудованием и записи данных необходимо оборачивать в конструкцию Попытка ... Исключение для корректной отмены транзакций при сбоях.
← На главную