Как в 1С 7.7 пробивать товары с НДС и без НДС (разные СНО) с одной кассы

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

В розничной торговле часто возникает ситуация, когда одна торговая точка совмещает разные системы налогообложения (СНО). Классический пример — продажа автозапчастей на Патенте (ПСН, ранее — ЕНВД) и моторных масел на Упрощенной системе налогообложения (УСН) или Общей системе (ОСН). Поскольку моторные масла являются подакцизным товаром, торговать ими в рамках патента или единого налога на вмененный доход законодательно запрещено.

Согласно требованиям Федерального закона № 54-ФЗ, в одном кассовом чеке может быть указана только одна СНО. Попытка пробить товары разных налоговых режимов в одном документе приведет к нарушению законодательства и штрафам. Единственным технически и юридически верным решением является автоматическое разделение продажи на два отдельных чека в рамках одной сессии ККМ. Разберем по шагам, как настроить такое разделение в среде 1С:Предприятие 7.7.

Шаг 1: Подготовка справочника Номенклатуры

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

Выполним следующие действия в конфигураторе:

  1. Откроем конфигуратор вашей базы данных 1С 7.7.
  2. В дереве метаданных найдем справочник Номенклатура (или Товары, в зависимости от вашей конфигурации).
  3. Добавим новый реквизит:
    • Идентификатор: ТоварУСН
    • Тип: Число
    • Длина: 1
    • Точность: 0
    • Неотрицательный: Да
  4. Выведем этот реквизит на форму элемента справочника в виде флажка (флаг установлен — 1 (УСН, облагается НДС), снят — 0 (Патент/ЕНВД, без НДС)).

После сохранения конфигурации кассиру или администратору потребуется зайти в карточки подакцизных товаров (например, моторных масел) и установить данный флаг.

Шаг 2: Создание алгоритма разделения чека

Перейдем к программной реализации в модуле документа (обычно это документ ЧекККМ или аналогичный ему документ розничной продажи). Нам необходимо доработать процедуру ПробитьЧекККМ().

Вместо отправки всей табличной части документа в один чек, мы организуем разделение товаров на две независимые таблицы значений: одну для УСН (товары с НДС), вторую — для Патента (без НДС). Затем поочередно отправим каждую таблицу на печать, если в ней есть хотя бы одна строка.

Рассмотрим подробнее реализацию этого механизма в коде:


Процедура ПробитьЧекККМ()     
    
    Перем НомерЧека;
    
    Если Получено < Итог("Сумма") Тогда
        Предупреждение("Не хватает средств для оплаты!");
        Возврат;
    КонецЕсли;
    
    Если НомерЧекаККМ <> 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);
    КонецЕсли;
    
КонецПроцедуры

Шаг 3: Аппаратная проверка настроек кассы

Для того чтобы кассовый аппарат корректно обрабатывал отправленные команды, должны выполняться аппаратные требования кассы и фискального накопителя:

Проанализируем функцию глОпределитьПУП() в глобальном модуле вашей конфигурации. Она должна возвращать корректные числовые эквиваленты СНО для передачи в обработку обслуживания ККМ. При необходимости скорректируйте ее возвращаемые значения в соответствии со спецификацией вашего драйвера.

Шаг 4: Организация эквайринга при разделении чеков

Важным организационным моментом является обработка безналичных платежей банковской картой:

Если покупатель оплачивает корзину товаров картой, банковский терминал не умеет разделять платеж автоматически в рамках одного обращения. Чтобы избежать расхождений между суммами, ушедшими в банк через терминал, и суммами, зафиксированными на фискальном накопителе, продавцам необходимо совершать оплату в два этапа. Покупатель должен будет приложить карту к терминалу дважды: первый раз за моторное масло (УСН), второй раз — за сопутствующие автозапчасти (Патент). Проведите инструктаж персонала для предотвращения ошибок и пересортицы по кассовым сменам.

← На главную