Как реализовать оплату банковской картой в 1С 7.7 на новых онлайн-кассах?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При переходе на новые онлайн-кассы (соответствующие 54-ФЗ) пользователи старых систем на базе 1С:Предприятие 7.7 часто сталкиваются с проблемой: при пробитии чека вся сумма по умолчанию уходит как «наличные». Это происходит потому, что типовые конфигурации (например, «Торговля и Склад 9.2») и старые обработки обслуживания не обучены разделять потоки денежных средств. В этой статье мы подробно разберем, как модифицировать код, чтобы ККМ корректно регистрировала безналичную оплату.

Причина возникновения проблемы

В современных фискальных регистраторах существует несколько типов оплаты (секций или способов расчета). Обычно это: 0 — Наличные, 1 — Безналичные (электронные). В старых драйверах и обработках 1С 7.7 по умолчанию вызывается метод закрытия чека, который передает всю сумму в первый тип оплаты. Чтобы изменить это поведение, необходимо вмешаться в код обработки обслуживания или в модуль документа ЧекККМ.

Решение 1: Простая модификация обработки обслуживания

Рассмотрим ситуацию, когда нам нужно быстро добавить выбор типа оплаты перед самой печатью чека. Проанализируем способ, при котором кассиру задается вопрос о способе оплаты непосредственно в момент фискализации. Для этого в обработке обслуживания (файл с расширением .ert) найдем процедуру ПечататьЧек и добавим следующую логику:


ОплатаБезнал = 0;
ПолученоНалом = СуммаЧека;

// Спрашиваем кассира о типе оплаты
Если Вопрос("Оплата БЕЗНАЛИЧНЫМИ?", "Да+Нет") = "Да" Тогда
    ОплатаБезнал = СуммаЧека;
    ПолученоНалом = 0;
КонецЕсли;

// Передаем данные в объект драйвера ККМ
Объект.Summ1 = ПолученоНалом; // Секция наличных
Объект.Summ2 = ОплатаБезнал;   // Секция безналичных
Объект.Summ3 = 0;
Объект.Summ4 = 0;

Здесь Объект — это экземпляр драйвера ККМ (например, АТОЛ или Штрих-М). Свойства Summ1 и Summ2 отвечают за распределение суммы по типам оплат. В новых прошивках ККТ именно Summ2 чаще всего соответствует электронным средствам платежа.

Решение 2: Реализация смешанной оплаты (Наличные + Карта)

В некоторых случаях покупатель хочет оплатить часть покупки наличными, а часть — картой. Для этого нам потребуется более сложная форма ввода данных. Разберем алгоритм, который позволяет гибко распределять суммы:

  1. Создаем переменные ОплатаНал и ОплатаБезнал.
  2. Используем функцию ВвестиЧисло для получения данных от пользователя.
  3. Проверяем, чтобы сумма введенных значений была равна итогу чека.

Рассмотрим пример кода для реализации этой логики:


~ОшибкаВводаСумм;
ОплатаНал = 0;
ОплатаБезнал = 0;

Если ВвестиЧисло(ОплатаНал, "Введите сумму НАЛИЧНЫМИ. Всего по чеку: " + СуммаЧека) = 1 Тогда
    ОплатаБезнал = СуммаЧека - ОплатаНал;
    Если ОплатаБезнал < 0 Тогда
        Предупреждение("Сумма наличных превышает сумму чека!");
        Перейти ~ОшибкаВводаСумм;
    КонецЕсли;
КонецЕсли;

Сообщить("Распределение: Нал = " + ОплатаНал + ", Безнал = " + ОплатаБезнал);

// Передача в драйвер (пример для АТОЛ)
Если ОплатаНал <> 0 Тогда
    Объект.Summ1 = ОплатаНал;
КонецЕсли;

Если ОплатаБезнал <> 0 Тогда
    Объект.Summ2 = ОплатаБезнал;
КонецЕсли;

Решение 3: Низкоуровневая работа с драйвером АТОЛ (TypeClose)

Для программистов, работающих напрямую с объектом драйвера (например, через ECR.AddIn), важно правильно управлять параметром TypeClose. Проанализируем ситуацию на примере драйвера АТОЛ 8-й или 10-й версии. В новых прошивках индекс типа оплаты «Платежная карта» часто соответствует значению 5 или 1.


// Пример для интеграции в самописную конфигурацию
ИтогЧека = ТЧ.Итог("Сумма");

Если СпособОплаты = "Карта" Тогда
    // В новых прошивках TypeClose = 1 или 5 (зависит от настроек таблиц ККТ)
    ECR.TypeClose = 5; 
    ECR.Summ = ИтогЧека;
    ECR.Payment();
    Если ECR.CloseCheck() <> 0 Тогда
        Сообщить("Ошибка при закрытии чека по карте: " + ECR.ResultDescription);
    КонецЕсли;
Иначе
    ECR.TypeClose = 0; // Наличные
    ECR.Summ = ИтогЧека;
    ECR.Payment();
    ECR.CloseCheck();
КонецЕсли;

Важно помнить, что если вы используете метод Delivery() для расчета сдачи, он работает только с наличным типом оплаты. При оплате картой сдача не предусмотрена законодательством.

Интеграция с банковским терминалом

Для исключения ошибок кассира (когда в 1С нажали «Карта», а по терминалу оплата не прошла) рекомендуется интегрировать банковское ПО (например, Сбербанк sbrf.dll) напрямую в 1С. Посмотрим на логику взаимодействия:

  1. Программа обращается к компоненте терминала и передает сумму.
  2. Терминал ожидает прикладывания карты.
  3. В случае успешного ответа (код 00) 1С получает подтверждение.
  4. Только после подтверждения от банка вызывается команда печати фискального чека на ККМ.

Пример вызова внешней компоненты Сбербанка:


Попытка
    ЗагрузитьВнешнююКомпоненту("SberBank.dll");
    Терминал = СоздатьОбъект("SberBank.Terminal");
Исключение
    Предупреждение("Компонента банка не найдена!");
КонецПопытки;

Результат = Терминал.Оплатить(СуммаЧека);
Если Результат = 0 Тогда
    // Только теперь вызываем процедуру печати чека на ККМ с типом "Безнал"
    ПечатьЧекаНаККМ("Безналичные");
Иначе
    Предупреждение("Оплата по карте отклонена банком!");
КонецЕсли;

Отражение в учете и закрытие смены

Просто пробить чек — недостаточно. Выясним, как данные должны попасть в учетную систему. В документе ЧекККМ необходимо добавить новый реквизит ВидОплаты (перечисление с типами «Наличные» и «Безналичные»).

При выполнении обработки «Закрытие кассовой смены», которая формирует документ ОтчетККМ, необходимо модифицировать алгоритм сбора данных. Суммы по безналичным чекам не должны увеличивать остаток в кассе (счет 50), а должны отражаться как «Продажи по платежным картам» (счет 57). Это позволит бухгалтерии в дальнейшем корректно разносить банковскую выписку и учитывать комиссию банка-эквайера.

Заключение

Реализация оплаты картой в 1С 7.7 требует комплексного подхода: от изменения визуального интерфейса документа ЧекККМ до глубокой правки логики взаимодействия с драйвером торгового оборудования. Основным моментом является передача правильного индекса типа оплаты в свойства Summ2 или TypeClose объекта ККМ. Помните, что перед внесением изменений на рабочем месте крайне важно проверить работу кода на тестовом фискальном регистраторе или в режиме эмулятора, чтобы избежать порчи фискальных документов.

← На главную