Как автоматизировать пробитие чека ККМ после успешной оплаты по эквайрингу в 1С:УТ 11.4 и КА 2.4?

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

В современных реалиях розничной торговли каждый клик кассира на рабочем месте имеет значение для скорости обслуживания клиентов. Стандартная функциональность 1С:Управление торговлей (УТ) 11.4 и 1С:Комплексная автоматизация (КА) 2.4 после успешной оплаты по эквайрингу часто требует от кассира дополнительных действий для пробития фискального чека. Наша задача — максимально автоматизировать этот процесс, сведя его к «одному касанию».

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

Анализ типовой функциональности 1С

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

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

Такое поведение обусловлено тем, что механизм оплаты платежной картой в 1С тесно интегрирован с механизмом сложной оплаты. Это означает, что одна и та же форма и алгоритм используются как для простых безналичных платежей, так и для комбинации различных видов оплаты (например, часть наличными, часть картой, подарочным сертификатом и т.д.). Просто при оплате картой на всю сумму, система автоматически подставляет 100% от суммы чека. Изменение этого поведения без учета контекста сложной оплаты может привести к нарушению ее функциональности. Поэтому нам потребуется тщательная доработка.

Общий подход к реализации автоматизации

Для реализации желаемого функционала, мы будем использовать расширения. Это ключевой и рекомендуемый подход в 1С для внесения изменений в типовые конфигурации, так как он позволяет сохранять конфигурацию на поддержке и упрощает процесс обновлений. Нам потребуется доработать два общих модуля:

  1. РозничныеПродажи (серверный модуль) – для корректировки данных фискальной операции по умолчанию.
  2. РозничныеПродажиКлиент (клиентский модуль) – для перехвата и изменения логики вызова формы авторизации эквайрингового терминала.

Основная идея заключается в том, чтобы, если сумма оплаты картой полностью соответствует сумме чека и используется реальный эквайринговый терминал (не ручной ввод без подключения оборудования), пропустить промежуточное окно авторизации и сразу отправить команду на эквайринговый терминал, а затем пробить чек.

Доработка модуля РозничныеПродажи (Сервер)

Первый шаг – корректировка поведения системы в отношении электронных чеков. По умолчанию, после эквайринговой операции, даже если она покрывает всю сумму чека, может открываться окно с кнопкой «Пробить чек», если вариант отправки чека не определен. Мы хотим, чтобы по умолчанию чек сразу печатался, если только в карточке клиента не указано иное (например, отправка по СМС или e-mail).

Для этого мы воспользуемся директивой &Вместо для процедуры ОчиститьДанныеФискальнойОперации. Создадим в расширении новую процедуру, которая будет замещать типовую:


&Вместо("ОчиститьДанныеФискальнойОперации")
Процедура Доп_ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации)
    ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять; //+АняновМА, было: Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.ПустаяСсылка
    ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = "";
КонецПроцедуры

Что мы сделали в этом коде:

  1. Замещение процедуры: Директива &Вместо("ОчиститьДанныеФискальнойОперации") указывает системе, что наша процедура Доп_ОчиститьДанныеФискальнойОперации должна полностью заменить оригинальную процедуру с тем же именем.
  2. Настройка отправки чека: Строка ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять; устанавливает по умолчанию, что электронный чек не будет отправляться. Это означает, что система будет стремиться сразу напечатать физический чек ККМ. Оригинальное поведение могло оставлять это поле пустым или устанавливать его в ПустаяСсылка, что могло приводить к дополнительным диалогам.
  3. Очистка контактных данных: ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = ""; также гарантирует, что поле для контактных данных электронного чека остается пустым по умолчанию.

Таким образом, если клиенту необходимо отправлять чеки по СМС или e-mail, эти данные должны быть предварительно указаны в его карточке или в настройках дисконтной карты. В противном случае, система будет ориентироваться на немедленную печать чека, что соответствует нашей цели автоматизации.

Доработка модуля РозничныеПродажиКлиент (Клиент)

