В розничной торговле часто возникает ситуация, когда одна торговая точка совмещает разные системы налогообложения (СНО). Классический пример — продажа автозапчастей на Патенте (ПСН, ранее — ЕНВД) и моторных масел на Упрощенной системе налогообложения (УСН) или Общей системе (ОСН). Поскольку моторные масла являются подакцизным товаром, торговать ими в рамках патента или единого налога на вмененный доход законодательно запрещено.
Согласно требованиям Федерального закона № 54-ФЗ, в одном кассовом чеке может быть указана только одна СНО. Попытка пробить товары разных налоговых режимов в одном документе приведет к нарушению законодательства и штрафам. Единственным технически и юридически верным решением является автоматическое разделение продажи на два отдельных чека в рамках одной сессии ККМ. Разберем по шагам, как настроить такое разделение в среде 1С:Предприятие 7.7.
Для того чтобы система понимала, к какой системе налогообложения относится конкретная позиция, нам необходимо добавить в базу признак разделения. Самый простой и надежный способ — внедрить новый реквизит в справочник товаров.
Выполним следующие действия в конфигураторе:
Номенклатура (или Товары, в зависимости от вашей конфигурации).ТоварУСНПосле сохранения конфигурации кассиру или администратору потребуется зайти в карточки подакцизных товаров (например, моторных масел) и установить данный флаг.
Перейдем к программной реализации в модуле документа (обычно это документ ЧекККМ или аналогичный ему документ розничной продажи). Нам необходимо доработать процедуру ПробитьЧекККМ().
Вместо отправки всей табличной части документа в один чек, мы организуем разделение товаров на две независимые таблицы значений: одну для УСН (товары с НДС), вторую — для Патента (без НДС). Затем поочередно отправим каждую таблицу на печать, если в ней есть хотя бы одна строка.
Рассмотрим подробнее реализацию этого механизма в коде:
Процедура ПробитьЧекККМ()
Перем НомерЧека;
Если Получено < Итог("Сумма") Тогда
Предупреждение("Не хватает средств для оплаты!");
Возврат;
КонецЕсли;
Если НомерЧекаККМ <> 0 Тогда
Предупреждение("Чек уже пробит на фискальном регистраторе!", 60);
Возврат;
ИначеЕсли глФРВкл = 0 Тогда
Предупреждение("Фискальный регистратор не подключен!", 60);
Возврат;
ИначеЕсли ПометкаУдаления() = 1 Тогда
Предупреждение("Документ помечен на удаление!", 60);
Возврат;
КонецЕсли;
// Определяем параметры по умолчанию из справочника ККМ
ЗначениеНДС_ПСН = 6; // БЕЗ НДС
ПУП_ПСН = 32; // Патентная система (ПСН)
ЗначениеНДС_УСН = 1; // НДС 18% (или 20% в зависимости от настроек драйвера)
ПУП_УСН = 2; // УСН Доход (или 4 для УСН Доход-Расход)
СпрККМ = СоздатьОбъект("Справочник.ККМ");
Кассир = "";
Если СпрККМ.НайтиПоРеквизиту("Компьютер", Компьютер.ТекущийЭлемент(), 1) = 1 Тогда
Если ПустоеЗначение(СпрККМ.КассирККМ.Получить(ДатаДок)) = 0 Тогда
ВыбКассир = СпрККМ.КассирККМ.Получить(ДатаДок);
Кассир = глФамилияИмяОтчество(ВыбКассир.Наименование);
КонецЕсли;
Иначе
Предупреждение("Не определены параметры ККМ, чек не пробит!", 60);
Возврат;
КонецЕсли;
// Создаем две таблицы значений для разделения потоков продаж
ТаблицаУСН = СоздатьОбъект("ТаблицаЗначений");
ТаблицаУСН.НоваяКолонка("ТовНаим", "Строка");
ТаблицаУСН.НоваяКолонка("Цена", "Число");
ТаблицаУСН.НоваяКолонка("Количество", "Число");
ТаблицаУСН.НоваяКолонка("Сумма", "Число");
ТаблицаУСН.НоваяКолонка("СтавкаНДС", "Строка");
ТаблицаПСН = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПСН.НоваяКолонка("ТовНаим", "Строка");
ТаблицаПСН.НоваяКолонка("Цена", "Число");
ТаблицаПСН.НоваяКолонка("Количество", "Число");
ТаблицаПСН.НоваяКолонка("Сумма", "Число");
ТаблицаПСН.НоваяКолонка("СтавкаНДС", "Строка");
// Распределяем товары по таблицам значений
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если Товар.ТоварУСН = 1 Тогда
// Товар относится к УСН (например, моторное масло)
ТаблицаУСН.НоваяСтрока();
ТаблицаУСН.ТовНаим = Сред(СокрЛП(Товар.Код) + "/" + СокрЛП(Товар.Наименование), 1, 65);
ТаблицаУСН.Цена = Цена;
ТаблицаУСН.Количество = Количество;
ТаблицаУСН.Сумма = Сумма;
ТаблицаУСН.СтавкаНДС = "18"; // Или "20"
Иначе
// Обычный товар на Патенте/ЕНВД
ТаблицаПСН.НоваяСтрока();
ТаблицаПСН.ТовНаим = Сред(СокрЛП(Товар.Код) + "/" + СокрЛП(Товар.Наименование), 1, 65);
ТаблицаПСН.Цена = Цена;
ТаблицаПСН.Количество = Количество;
ТаблицаПСН.Сумма = Сумма;
ТаблицаПСН.СтавкаНДС = "none";
КонецЕсли;
КонецЦикла;
ПризнВозврата = ?(ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек, 1, 2);
ПроцентСкидки = ?(Число(ДисконтнаяКарта.Тип.Процент) = 0, 0, Число(ДисконтнаяКарта.Тип.Процент));
ТелПокупателя = "";
ЭлПочтаПокупателя = "";
Если СтрДлина(СокрЛП(КонтактПокупателя)) > 0 Тогда
Если Найти(КонтактПокупателя, "@") = 0 Тогда
ТелПокупателя = СокрЛП(ContактПокупателя);
Иначе
ЭлПочтаПокупателя = СокрЛП(КонтактПокупателя);
КонецЕсли;
КонецЕсли;
ТипОплаты = ?(ВариантОплаты = Перечисление.ТипыОплатЧекаККМ.ПлатежнаяКарта, 1, 0);
УспешноПробитУСН = 0;
УспешноПробитПСН = 0;
// Пробиваем первый чек (УСН) при наличии позиций
Если ТаблицаУСН.КоличествоСтрок() > 0 Тогда
СуммаУСН = ТаблицаУСН.Итог("Сумма");
ЧекПробитККМ = глФРПечататьЧек(ТаблицаУСН, СуммаУСН, СуммаУСН, ПроцентСкидки, ПризнВозврата, ЗначениеНДС_УСН, НомерЧека, ПУП_УСН, Кассир, ТелПокупателя, ЭлПочтаПокупателя, ТипОплаты);
Если ЧекПробитККМ = 1 Тогда
УспешноПробитУСН = 1;
Иначе
Предупреждение("Ошибка при печати чека УСН! Пробитие чеков прервано.");
Возврат;
КонецЕсли;
КонецЕсли;
// Пробиваем второй чек (ПСН) при наличии позиций
Если ТаблицаПСН.КоличествоСтрок() > 0 Тогда
СуммаПСН = ТаблицаПСН.Итог("Сумма");
ЧекПробитККМ = глФРПечататьЧек(ТаблицаПСН, СуммаПСН, СуммаПСН, ПроцентСкидки, ПризнВозврата, ЗначениеНДС_ПСН, НомерЧека, ПУП_ПСН, Кассир, ТелПокупателя, ЭлПочтаПокупателя, ТипОплаты);
Если ЧекПробитККМ = 1 Тогда
УспешноПробитПСН = 1;
Иначе
Предупреждение("Ошибка при печати чека Патента/ЕНВД! Свяжитесь с администратором.");
Возврат;
КонецЕсли;
КонецЕсли;
// Фиксируем успешное завершение операции в базе
Если (ТаблицаУСН.КоличествоСтрок() > 0 И УспешноПробитУСН = 1) Или (ТаблицаПСН.КоличествоСтрок() > 0 И УспешноПробитПСН = 1) Тогда
НомерЧекаККМ = ?(НомерЧека = 0, -1, НомерЧека);
СтатусЧекаККМ = Перечисление.СтатусыЧековККМ.Пробитый;
ПриЗаписиПерепроводить(0);
Записать();
ПриЗаписиПерепроводить(1);
КонецЕсли;
КонецПроцедуры
Для того чтобы кассовый аппарат корректно обрабатывал отправленные команды, должны выполняться аппаратные требования кассы и фискального накопителя:
frATOL54_comm.ert (или другая, используемая в системе) корректно транслирует числовые коды ПУП (параметров учетной политики) драйверу ККТ. В драйверах АТОЛ версии 10 и выше используются следующие стандартные числовые маски систем налогообложения:
1 — ОСН (Общая)2 — УСН Доход4 — УСН Доход-Расход8 — ЕНВД16 — ЕСХН32 — Патентная СНОПроанализируем функцию глОпределитьПУП() в глобальном модуле вашей конфигурации. Она должна возвращать корректные числовые эквиваленты СНО для передачи в обработку обслуживания ККМ. При необходимости скорректируйте ее возвращаемые значения в соответствии со спецификацией вашего драйвера.
Важным организационным моментом является обработка безналичных платежей банковской картой:
Если покупатель оплачивает корзину товаров картой, банковский терминал не умеет разделять платеж автоматически в рамках одного обращения. Чтобы избежать расхождений между суммами, ушедшими в банк через терминал, и суммами, зафиксированными на фискальном накопителе, продавцам необходимо совершать оплату в два этапа. Покупатель должен будет приложить карту к терминалу дважды: первый раз за моторное масло (УСН), второй раз — за сопутствующие автозапчасти (Патент). Проведите инструктаж персонала для предотвращения ошибок и пересортицы по кассовым сменам.