С введением 54-ФЗ и форматов фискальных данных (ФФД) перед разработчиками на платформе 1С 7.7 встала задача корректного разделения потоков продаж. Часто возникают ситуации, когда одна организация или ИП совмещает несколько систем налогообложения (СНО), например, УСН и Патент, или продает подакцизные товары (моторные масла) на ОСН, а остальные — по упрощенке. Рассмотрим подробно, как доработать типовую конфигурацию «Торговля и Склад» (ТиС) для решения этой задачи.
Важно понимать, что согласно требованиям ФФД, в одном кассовом чеке может быть указана только одна система налогообложения. Если в корзине покупателя присутствуют товары, относящиеся к разным СНО, программа должна автоматически или полуавтоматически разделить один документ на два разных чека. Проанализируем техническую сторону реализации этого процесса для ККТ АТОЛ.
Для управления системой налогообложения в старых драйверах (DTO 8) использовалось свойство TaxType. Разберем соответствие числовых значений режимам налогообложения:
Однако в современных реалиях (ФФД 1.05 и выше) правильнее работать через запись атрибутов (тегов). Ключевым является Тег 1055 (Система налогообложения). Рассмотрим пример кода, который необходимо внедрить в обработку обслуживания ККТ (обычно это fr_comm.ert или специализированные обработки для АТОЛ 54-ФЗ):
// Пример установки СНО через прямой доступ к атрибутам драйвера
Объект.AttrNumber = 1055;
Объект.AttrValue = ВыбраннаяСистемаНалогообложения; // Числовое значение от 1 до 32 (битовая маска)
Объект.WriteAttribute();
Проанализируем ситуацию: если вы используете обновленные обработки обслуживания, такие как frATOL54_comm_105.ert, установка СНО должна происходить непосредственно перед открытием чека командой OpenCheck или в процессе формирования позиций.
Поскольку типовая «Торговля и Склад» не предполагает автоматического разделения одного документа «Чек» или «ПКО» на разные системы налогообложения, нам придется доработать логику печати. Рассмотрим пошагово, как это реализовать:
TaxType или атрибут 1055 и пробьем отдельный чек.Рассмотрим пример кода для разделения товаров в обработке fr_comm.ert:
// Пример логики разделения таблицы товаров
ТЗ_ОСН = СоздатьОбъект("ТаблицаЗначений");
ТЗ_УСН = СоздатьОбъект("ТаблицаЗначений");
// ... заполняем структуры таблиц ...
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если Док.Номенклатура.СНО = Перечисление.СНО.ОСН Тогда
// Копируем данные в ТЗ_ОСН
Иначе
// Копируем данные в ТЗ_УСН
КонецЕсли;
КонецЦикла;
// Печать первого чека
Если ТЗ_ОСН.КоличествоСтрок() > 0 Тогда
Объект.TaxType = 0; // ОСН
ПечататьГруппуТоваров(ТЗ_ОСН);
КонецЕсли;
// Печать второго чека
Если ТЗ_УСН.КоличествоСтрок() > 0 Тогда
Объект.TaxType = 2; // УСН Доход-расход
ПечататьГруппуТоваров(ТЗ_УСН);
КонецЕсли;
Выясним причину, почему многие старые решения перестают работать. С 2019 года обязательным стал формат 1.05, а позже и 1.2 (для маркировки). В драйверах АТОЛ 10-й версии (DTO 10) объектная модель полностью изменилась. Если вы переходите на 10-ку в 1С 7.7, обратите внимание на следующие моменты:
1. Вместо прямого обращения к свойствам используется метод setParam. Чтобы установить СНО, нужно передать параметр LIBFPTR_PARAM_TAX_VARIANT.
2. Пример установки СНО в DTO 10:
Драйвер.setParam(65545, НомерСНО); // 65545 — ID параметра системы налогообложения
Драйвер.setParam(1055, НомерСНО);
Разберем ситуацию со скидками при разделении чеков. В ФФД 1.05 отсутствует понятие «скидка на весь чек» в том виде, в котором она была раньше. Каждая позиция должна содержать итоговую цену. При программном разделении одного документа 1С на два чека ККТ, убедитесь, что распределение общей скидки документа (если она есть) происходит корректно между этими двумя чеками, иначе итоговая сумма по кассе не совпадет с данными в 1С.
Для решения проблемы «лишней копейки» при округлении распределенной скидки, рекомендуем использовать алгоритм распределения остатка на последнюю позицию в каждой группе товаров.
Как отмечалось в сообщениях форума, иногда возникает путаница с номерами чеков, если к одной базе подключено несколько касс для разных организаций. Выясним, как этого избежать:
Объект.CurrentDeviceNumber = НужныйНомер;.Объект.DeviceEnabled = 1; для активации конкретного аппарата.Важный совет: Если вы планируете торговать маркированными товарами (через систему «Честный ЗНАК»), типовые обработки 7.7 потребуют значительной переработки для передачи кода маркировки (Тег 1162). В этом случае рассмотрите возможность использования внешних компонент, поддерживающих ФФД 1.2.
Проанализировав ситуацию, можно сделать вывод: реализация продажи по разным СНО в одной базе 1С 7.7 возможна и технически оправдана. Основная сложность заключается в аккуратном разделении табличной части документа перед отправкой команд на ФР и корректной установке атрибута 1055 (или TaxType) для каждой итерации печати.