Второй, и наиболее значимый шаг, это изменение логики на стороне клиента, чтобы перехватить вызов формы авторизации оплаты и пропустить ее при определенных условиях. Мы будем модифицировать процедуру ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала.

Снова используем директиву &Вместо для замены типовой процедуры:


&Вместо("ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала")
Процедура Доп_ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала(СтруктураЭквайринговыйТерминал, ДополнительныеПараметры)
    Если СтруктураЭквайринговыйТерминал <> Неопределено Тогда
        ИдентификаторУстройстваЭТ = СтруктураЭквайринговыйТерминал.ПодключаемоеОборудование;
    Иначе
        ИдентификаторУстройстваЭТ = Неопределено;
    КонецЕсли;

    ДополнительныеПараметры.ИдентификаторУстройстваЭТ = ИдентификаторУстройстваЭТ;
    ДополнительныеПараметры.СтруктураЭквайринговыйТерминал = СтруктураЭквайринговыйТерминал;

    Если ЗначениеЗаполнено(ИдентификаторУстройстваЭТ) Или (СтруктураЭквайринговыйТерминал <> Неопределено И СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования) Тогда
        Если Не СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
            РезультатЭТ = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ИдентификаторУстройстваЭТ);
        Иначе
            РезультатЭТ = Истина;
        КонецЕсли;

        Если РезультатЭТ Тогда
            //+АняновМА
            Если ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы И НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
                СтруктураВозврата = Новый Структура;
                СтруктураВозврата.Вставить("Сумма" , ДополнительныеПараметры.ФормаАвторизации_Сумма);
                СтруктураВозврата.Вставить("ДанныеКарты" , "");
                СтруктураВозврата.Вставить("СсылочныйНомер", "");
                СтруктураВозврата.Вставить("ТипКарты" , 0);
                СтруктураВозврата.Вставить("НомерКарты" , "");
                СтруктураВозврата.Вставить("НомерЧека" , "");
                СтруктураВозврата.Вставить("НомерЧекаЭТ" , "");
                ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры);
                Возврат;
            КонецЕсли;
            //-АняновМА
            ПараметрыФормы = Новый Структура;
            ПараметрыФормы.Вставить("Сумма", ДополнительныеПараметры.ФормаАвторизации_Сумма);
            ПараметрыФормы.Вставить("ПределСуммы", ДополнительныеПараметры.ФормаАвторизации_ПределСуммы);
            ПараметрыФормы.Вставить("Валюта", ДополнительныеПараметры.Валюта);

            Если СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
                ПараметрыФормы.Вставить("ПоказыватьНомерКарты", Истина);
            КонецЕсли;

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

Разберем основные изменения и их назначение:

  1. Определение устройства: В начале процедуры, как и в типовом коде, определяется идентификатор эквайрингового терминала и проверяется его подключение. Это стандартная логика, которую мы оставляем без изменений.
  2. Условие автоматизации: Ключевой момент – это добавленный блок кода (помеченный комментариями //+АняновМА и //-АняновМА):
    
    Если ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы И НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
        // ...
        ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры);
        Возврат;
    КонецЕсли;
    
    Это условие проверяет два важных момента:
    • ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы: Это означает, что сумма оплаты картой равна полной сумме чека. Мы стремимся автоматизировать только те случаи, когда оплата производится исключительно картой на всю сумму.
    • НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования: Это гарантирует, что мы работаем с реальным физическим эквайринговым терминалом. Если терминал используется "без подключения оборудования" (т.е., вручную вводится данные), то форму авторизации пропускать нельзя, так как кассиру нужно будет ввести данные карты.
  3. Имитация успешной авторизации: Если оба условия выполняются, мы создаем новую структуру СтруктураВозврата. Эта структура имитирует данные, которые обычно возвращает форма авторизации после успешной оплаты. Мы заполняем ее необходимыми полями: Сумма, ДанныеКарты (пусто, так как в реальном терминале мы их не получаем на стороне 1С), СсылочныйНомер, ТипКарты, НомерКарты, НомерЧека, НомерЧекаЭТ.
  4. Прямой вызов завершающей процедуры: Вместо открытия формы авторизации (ОткрытьФорму("Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ"...)), мы напрямую вызываем процедуру ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры). Эта процедура отвечает за добавление информации об оплате картой в документ и последующее пробитие чека ККМ. Сразу после этого используется оператор Возврат;, чтобы прервать дальнейшее выполнение процедуры и не открывать типовую форму.
  5. Сохранение типовой логики: Если же условия для автоматизации не выполняются (например, частичная оплата картой или ручной ввод данных терминала), то код продолжает выполняться по типовому сценарию, открывая форму авторизации.

