Как передать систему налогообложения (СНО) при печати чеков на онлайн-кассе из 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Налоговый учет IT и автоматизация бизнеса
← На главную

В процессе автоматизации розничной торговли и интеграции кассового оборудования разработчики часто сталкиваются с необходимостью печати чеков на ККТ (контрольно-кассовой технике) при совмещении нескольких систем налогообложения. Особенно остро этот вопрос встает при работе со старыми или сильно измененными конфигурациями, такими как «1С:Бухгалтерия 2.0», где стандартные механизмы работы с онлайн-кассами (по требованиям 54-ФЗ) отсутствуют или реализованы частично.

В данной статье мы подробно разберем, как устроена передача СНО из программы 1С на физическое устройство ККТ, какие параметры драйвера за это отвечают, как правильно настроить логику в коде и избежать частых ошибок, приводящих к штрафам от налоговых органов.

Законодательный контекст и важность правильной СНО в чеке

Согласно требованиям Федерального закона № 54-ФЗ «О применении контрольно-кассовой техники», применяемая система налогообложения является обязательным реквизитом кассового чека. За передачу СНО в чеке отвечает Тег 1055 («применяемая система налогообложения»). За передачу поддерживаемых СНО при регистрации кассового аппарата отвечает Тег 1062.

Если организация совмещает несколько режимов (например, упрощенную систему налогообложения УСН и патентную систему ПСН), то для каждого чека должна быть четко определена конкретная СНО, под которую подпадает данная продажа. Обратите внимание, что совмещение УСН и некогда популярного ЕНВД более невозможно, так как ЕНВД был полностью отменен с 1 января 2021 года (Федеральный закон № 325-ФЗ). Современной альтернативой для совмещения чаще всего выступает связка УСН + ПСН.

Важный нюанс: если в чеке (Тег 1055) будет передано значение СНО, которое не было указано и фискализировано при регистрации кассы (Тег 1062), кассовый аппарат выдаст ошибку, и чек не пробит. Выдача чеков с некорректно указанной СНО квалифицируется как нарушение порядка применения ККТ и влечет наложение административного штрафа по ч. 4 ст. 14.5 КоАП РФ (до 10 000 рублей для юридических лиц).

Анализ механизмов передачи СНО через драйвер ККТ

Когда мы работаем напрямую с драйвером торгового оборудования (без использования БПО — Библиотеки подключаемого оборудования), нам необходимо управлять низкоуровневыми параметрами. Крупнейшие производители ККТ, такие как АТОЛ и Штрих-М, используют числовое кодирование СНО по принципу битовой маски (степеней двойки).

Давайте проанализируем, какие числовые значения соответствуют различным системам налогообложения:

При программировании напрямую через драйвер АТОЛ 10-й версии для установки СНО в чеке используется параметр TaxVariant (или системная константа LIBFPTR_BP_TAX_VARIANT). Посмотрим на пример кода, как это может выглядеть при инициализации параметров чека:


// Создаем объект драйвера АТОЛ
Драйвер = Новый COMОбъект("Atol.Device");

// Открываем смену / чек
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_DOCUMENT_TYPE, Драйвер.LIBFPTR_DT_RECEIPT);
// Указываем СНО. Например, для УСН Доход минус Расход передаем значение 4
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_TAX_VARIANT, 4); 
Драйвер.openDocument();

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

Реализация передачи СНО в типовых конфигурациях

Давайте разберем, как данный механизм реализован в современных типовых решениях 1С (таких как «1С:Бухгалтерия 3.0» или «1С:Управление торговлей 10.3 / 11»). В современных версиях всю работу по взаимодействию с оборудованием берет на себя Библиотека подключаемого оборудования (БПО).

При отправке команды печати БПО формирует XML-пакет, содержащий все данные чека. В структуре этого XML-пакета обязательно присутствует узел, определяющий СНО. Посмотрим на структуру такого XML-документа:


<Receipt>
    <FiscalString Name="Товар тестовый" Quantity="1" Price="100" Amount="100" Department="1" TaxRate="none" />
    <Payments Cash="100" />
    <TaxVariant>2</TaxVariant> 
</Receipt>

В данном XML-файле узел TaxVariant (или в некоторых версиях БПО текстовый реквизит СистемаНалогообложения) указывает кассе, под каким режимом пробивать операцию. БПО самостоятельно транслирует текстовые названия или перечисления 1С в битовые маски конкретного производителя ККТ.

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


