Реализация работы с контрольно-кассовой техникой (ККТ) в нестандартной или самописной конфигурации — задача комплексная. Она требует не только знания программного кода, но и понимания актуальных требований 54-ФЗ и форматов фискальных данных (ФФД). В этой статье мы подробно разберем, как организовать логику взаимодействия с кассой, какие данные передавать и как правильно обрабатывать типовые операции.
Первый вопрос, который возникает у разработчика: как программно управлять сменой? Рассмотрим основные правила:
При формировании чека важно передать правильный набор тегов. Разберем, что именно должна отправлять ваша программа в драйвер ККТ:
Наименование, Цена, Количество и СтавкаНДС. Обратите внимание, что итоговая сумма по строке часто рассчитывается самой кассой, поэтому важно передавать цену уже с учетом всех ваших внутренних скидок.Посмотрим на пример логики формирования чека (на языке 1С):
// Пример упрощенной логики добавления позиции в чек
Драйвер.Name = Товар.Наименование;
Драйвер.Price = Товар.ЦенаСоСкидкой;
Драйвер.Quantity = Строка.Количество;
Драйвер.TaxSide = ПолучитьСтавкуНДС(Товар.СтавкаНДС); // Преобразование в индекс налога кассы
Драйвер.Registration();
Выясним причину путаницы между этими операциями. Выбор зависит от ситуации:
Важный нюанс: При возврате касса контролирует наличие наличности. Если вы делаете возврат наличными в начале смены, когда в кассе «ноль», ККТ выдаст ошибку. В этом случае в программе нужно реализовать операцию «Внесение денег», прежде чем бить возврат.
Рассмотрим, стоит ли связывать терминал оплаты картами с 1С. Основной профит — исключение человеческого фактора. Если терминал автономен, кассир может ошибиться и ввести на нем одну сумму, а в 1С (и в фискальном чеке) — другую. При интеграции схема выглядит так:
Это гарантирует, что выручка в банковской выписке совпадет с данными ОФД.
Проанализируем техническую сторону. В самописных решениях чаще всего используется прямое обращение к COM-объекту драйвера (например, AddIn.FPrnM45 для Атола). Пошагово процесс выглядит следующим образом:
DeviceEnabled = 1 для активации связи.OpenCheck().CloseCheck() с передачей типа оплаты.Обратите внимание на хранение данных. Рекомендуется сохранять в документе оплаты не только внутренний номер 1С, но и Номер чека, полученный от ККТ, а также Номер ФД (фискального документа). Это поможет быстро найти чек в личном кабинете ОФД, если покупатель потеряет бумажный вариант.
Если ваша отрасль предполагает работу с маркированным товаром (одежда, обувь, духи и т.д.), сложность реализации возрастает. Вам необходимо:
Даже если сейчас вы не торгуете маркировкой, структуру кода лучше закладывать с учетом расширения. Например, предусмотрите поле для передачи ИНН и наименования покупателя — это обязательно при расчетах между организациями (B2B) наличными или картой.
Подводя итог, реализация работы с ККТ «с нуля» — это отличный способ сделать систему максимально быстрой и удобной для конкретного бизнеса. Главное — следовать логике драйвера и не забывать про обязательные фискальные теги, установленные законом.