Таким образом, мы добиваемся того, что при оплате всей суммы чека реальным эквайринговым терминалом, кассиру достаточно нажать «Оплатить картой», и система самостоятельно проведет оплату через терминал и пробитие чека.

Тестирование разработанного функционала

После внесения таких значительных изменений в логику оплаты, критически важно провести всестороннее тестирование. Для этого мы рекомендуем использовать эмуляторы эквайринговых терминалов. Существуют различные реализации таких эмуляторов:

  1. Драйверы-эмуляторы 1С: Например, "1С-Рарус" предлагает "Драйвер эмулятора эквайринг-терминала", соответствующий стандарту "1С:Совместимо". Такие эмуляторы позволяют имитировать работу реального терминала, что идеально подходит для проверки нашего кода.
  2. Комплексные эмуляторы ККТ и ЭТ: Некоторые разработчики предлагают эмуляторы, совмещающие функции контрольно-кассовой техники и эквайринговых операций, поддерживающие тонкий и веб-клиент, а также различные операционные системы.

Подключите эмулятор как стандартное подключаемое оборудование в 1С (через справочник ПодключаемоеОборудование) и выполните следующие сценарии:

  1. Полная оплата картой: Проверьте, что при выборе "Оплатить картой" на всю сумму чека, форма авторизации не появляется, и чек пробивается автоматически.
  2. Частичная оплата картой: Убедитесь, что при попытке оплатить часть суммы картой, форма сложной оплаты и авторизации открывается корректно.
  3. Смешанная оплата: Протестируйте сценарии, когда часть суммы оплачивается наличными, а часть картой.
  4. Ручной ввод данных терминала (без подключения): Проверьте, что если в настройках эквайрингового терминала установлен флаг "Использовать без подключения оборудования", форма авторизации все равно открывается, позволяя кассиру вручную ввести данные.
  5. Неподключенный терминал: Инициируйте оплату картой, когда эквайринговый терминал физически не подключен или находится в неактивном состоянии. Система должна вывести соответствующее сообщение об ошибке.
  6. Клиент с настройками электронного чека: Если у клиента указан e-mail или номер телефона для отправки электронного чека, убедитесь, что система корректно обрабатывает этот сценарий и не печатает лишний физический чек (если это не требуется).

Важные аспекты и рекомендации

  1. Использование расширений: Всегда выполняйте доработки через расширения. Это обеспечит бесшовное обновление конфигурации и упростит дальнейшую поддержку системы.
  2. Совместимость с обновлениями: При обновлении конфигурации всегда проверяйте актуальность и работоспособность вашего расширения, особенно если 1С внесла изменения в затрагиваемые нами модули.
  3. Механизм сложной оплаты: Помните, что вы влияете на часть кода, связанную со сложной оплатой. Тщательно тестируйте все возможные сценарии, чтобы не нарушить существующую функциональность.
  4. Документирование: Обязательно документируйте все внесенные изменения, включая описание логики, места изменений и причин их внесения.
  5. Обучение пользователей: Проведите обучение кассиров по новой процедуре оплаты, чтобы они понимали, как работает автоматизация и в каких случаях им все же придется взаимодействовать с формами.

Реализация такого функционала существенно повышает эффективность работы кассиров, сокращает время обслуживания клиентов и минимизирует вероятность ошибок, связанных с лишними нажатиями. Следуя изложенным шагам, вы сможете успешно автоматизировать процесс пробития чеков после эквайринговых операций в ваших системах 1С:УТ 11.4 и 1С:КА 2.4.

← На главную