// Выясним СНО организации на дату документа
ПараметрыНалогообложения = НалогиИОтчеты.ПолучитьПрименяемыеСистемыНалогообложения(Организация, ДатаДокумента);

Если ПараметрыНалогообложения.Количество() > 1 Тогда
    // Если применяется несколько систем, определяем СНО по виду деятельности или складу
    ВыбраннаяСНО = ОпределитьСНОПоДокументу(ДокументСсылка);
Иначе
    ВыбраннаяСНО = ПараметрыНалогообложения[0];
КонецЕсли;

// Преобразуем значение СНО в формат, понятный БПО
КодСНО = ПолучитьКодСНОДляБПО(ВыбраннаяСНО);

Переменная КодыСистемыНалогообложения или аналогичное перечисление (например, ТипыСистемНалогообложенияККТ) используется для сопоставления внутренних объектов 1С с требованиями драйвера.

Инструкция по доработке нетиповой конфигурации «1С:Бухгалтерия 2.0»

Если перед вами стоит задача доработать старую нетиповую конфигурацию, где чеки бьются через внешнюю обработку или кастомный код, выполните следующие шаги для корректной передачи СНО:

  1. Добавьте реквизит СНО в документы-источники. В документах «Приходный кассовый ордер» (ПКО), «Операция по платежной карте» (Эквайринг) или созданных вручную «Чек ККМ» добавьте реквизит СистемаНалогообложения с типом ссылки на перечисление или числовым кодом.
  2. Настройте автозаполнение реквизита. При создании документа реквизит должен заполняться автоматически на основе учетной политики организации или настроек конкретного склада/договора.
  3. Модернизируйте код печати чека. Найдите процедуру, отвечающую за взаимодействие с кассой. Обычно она вызывается по кнопке «Чек» или «Напечатать чек». Извлеките значение СНО из документа и передайте его в качестве параметра подключения ККТ.
  4. Добавьте обработку ошибок драйвера. Напишите код проверки успешности передачи параметра. Если ККТ возвращает ошибку, программа должна выводить пользователю понятное сообщение с указанием причины (например, «Указанная СНО не зарегистрирована в фискальном накопителе кассы»).

Рассмотрим пример доработки кода печати для интеграции с ККТ АТОЛ через стандартный COM-объект в старой конфигурации:


Процедура НапечататьЧекНаКассе(ДокументОбъект)
    
    // Инициализация объекта драйвера ККТ
    Попытка
        ОбъектДрайвера = Новый COMОбъект("Atol.Drivers10");
    Исключение
        Предупреждение("Не удалось подключить драйвер ККТ АТОЛ!");
        Возврат;
    КонецПопытки;
    
    // Подключение к устройству
    ОбъектДрайвера.Connect();
    
    // Получаем код СНО из документа
    ЧисловойКодСНО = ПолучитьКодСНО(ДокументОбъект.СистемаНалогообложения);
    
    // Установка параметров чека
    ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_DOCUMENT_TYPE, ОбъектДрайвера.LIBFPTR_DT_RECEIPT);
    ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_TAX_VARIANT, ЧисловойКодСНО);
    
    // Открытие чека
    Если ОбъектДрайвера.openDocument() <> 0 Тогда
        ВызватьИсключение "Ошибка открытия чека: " + ОбъектДрайвера.errorDescription();
    КонецЕсли;
    
    // Далее следует цикл по строкам табличной части документа
    Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл
        ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_COMMODITY_NAME, СтрокаТовара.Номенклатура.Наименование);
        ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_PRICE, СтрокаТовара.Цена);
        ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_QUANTITY, СтрокаТовара.Количество);
        ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_TAX_TYPE, ПолучитьСтавкуНДСДляДрайвера(СтрокаТовара.СтавкаНДС));
        ОбъектДрайвера.registrationPosition();
    КонецЦикла;
    
    // Оплата и закрытие чека
    ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_PAYMENT_TYPE, ОбъектДрайвера.LIBFPTR_PT_CASH);
    ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_PAYMENT_SUM, ДокументОбъект.СуммаДокумента);
    ОбъектДрайвера.payment();
    
    ОбъектДрайвера.closeDocument();
    ОбъектДрайвера.Disconnect();
    
КонецПроцедуры

Использование подобных алгоритмов позволит полностью контролировать реквизиты, отправляемые на фискальный накопитель, исключит путаницу со значениями «по умолчанию» и обеспечит полное соответствие вашей торговой деятельности требованиям законодательства.

← На главную