В современных реалиях розничной торговли каждый клик кассира на рабочем месте имеет значение для скорости обслуживания клиентов. Стандартная функциональность 1С:Управление торговлей (УТ) 11.4 и 1С:Комплексная автоматизация (КА) 2.4 после успешной оплаты по эквайрингу часто требует от кассира дополнительных действий для пробития фискального чека. Наша задача — максимально автоматизировать этот процесс, сведя его к «одному касанию».
Рассмотрим, как можно модифицировать типовое поведение системы, чтобы после нажатия кнопки «Оплатить картой» сразу открывалось окно эквайринга для принятия оплаты, и после ее успешного завершения автоматически пробивался чек ККМ без дополнительных подтверждений.
Прежде чем приступать к доработкам, давайте разберем, почему в типовых конфигурациях 1С:Розница, 1С:УТ и 1С:КА требуется несколько нажатий. При нажатии на кнопку безналичной оплаты обычно последовательно открываются следующие формы:
Такое поведение обусловлено тем, что механизм оплаты платежной картой в 1С тесно интегрирован с механизмом сложной оплаты. Это означает, что одна и та же форма и алгоритм используются как для простых безналичных платежей, так и для комбинации различных видов оплаты (например, часть наличными, часть картой, подарочным сертификатом и т.д.). Просто при оплате картой на всю сумму, система автоматически подставляет 100% от суммы чека. Изменение этого поведения без учета контекста сложной оплаты может привести к нарушению ее функциональности. Поэтому нам потребуется тщательная доработка.
Для реализации желаемого функционала, мы будем использовать расширения. Это ключевой и рекомендуемый подход в 1С для внесения изменений в типовые конфигурации, так как он позволяет сохранять конфигурацию на поддержке и упрощает процесс обновлений. Нам потребуется доработать два общих модуля:
РозничныеПродажи (серверный модуль) – для корректировки данных фискальной операции по умолчанию.РозничныеПродажиКлиент (клиентский модуль) – для перехвата и изменения логики вызова формы авторизации эквайрингового терминала.Основная идея заключается в том, чтобы, если сумма оплаты картой полностью соответствует сумме чека и используется реальный эквайринговый терминал (не ручной ввод без подключения оборудования), пропустить промежуточное окно авторизации и сразу отправить команду на эквайринговый терминал, а затем пробить чек.
РозничныеПродажи (Сервер)Первый шаг – корректировка поведения системы в отношении электронных чеков. По умолчанию, после эквайринговой операции, даже если она покрывает всю сумму чека, может открываться окно с кнопкой «Пробить чек», если вариант отправки чека не определен. Мы хотим, чтобы по умолчанию чек сразу печатался, если только в карточке клиента не указано иное (например, отправка по СМС или e-mail).
Для этого мы воспользуемся директивой &Вместо для процедуры ОчиститьДанныеФискальнойОперации. Создадим в расширении новую процедуру, которая будет замещать типовую:
&Вместо("ОчиститьДанныеФискальнойОперации")
Процедура Доп_ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации)
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять; //+АняновМА, было: Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.ПустаяСсылка
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = "";
КонецПроцедуры
Что мы сделали в этом коде:
&Вместо("ОчиститьДанныеФискальнойОперации") указывает системе, что наша процедура Доп_ОчиститьДанныеФискальнойОперации должна полностью заменить оригинальную процедуру с тем же именем.ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять; устанавливает по умолчанию, что электронный чек не будет отправляться. Это означает, что система будет стремиться сразу напечатать физический чек ККМ. Оригинальное поведение могло оставлять это поле пустым или устанавливать его в ПустаяСсылка, что могло приводить к дополнительным диалогам.ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = ""; также гарантирует, что поле для контактных данных электронного чека остается пустым по умолчанию.Таким образом, если клиенту необходимо отправлять чеки по СМС или e-mail, эти данные должны быть предварительно указаны в его карточке или в настройках дисконтной карты. В противном случае, система будет ориентироваться на немедленную печать чека, что соответствует нашей цели автоматизации.
РозничныеПродажиКлиент (Клиент)Второй, и наиболее значимый шаг, это изменение логики на стороне клиента, чтобы перехватить вызов формы авторизации оплаты и пропустить ее при определенных условиях. Мы будем модифицировать процедуру ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала.
Снова используем директиву &Вместо для замены типовой процедуры:
&Вместо("ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала")
Процедура Доп_ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала(СтруктураЭквайринговыйТерминал, ДополнительныеПараметры)
Если СтруктураЭквайринговыйТерминал <> Неопределено Тогда
ИдентификаторУстройстваЭТ = СтруктураЭквайринговыйТерминал.ПодключаемоеОборудование;
Иначе
ИдентификаторУстройстваЭТ = Неопределено;
КонецЕсли;
ДополнительныеПараметры.ИдентификаторУстройстваЭТ = ИдентификаторУстройстваЭТ;
ДополнительныеПараметры.СтруктураЭквайринговыйТерминал = СтруктураЭквайринговыйТерминал;
Если ЗначениеЗаполнено(ИдентификаторУстройстваЭТ) Или (СтруктураЭквайринговыйТерминал <> Неопределено И СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования) Тогда
Если Не СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
РезультатЭТ = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ИдентификаторУстройстваЭТ);
Иначе
РезультатЭТ = Истина;
КонецЕсли;
Если РезультатЭТ Тогда
//+АняновМА
Если ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы И НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
СтруктураВозврата = Новый Структура;
СтруктураВозврата.Вставить("Сумма" , ДополнительныеПараметры.ФормаАвторизации_Сумма);
СтруктураВозврата.Вставить("ДанныеКарты" , "");
СтруктураВозврата.Вставить("СсылочныйНомер", "");
СтруктураВозврата.Вставить("ТипКарты" , 0);
СтруктураВозврата.Вставить("НомерКарты" , "");
СтруктураВозврата.Вставить("НомерЧека" , "");
СтруктураВозврата.Вставить("НомерЧекаЭТ" , "");
ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры);
Возврат;
КонецЕсли;
//-АняновМА
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Сумма", ДополнительныеПараметры.ФормаАвторизации_Сумма);
ПараметрыФормы.Вставить("ПределСуммы", ДополнительныеПараметры.ФормаАвторизации_ПределСуммы);
ПараметрыФормы.Вставить("Валюта", ДополнительныеПараметры.Валюта);
Если СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
ПараметрыФормы.Вставить("ПоказыватьНомерКарты", Истина);
КонецЕсли;
ОткрытьФорму(
"Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ",
ПараметрыФормы,
,,,,
Новый ОписаниеОповещения(
"ДобавитьОплатуКартойЗавершение",
РозничныеПродажиКлиент,
ДополнительныеПараметры
),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
);
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Эквайринговый терминал не подключен. Операция по карте не выполнена.'")
);
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Неопределено);
КонецЕсли;
Иначе
// Не выбран эквайринговый терминал
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Неопределено);
КонецЕсли;
КонецПроцедуры
Разберем основные изменения и их назначение:
//+АняновМА и //-АняновМА):
Если ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы И НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
// ...
ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры);
Возврат;
КонецЕсли;
ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы: Это означает, что сумма оплаты картой равна полной сумме чека. Мы стремимся автоматизировать только те случаи, когда оплата производится исключительно картой на всю сумму.НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования: Это гарантирует, что мы работаем с реальным физическим эквайринговым терминалом. Если терминал используется "без подключения оборудования" (т.е., вручную вводится данные), то форму авторизации пропускать нельзя, так как кассиру нужно будет ввести данные карты.СтруктураВозврата. Эта структура имитирует данные, которые обычно возвращает форма авторизации после успешной оплаты. Мы заполняем ее необходимыми полями: Сумма, ДанныеКарты (пусто, так как в реальном терминале мы их не получаем на стороне 1С), СсылочныйНомер, ТипКарты, НомерКарты, НомерЧека, НомерЧекаЭТ.ОткрытьФорму("Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ"...)), мы напрямую вызываем процедуру ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры). Эта процедура отвечает за добавление информации об оплате картой в документ и последующее пробитие чека ККМ. Сразу после этого используется оператор Возврат;, чтобы прервать дальнейшее выполнение процедуры и не открывать типовую форму.Таким образом, мы добиваемся того, что при оплате всей суммы чека реальным эквайринговым терминалом, кассиру достаточно нажать «Оплатить картой», и система самостоятельно проведет оплату через терминал и пробитие чека.
После внесения таких значительных изменений в логику оплаты, критически важно провести всестороннее тестирование. Для этого мы рекомендуем использовать эмуляторы эквайринговых терминалов. Существуют различные реализации таких эмуляторов:
Подключите эмулятор как стандартное подключаемое оборудование в 1С (через справочник ПодключаемоеОборудование) и выполните следующие сценарии:
Реализация такого функционала существенно повышает эффективность работы кассиров, сокращает время обслуживания клиентов и минимизирует вероятность ошибок, связанных с лишними нажатиями. Следуя изложенным шагам, вы сможете успешно автоматизировать процесс пробития чеков после эквайринговых операций в ваших системах 1С:УТ 11.4 и 1С:КА 2.4.