Как адаптировать 1С 7.7 для работы с ККТ АТОЛ по ФФД 1.0.5

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

Перевод старых конфигураций 1С 7.7 на работу с онлайн-кассами по стандарту ФФД 1.0.5 — задача нетривиальная. Она требует не только знания встроенного языка 1С, но и понимания протоколов работы драйверов АТОЛ (как 8-й, так и 10-й версии). В рамках этой статьи мы подробно разберем, как реализовать основные операции: от простой продажи до сложных схем с авансами, кредитами и бонусами.

Регистрация позиций в чеке по стандарту ФФД 1.0.5

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


// Пример регистрации позиции товара
ОбъектECR.BeginItem();
ОбъектECR.ItemType = 1; // Тип предмета расчета: 1 - Товар, 4 - Услуга
ОбъектECR.PaymentMode = 4; // Признак способа расчета: 4 - Полный расчет
ОбъектECR.Name = "Наименование товара";
ОбъектECR.Price = 100.00;
ОбъектECR.Quantity = 1;
ОбъектECR.Summ = 100.00;
ОбъектECR.TaxType = 3; // Код ставки НДС
ОбъектECR.EndItem();

Проанализируем этот код. Методы BeginItem() и EndItem() создают контекст товарной позиции. Внутри этого блока мы передаем Признак предмета расчета (тег 1212) и Признак способа расчета (тег 1214). Без этих параметров чек может быть признан некорректным с точки зрения ФНС.

Получение данных после пробития чека (номер ФД и ФП)

Часто после успешной печати чека нам необходимо сохранить в информационной базе 1С фискальные признаки документа: номер чека, номер смены и фискальный признак (ФПД). Посмотрим, как это реализовать сразу после вызова метода CloseCheck():


ОбъектECR.CloseCheck();
// Получаем фискальные данные последнего документа
ОбъектECR.RegisterNumber = 51; // Регистр для получения номера чека
ОбъектECR.GetRegister();
НомерЧека = ОбъектECR.НомерДокумента;
НомерФД = ОбъектECR.FiscalDocumentNumber; // Фискальный номер документа
ФискальныйПризнак = ОбъектECR.FiscalDocumentSign; // ФП/ФПД
НомерСмены = ОбъектECR.SessionNumber;
СуммаЧека = ОбъектECR.Summ;

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

Реализация комбинированной оплаты (Наличные, Карта, Кредит, Аванс)

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


// Допустим, общая сумма чека 1000 рублей
// 1. Оплата наличными (Тип 0)
ОбъектECR.TypeClose = 0;
ОбъектECR.Summ = 100.00;
ОбъектECR.Payment();

// 2. Оплата банковской картой (Тип 1)
ОбъектECR.TypeClose = 1;
ОбъектECR.Summ = 200.00;
ОбъектECR.Payment();

// 3. Зачет аванса/предоплаты (Тип 2)
ОбъектECR.TypeClose = 2;
ОбъектECR.Summ = 300.00;
ОбъектECR.Payment();

// 4. Последующая оплата (Кредит) (Тип 3)
ОбъектECR.TypeClose = 3;
ОбъектECR.Summ = 400.00;
ОбъектECR.Payment();

// Закрываем чек только после того, как сумма всех Payment() сравнялась с суммой позиций
ОбъектECR.CloseCheck();

Выясним причину, почему важно соблюдать типы закрытия (TypeClose). Согласно протоколам АТОЛ, типы с 0 по 3 жестко зарезервированы. Если вы используете бонусы как отдельный вид оплаты (а не как скидку), рекомендуется использовать тип оплаты 4 (Встречное предоставление) или настраивать дополнительные типы в таблицах ККТ.

Работа с системой налогообложения (СНО)

Если на одном аппарате используется несколько систем налогообложения (например, УСН для товаров и Патент для услуг), необходимо программно переключать СНО перед открытием чека. В драйверах АТОЛ для этого используется запись атрибута 1055. Рассмотрим пример настройки:


// Установка СНО через атрибуты (тег 1055)
ОбъектECR.AttrNumber = 1055;
// 1 - ОСН, 2 - УСН Доход, 4 - УСН Доход-Расход, 8 - ЕНВД, 16 - ЕСХН, 32 - Патент
ОбъектECR.AttrValue = 4; 
ОбъектECR.WriteAttribute();

// Альтернативный вариант через свойство TaxVariant (зависит от версии драйвера)
ОбъектECR.TaxVariant = 2; // Соответствует УСН Доход-Расход в некоторых версиях

Помните, что один чек не может содержать позиции с разными СНО. Если в одной корзине покупателя оказались товары по разным системам, необходимо формировать и пробивать два отдельных чека.

Бонусы и продажа по нулевой цене

Проанализируем ситуацию с бонусными программами. Законодательство ФФД 1.0.5 и требования ФНС запрещают продажу товара с ценой 0 рублей. Если вы хотите выдать подарок или оплатить товар бонусами на 100%, у вас есть два пути:

  1. Скидка 99%: Установить цену товара в 1 копейку или 1 рубль. Это самый безопасный способ с точки зрения ККТ, так как он гарантирует ненулевой итог чека.
  2. Нефискальная печать: Использовать метод PrintString() для вывода информации о бонусах в текстовом виде, не влияющем на фискальный итог, при этом в самом чеке позиция проходит по цене за вычетом скидки.

Пример вывода информации о бонусах:


ОбъектECR.Caption = "--- Бонусы по программе лояльности ---";
ОбъектECR.PrintString();
ОбъектECR.Caption = "Списано бонусов: 500";
ОбъектECR.PrintString();
ОбъектECR.Caption = "Остаток на карте: 120";
ОбъектECR.PrintString();

Аннулирование и отмена чека

Важно различать понятия. Если чек еще не закрыт командой CloseCheck(), его можно аннулировать (команда CancelCheck()). Это просто прерывает текущую операцию без записи в фискальную память. Если же чек уже пробит и закрыт, исправить его можно только через операцию Возврат прихода. Метод Storno() в современных реалиях используется редко и в основном служит для удаления ошибочно введенной позиции внутри еще открытого чека.

Рекомендации по отладке

При работе "с чистого листа" в 1С 7.7 мы рекомендуем всегда проверять лог-файл драйвера АТОЛ. Обычно он называется FPrnM1C.log. В нем детально фиксируются все команды, передаваемые из 1С, и ответы кассового аппарата. Если метод CloseCheck() возвращает ошибку, лог покажет, какой именно параметр (сумма, налог или атрибут) стал причиной отказа ККТ принимать документ.

← На главную