При внедрении торгового эквайринга в конфигурации 1С:Торговля и Склад 9.2 на платформе 1С:Предприятие 7.7 часто возникает задача разделения видов оплат в фискальном регистраторе (ФР) «Штрих-М». Если терминал работает автономно от учетной системы, кассир сначала проводит операцию по банковскому терминалу, а затем пробивает фискальный чек в 1С. Разберем, как правильно передавать информацию о безналичной оплате в драйвер ККТ, чтобы суммы корректно распределялись по секциям и типам оплат в сменных отчетах (Z-отчете).
Проанализируем распространенное заблуждение: попытку передать признак безналичной оплаты через номер секции или отдела. Важно четко разделять эти понятия:
Department при регистрации каждой позиции чека (методы Sale() или ReturnSale()). Секции служат для аналитического разделения номенклатуры (например, разные товарные группы или системы налогообложения).Summ1, Summ2, Summ3, Summ4 непосредственно перед фискализацией чека методом CloseCheck().В фискальных регистраторах «Штрих-М» по умолчанию используются следующие соответствия:
Summ1 — Наличные денежные средства (Тип оплаты 1).Summ2 — Безналичные расчеты / Платежная карта / Электронные средства (Тип оплаты 2).Summ3 и Summ4 — Прочие типы оплаты (кредит, предоплата, сертификаты и т.д.).Передача чека в отдельную секцию не делает оплату безналичной. Для отражения эквайринга необходимо передавать сумму в свойство Summ2.
Перед доработкой конфигурации проверим настройки аппарата через утилиту «Тест драйвера ККТ» («Тест драйвера ФР»):
БЕЗНАЛИЧНЫМИ, ПЛАТ. КАРТОЙ или ЭЛЕКТРОННЫМИ.Разберем по шагам доработку конфигурации «Торговля и Склад 9.2»:
Чек добавим реквизит или реквизит формы для выбора способа оплаты: Наличные или Банковская карта. Если требуется смешанная оплата (часть чека налом, часть картой), создадим два реквизита: СуммаНал и СуммаБезнал.Откроем внешнюю обработку обслуживания ККТ (как правило, fr_comm.ert или специализированный модуль работы с ФР) и найдем процедуру закрытия чека. Перед вызовом метода CloseCheck() драйвера необходимо инициализировать все переменные сумм, чтобы избежать наложения данных от предыдущих операций.
Посмотрим на пример кода закрытия чека с оплатой банковской картой:
// Очищаем все типы оплат перед заполнением
Объект.Summ1 = 0;
Объект.Summ2 = 0;
Объект.Summ3 = 0;
Объект.Summ4 = 0;
// Распределяем суммы в зависимости от типа оплаты
Если ТипОплаты = 1 Тогда
// 100% оплата наличными
Объект.Summ1 = ИтогЧека;
ИначеЕсли ТипОплаты = 2 Тогда
// 100% оплата по банковской карте (эквайринг)
Объект.Summ2 = ИтогЧека;
ИначеЕсли ТипОплаты = 3 Тогда
// Смешанная оплата (наличные + карта)
Объект.Summ1 = СуммаНаличными;
Объект.Summ2 = СуммаКартой;
КонецЕсли;
// Сброс служебных параметров чека
Объект.DiscountOnCheck = 0;
Объект.StringForPrinting = "";
// Выполняем фискализацию и закрытие чека
Объект.CloseCheck();
// Проверяем результат выполнения команды
Если Объект.ResultCode <> 0 Тогда
Предупреждение("Ошибка закрытия чека: " + Объект.ResultCodeDescription);
Возврат 0;
КонецЕсли;
Рассмотрим нюансы, соблюдение которых позволит избежать сбоев при печати чеков:
Summ2 не может превышать сумму товарных позиций чека. Драйвер вернет ошибку, если переданная безналичная сумма больше итога чека.Summ1 + Summ2 = ИтогЧека. При расхождении даже на 1 копейку метод CloseCheck() завершится ошибкой.ReturnSale() закрытие чека также должно производиться через свойство Summ2. Это гарантирует, что возврат по безналичному расчету не уменьшит сумму наличных денег в кассе фискального регистратора.Summ1–Summ4. Это предотвратит случайное дублирование сумм из памяти драйвера.