В процессе автоматизации розничной торговли и интеграции кассового оборудования разработчики часто сталкиваются с необходимостью печати чеков на ККТ (контрольно-кассовой технике) при совмещении нескольких систем налогообложения. Особенно остро этот вопрос встает при работе со старыми или сильно измененными конфигурациями, такими как «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С с требованиями драйвера.
Если перед вами стоит задача доработать старую нетиповую конфигурацию, где чеки бьются через внешнюю обработку или кастомный код, выполните следующие шаги для корректной передачи СНО:
СистемаНалогообложения с типом ссылки на перечисление или числовым кодом.Рассмотрим пример доработки кода печати для интеграции с ККТ АТОЛ через стандартный 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();
КонецПроцедуры
Использование подобных алгоритмов позволит полностью контролировать реквизиты, отправляемые на фискальный накопитель, исключит путаницу со значениями «по умолчанию» и обеспечит полное соответствие вашей торговой деятельности требованиям законодательства.