При совместной работе фискальных регистраторов семейства Атол (например, Атол 55Ф, 30Ф, 11Ф) и устаревших конфигураций на платформе 1С (в частности, 1С:Розница 1.0) пользователи часто сталкиваются с критической ошибкой. При пробитии чека со ставкой "Без НДС" касса упорно отправляет в ОФД и печатает на чеке налог 10%. Кроме того, при оформлении возвратов касса часто отказывается печатать физический чек возврата прихода. Рассмотрим подробнее, почему возникают эти проблемы и как их решить по шагам.
---
Для начала разберем природу возникновения ошибки с налогами. Проблема кроется в несоответствии внутренней структуры драйвера Атол и алгоритмов формирования XML-пакета в старых конфигурациях 1С. В современных версиях прошивок ККТ (Платформа 5.0) и под требования форматов фискальных данных (ФФД 1.05 и 1.2) производитель полностью реорганизовал таблицу налоговых ставок внутри самой кассы.
Давайте сопоставим актуальную внутреннюю таблицу налогов драйверов Атол:
Конфигурация 1С:Розница 1.0 разрабатывалась в то время, когда под индексом 1 передавался признак "Без НДС". Отправляя старый индекс в драйвер ККТ через XML-структуру или напрямую через свойства общего драйвера, программа заставляет современную кассу применять актуальную ставку под номером 1, которой сейчас является 10% НДС.
---
Если у нас нет возможности оперативно программировать или обновлять конфигурацию 1С, мы можем решить проблему на уровне настроек самой кассы. Проанализируем этот метод.
По умолчанию 1С:Розница 1.0 отправляет все продажи по первой секции (Секция 1). Мы можем принудительно закрепить за этой секцией конкретный налог в памяти ККТ. Разберем шаги:
После этой настройки при попытке пробить товар через первую секцию касса автоматически применит ставку "Без НДС", игнорируя неверный индекс, приходящий из устаревшей программы.
---
Более надежным и гибким решением является исправление кода во внешней обработке обслуживания ККТ (обычно это обработки семейства ATOLKKT.epf или специализированные обработки под требования ФЗ-54). Посмотрим на пример реализации логики подмены налоговых ставок непосредственно перед отправкой XML-пакета в драйвер.
Нам необходимо найти в модуле обработки функцию, отвечающую за подготовку XML для ККТ (например, ПолучитьПакетДокумента или СформироватьXMLПакет). Проанализируем пример кода, выполняющего переопределение индексов:
Функция СформироватьXMLДляФискализации(ОбъектДрайвера, ТаблицаТоваров) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Receipt");
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Row");
ЗаписьXML.ЗаписатьАтрибут("Name", СтрокаТовара.Наименование);
ЗаписьXML.ЗаписатьАтрибут("Price", Строка(СтрокаТовара.Цена));
ЗаписьXML.ЗаписатьАтрибут("Quantity", Строка(СтрокаТовара.Количество));
// Корректируем индекс налога под новые прошивки Атол Платформа 5.0
Если СтрокаТовара.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
ИндексНалога = "5"; // В современных прошивках 5 - это "Без НДС"
ИначеЕсли СтрокаТовара.СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
ИндексНалога = "1"; // НДС 10%
ИначеЕсли СтрокаТовара.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
ИндексНалога = "2"; // НДС 20%
Иначе
ИндексНалога = "5"; // Значение по умолчанию
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("TaxVariant", ИндексНалога);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Конец элемента Row
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Конец элемента Receipt
Возврат ЗаписьXML.Закрыть();
КонецФункции
Использование этого кода позволяет полностью автоматизировать процесс распределения ставок НДС, исключая необходимость ручной настройки внутренних таблиц кассового аппарата.
---
Теперь детально разберем проблему с возвратами товаров. По закону 54-ФЗ при возврате товара клиенту кассир обязан пробить фискальный документ с признаком расчета "Возврат прихода". Однако в 1С:Розница 1.0 этот процесс часто не завершается печатью физического чека на кассе. Выясним три основные причины этой проблемы.
В устаревшей конфигурации Розница 1.0 логика работы разделена на два сценария:
Возврат товаров от покупателя. В типовой схеме этот документ делает проводки в базе данных и формирует Расходный кассовый ордер (РКО) для выдачи денег. Однако типовая конфигурация Розница 1.0 из этого документа по умолчанию вообще не отправляет команду печати на фискальный регистратор. В результате деньги списываются по учету, но чек ККТ не печатается.Если покупка была совершена по безналичному расчету, при попытке оформить возврат программа пытается передать тип оплаты "Электронными" (безналичными). В старых версиях обработки обслуживания индекс безналичной оплаты может передаваться некорректно, из-за чего ККТ блокирует печать чека возврата и возвращает ошибку, которую 1С "молча" игнорирует, просто проводя документ в своей базе данных.
---
Чтобы заставить кассу печатать чеки возврата при проведении документов за прошлые смены, нам необходимо доработать модуль внешней обработки обслуживания или форму документа возврата, добавив вызов функций фискализации.
Посмотрим на пример кода, реализующий процедуру фискализации чека возврата через объект драйвера Атол:
Процедура НапечататьФискальныйЧекВозврата(ОбъектДрайвера, ДокументСсылка) Экспорт
// Инициализируем подключение к кассе
ОбъектДрайвера.DeviceEnabled = Истина;
// Открываем чек возврата прихода (Тип чека 2 означает "Возврат прихода")
ОбъектДрайвера.ReceiptType = 2;
РезультатОткрытия = ОбъектДрайвера.OpenReceipt();
Если РезультатОткрытия <> 0 Тогда
ВызватьИсключение "Не удалось открыть чек возврата на ККТ!";
КонецЕсли;
// Перебираем табличную часть товаров для регистрации на ККТ
Для Каждого СтрокаТовара Из ДокументСсылка.Товары Цикл
ОбъектДрайвера.Name = СтрокаТовара.Номенклатура.Наименование;
ОбъектДрайвера.Price = СтрокаТовара.Цена;
ОбъектДрайвера.Quantity = СтрокаТовара.Количество;
ОбъектДрайвера.Department = 1; // Номер секции
// Устанавливаем правильную ставку налога (5 - Без НДС)
ОбъектДрайвера.TaxNumber = 5;
// Регистрируем позицию в чеке
ОбъектДрайвера.Registration();
КонецЦикла;
// Указываем тип закрытия чека
// 0 - Наличные, 1 - Безналичные (Электронные)
Если ДокументСсылка.ВидОплаты = Перечисления.ВидыОплат.Безналичные Тогда
ОбъектДрайвера.TypeClose = 1;
Иначе
ОбъектДрайвера.TypeClose = 0;
КонецЕсли;
// Финализируем и закрываем чек на кассе
ОбъектДрайвера.CloseReceipt();
ОбъектДрайвера.DeviceEnabled = Ложь;
КонецПроцедуры
Важное примечание: Никогда не пытайтесь заменить чек возврата прихода "Чеком коррекции". По требованиям ФНС, чек коррекции формируется исключительно для исправления ошибок ведения учета (например, при выявлении излишков денежных средств или при работе без применения ККТ). Обычный возврат товаров от физического лица всегда должен сопровождаться операцией "Возврат прихода".
---
Подводя итоги, для полного устранения всех неполадок при интеграции Атол 55Ф и 1С:Розница 1.0 рекомендуется выполнить следующий комплекс мер: