В современной торговле часто возникают ситуации, когда покупатель хочет оплатить покупку частично наличными, а остаток — банковской картой или бонусами. При интеграции 1С с контрольно-кассовой техникой (ККТ) Атол программисты часто сталкиваются с вопросом: как правильно передать информацию о нескольких типах оплаты в один фискальный документ. Рассмотрим подробно, как это реализуется в различных версиях драйверов Атол и какие нюансы необходимо учитывать.
Основная ошибка при разработке данного функционала заключается в попытке передать все типы оплат одним набором параметров перед закрытием чека. Важно понимать архитектуру работы драйвера ККТ: методы оплаты работают накопительно. Проанализируем правильный алгоритм действий:
Хотя драйвер 8-й версии (DTO 8) официально считается устаревшим, он все еще встречается в поддержке старых конфигураций 1С. Выясним причину, по которой простая перезапись свойств TypeClose и Summ не сработает.
Если мы просто присвоим значения свойствам несколько раз подряд, драйвер сохранит только последнее значение. Для фиксации каждого платежа необходимо вызывать метод Payment(). Рассмотрим корректный пример кода:
// Предположим, общая сумма чека 1000 рублей
// Оплата 500 рублей наличными
driver.TypeClose = 0; // 0 - Наличные
driver.Summ = 500.00;
driver.Payment(); // Регистрируем первый платеж
// Оплата 500 рублей безналичными (электронными)
driver.TypeClose = 1; // 1 - Электронными
driver.Summ = 500.00;
driver.Payment(); // Регистрируем второй платеж
// Финализация чека
driver.CloseCheck();
Важный момент: Если вызвать Payment() только один раз после всех присваиваний, касса выдаст ошибку "Сумма всех типов оплат меньше итога чека", так как она увидит только последние 500 рублей из 1000 необходимых.
На текущий момент компания Атол рекомендует использовать драйвер 10-й версии (AddIn.Fptr10). В этой версии работа строится на передаче параметров через метод setParam. Разберем по шагам, как реализовать комбинированную оплату в 10-м драйвере.
Посмотрим на пример логики для разделения платежа:
// 1. Регистрация наличного платежа
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_TYPE, fptr.LIBFPTR_PT_CASH);
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_SUM, 500.00);
fptr.payment();
// 2. Регистрация безналичного платежа
// Используем константу для безналичных средств
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_TYPE, fptr.LIBFPTR_PT_ELECTRONICALLY);
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_SUM, 500.00);
fptr.payment();
// 3. Закрытие чека
fptr.closeReceipt();
Преимущество 10-го драйвера заключается в более строгом контроле типов данных и поддержке всех современных требований ФФД (Формата фискальных данных).
Проанализируем доступные типы оплат, которые можно передать в ККТ. Согласно актуальным требованиям законодательства, их может быть больше двух:
Если ваша учетная система поддерживает списание бонусов как скидку, то сумма позиций в чеке просто уменьшается. Но если бонусы должны проходить как форма оплаты (согласно учетной политике), необходимо использовать тип оплаты 4.
Для интеграции с современными конфигурациями 1С рекомендуется использовать механизм JSON-заданий. Это наиболее надежный способ, так как он минимизирует количество вызовов драйвера и отправляет всю структуру чека одним пакетом. Выясним, как выглядит блок оплат в JSON-структуре:
"payments": [
{
"type": "cash",
"sum": 500.00
},
{
"type": "electronically",
"sum": 500.00
}
]
При использовании метода processJson драйвер сам последовательно выполнит необходимые команды payment() внутри ККТ, что исключает ошибки синхронизации между компьютером и кассовым аппаратом.
Разберем ситуацию, которая часто встречается при комбинированных оплатах — расхождение итогов. В ККТ Атол действует жесткое правило: сумма всех платежей должна быть не меньше суммы всех позиций товара.
Если сумма оплат превышает сумму товаров, касса обрабатывает это следующим образом:
Практический совет: При расчете комбинированного платежа в 1С всегда регистрируйте сначала безналичную часть (карту, бонусы) на точную сумму, а остаток закрывайте наличными. Это позволит избежать ошибок при копеечных расхождениях из-за округления, так как наличный платеж "примет" на себя возможную сдачу в 1 копейку.
Реализация нескольких типов оплат в одном чеке — стандартная задача для современного ритейла. Главное — помнить о последовательном вызове метода payment() для каждой части суммы и следить за тем, чтобы итоговая сумма платежей корректно покрывала стоимость товаров. Переход на 10-ю версию драйвера или использование JSON-заданий сделает вашу интеграцию более стабильной и соответствующей актуальным требованиям законодательства.