При переходе на новые онлайн-кассы (соответствующие 54-ФЗ) пользователи старых систем на базе 1С:Предприятие 7.7 часто сталкиваются с проблемой: при пробитии чека вся сумма по умолчанию уходит как «наличные». Это происходит потому, что типовые конфигурации (например, «Торговля и Склад 9.2») и старые обработки обслуживания не обучены разделять потоки денежных средств. В этой статье мы подробно разберем, как модифицировать код, чтобы ККМ корректно регистрировала безналичную оплату.
В современных фискальных регистраторах существует несколько типов оплаты (секций или способов расчета). Обычно это: 0 — Наличные, 1 — Безналичные (электронные). В старых драйверах и обработках 1С 7.7 по умолчанию вызывается метод закрытия чека, который передает всю сумму в первый тип оплаты. Чтобы изменить это поведение, необходимо вмешаться в код обработки обслуживания или в модуль документа ЧекККМ.
Рассмотрим ситуацию, когда нам нужно быстро добавить выбор типа оплаты перед самой печатью чека. Проанализируем способ, при котором кассиру задается вопрос о способе оплаты непосредственно в момент фискализации. Для этого в обработке обслуживания (файл с расширением .ert) найдем процедуру ПечататьЧек и добавим следующую логику:
ОплатаБезнал = 0;
ПолученоНалом = СуммаЧека;
// Спрашиваем кассира о типе оплаты
Если Вопрос("Оплата БЕЗНАЛИЧНЫМИ?", "Да+Нет") = "Да" Тогда
ОплатаБезнал = СуммаЧека;
ПолученоНалом = 0;
КонецЕсли;
// Передаем данные в объект драйвера ККМ
Объект.Summ1 = ПолученоНалом; // Секция наличных
Объект.Summ2 = ОплатаБезнал; // Секция безналичных
Объект.Summ3 = 0;
Объект.Summ4 = 0;
Здесь Объект — это экземпляр драйвера ККМ (например, АТОЛ или Штрих-М). Свойства Summ1 и Summ2 отвечают за распределение суммы по типам оплат. В новых прошивках ККТ именно Summ2 чаще всего соответствует электронным средствам платежа.
В некоторых случаях покупатель хочет оплатить часть покупки наличными, а часть — картой. Для этого нам потребуется более сложная форма ввода данных. Разберем алгоритм, который позволяет гибко распределять суммы:
ОплатаНал и ОплатаБезнал.ВвестиЧисло для получения данных от пользователя.Рассмотрим пример кода для реализации этой логики:
~ОшибкаВводаСумм;
ОплатаНал = 0;
ОплатаБезнал = 0;
Если ВвестиЧисло(ОплатаНал, "Введите сумму НАЛИЧНЫМИ. Всего по чеку: " + СуммаЧека) = 1 Тогда
ОплатаБезнал = СуммаЧека - ОплатаНал;
Если ОплатаБезнал < 0 Тогда
Предупреждение("Сумма наличных превышает сумму чека!");
Перейти ~ОшибкаВводаСумм;
КонецЕсли;
КонецЕсли;
Сообщить("Распределение: Нал = " + ОплатаНал + ", Безнал = " + ОплатаБезнал);
// Передача в драйвер (пример для АТОЛ)
Если ОплатаНал <> 0 Тогда
Объект.Summ1 = ОплатаНал;
КонецЕсли;
Если ОплатаБезнал <> 0 Тогда
Объект.Summ2 = ОплатаБезнал;
КонецЕсли;
Для программистов, работающих напрямую с объектом драйвера (например, через 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С. Посмотрим на логику взаимодействия:
Пример вызова внешней компоненты Сбербанка:
Попытка
ЗагрузитьВнешнююКомпоненту("SberBank.dll");
Терминал = СоздатьОбъект("SberBank.Terminal");
Исключение
Предупреждение("Компонента банка не найдена!");
КонецПопытки;
Результат = Терминал.Оплатить(СуммаЧека);
Если Результат = 0 Тогда
// Только теперь вызываем процедуру печати чека на ККМ с типом "Безнал"
ПечатьЧекаНаККМ("Безналичные");
Иначе
Предупреждение("Оплата по карте отклонена банком!");
КонецЕсли;
Просто пробить чек — недостаточно. Выясним, как данные должны попасть в учетную систему. В документе ЧекККМ необходимо добавить новый реквизит ВидОплаты (перечисление с типами «Наличные» и «Безналичные»).
При выполнении обработки «Закрытие кассовой смены», которая формирует документ ОтчетККМ, необходимо модифицировать алгоритм сбора данных. Суммы по безналичным чекам не должны увеличивать остаток в кассе (счет 50), а должны отражаться как «Продажи по платежным картам» (счет 57). Это позволит бухгалтерии в дальнейшем корректно разносить банковскую выписку и учитывать комиссию банка-эквайера.
Реализация оплаты картой в 1С 7.7 требует комплексного подхода: от изменения визуального интерфейса документа ЧекККМ до глубокой правки логики взаимодействия с драйвером торгового оборудования. Основным моментом является передача правильного индекса типа оплаты в свойства Summ2 или TypeClose объекта ККМ. Помните, что перед внесением изменений на рабочем месте крайне важно проверить работу кода на тестовом фискальном регистраторе или в режиме эмулятора, чтобы избежать порчи фискальных документов.