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