При интеграции кассового оборудования АТОЛ с программными продуктами на базе 1С программисты часто сталкиваются с необходимостью корректного заполнения фискальных признаков. Одним из важнейших реквизитов является тег 1212 — «Признак предмета расчета». По умолчанию драйвер часто подставляет значение «товар», однако для корректной отчетности перед налоговой (ФНС) необходимо четко разделять товары, услуги, работы и другие типы номенклатуры. Разберем подробно, как это реализовать в десятой версии драйвера.
Прежде чем переходить к коду, проанализируем, какие значения может принимать тег 1212. В зависимости от версии формата фискальных данных (ФФД), список доступных вариантов может расширяться. Рассмотрим основные значения, которые используются в Atol Driver 10:
Для услуги нам необходимо передать значение 4. Если мы проигнорируем этот параметр, касса напечатает «ТОВАР», что может привести к штрафам при проверке целевого использования кассы или нецелевых оборотов, если ваша организация занимается исключительно услугами.
Рассмотрим пример кода, который часто используют разработчики для быстрой настройки. В этом случае мы обращаемся напрямую к номеру тега 1212. Хотя этот способ рабочий, мы рекомендуем использовать именованные константы (см. Способ 2), но сначала разберем базовый синтаксис.
Проанализируем фрагмент кода для регистрации позиции:
// Создаем объект драйвера и подключаемся к ККТ
// ... (инициализация fptr)
// Указываем параметры позиции
fptr.setParam(fptr.LIBFPTR_PARAM_COMMODITY_NAME, "Консультационные услуги");
fptr.setParam(fptr.LIBFPTR_PARAM_PRICE, 1500.00);
fptr.setParam(fptr.LIBFPTR_PARAM_QUANTITY, 1.0);
// Установка признака предмета расчета (Тег 1212)
// Значение 4 соответствует услуге
fptr.setParam(1212, 4);
// Установка налоговой ставки (например, без НДС)
fptr.setParam(fptr.LIBFPTR_PARAM_TAX_TYPE, fptr.LIBFPTR_TAX_NO);
// Выполняем регистрацию позиции в чеке
fptr.registration();
В данном примере функция setParam(1212, 4) жестко привязывает позицию к типу «Услуга». Важно вызывать этот метод до вызова registration(), иначе параметры не применятся к текущей строке чека.
Современные стандарты разработки в 1С диктуют отказ от «магических чисел» в пользу читаемого кода. В драйвере АТОЛ 10 предусмотрены именованные константы, которые делают код понятным любому другому разработчику. Рассмотрим, как переписать ту же задачу более правильно.
Вместо числа 1212 используем fptr.LIBFPTR_PARAM_PAYMENT_OBJECT, а вместо значения 4 используем fptr.LIBFPTR_PV_SERVICE.
// Правильная регистрация услуги через константы драйвера
fptr.setParam(fptr.LIBFPTR_PARAM_COMMODITY_NAME, "Медицинская процедура");
fptr.setParam(fptr.LIBFPTR_PARAM_PRICE, 2000.00);
fptr.setParam(fptr.LIBFPTR_PARAM_QUANTITY, 1);
// Используем константу параметра и константу значения
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_OBJECT, fptr.LIBFPTR_PV_SERVICE);
// Регистрация
fptr.registration();
Такой подход защищает нас от ошибок, если в будущих версиях ФФД или драйвера внутренняя структура тегов изменится. Кроме того, Atol Driver 10 автоматически сопоставит константу LIBFPTR_PV_SERVICE с нужным кодом в зависимости от того, какая модель кассы и какая версия прошивки используется.
Выясним, насколько обязательно передавать этот тег. Ситуация зависит от формата фискальных данных, на котором работает ваша касса:
Особое внимание стоит уделить новым кодам в ФФД 1.2 для маркированных товаров (коды 30-33). Если вы продаете услуги, связанные с маркировкой, или работаете в сфере медицины, следите за актуальностью прошивки ККТ, так как старые прошивки могут не знать новых значений параметров.
Драйвер десятой серии активно поддерживает работу через JSON-задания. Это избавляет от необходимости вызывать setParam десятки раз. В структуре JSON признак предмета расчета указывается строковым идентификатором.
Рассмотрим пример формирования структуры JSON для услуги:
{
"type": "position",
"name": "Аренда помещения",
"price": 5000.0,
"quantity": 1.0,
"amount": 5000.0,
"paymentMethod": "fullPayment",
"paymentObject": "service",
"tax": {
"type": "vat20"
}
}
В поле paymentObject мы просто пишем "service". Драйвер сам преобразует это в код 4 и передаст в кассу под тегом 1212. Это наиболее современный и удобный способ интеграции, особенно при работе через веб-сервисы или при формировании сложных чеков с большим количеством позиций.
Важно не путать предмет (что продаем) и способ (как платим). За «услугу» клиент может внести аванс. В этом случае в чеке должны быть заполнены оба тега:
service (4).advance (аванс) или prepaymentFull (полная предоплата).Проанализируем ситуацию: если вы регистрируете услугу как аванс, вызов в коде будет выглядеть так:
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_OBJECT, fptr.LIBFPTR_PV_SERVICE);
fptr.setParam(fptr.LIBFPTR_PARAM_PAYMENT_METHOD, fptr.LIBFPTR_PM_PREPAYMENT_FULL);
fptr.registration();
Правильное сочетание этих реквизитов гарантирует отсутствие претензий со стороны налоговой инспекции и корректное отражение выручки в учете.