При автоматизации розничной торговли часто возникает необходимость совмещения нескольких систем налогообложения (СНО) на одном фискальном регистраторе. Например, организация может одновременно применять упрощенную систему налогообложения (УСН «доходы минус расходы») и патентную систему (ПСН) или единый налог на вмененный доход (ЕНВД). Современные кассовые аппараты, такие как АТОЛ 55Ф, аппаратно поддерживают эту возможность. Однако при попытке настроить разделение продаж по складам в устаревших конфигурациях на платформе 1С 7.7 (например, в «Торговле и Склад 7.7») разработчики часто сталкиваются с проблемой: касса упорно игнорирует передаваемый код СНО и пробивает все чеки по системе налогообложения, выбранной в настройках драйвера по умолчанию.
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы работы драйверов АТОЛ, выясним роль форматов фискальных данных (ФФД) и предложим пошаговые инструкции по исправлению кода в обработках обслуживания для ДТО 8 и ДТО 10.
Для передачи применяемой системы налогообложения в чеке используется фискальный тег 1055 (СНО). Согласно документации АТОЛ, каждому типу СНО соответствует определенная битовая маска (числовое значение):
Если в коде обработки обслуживания (например, frAtol54_comm_105.ert) прописана передача этого тега, но при печати чека все равно подставляется дефолтное значение, это может происходить по пяти основным причинам. Рассмотрим каждую подробнее.
При использовании драйвера АТОЛ версии 8 (ДТО 8) критически важен момент времени, в который программа пытается передать тег 1055. Если записать атрибут до фактического открытия чека или во время регистрации товарных позиций, ККТ просто проигнорирует команду WriteAttribute().
Правильный алгоритм работы с ДТО 8 выглядит следующим образом:
Mode = 1 и вызов метода SetMode()).OpenCheck().BeginItem(), EndItem() или Registration()).CloseCheck().Проанализируем пример некорректного кода, где атрибут пишется до открытия чека:
// НЕПРАВИЛЬНО: Попытка передать СНО до открытия документа
Объект.AttrNumber = 1055;
Объект.AttrValue = ПУП; // Значение СНО (например, 4 или 8)
Объект.WriteAttribute();
Объект.OpenCheck(); // Чек открывается, но атрибут СНО уже утерян
А теперь приведем пример правильной реализации, которая гарантирует успешную запись тега 1055 на ККТ АТОЛ под управлением ДТО 8:
// ПРАВИЛЬНО: Передача СНО строго после открытия чека
Объект.CheckType = 1; // Приход
Объект.CheckMode = 1; // Фискальный чек
Если Объект.OpenCheck() <> 0 Тогда
Предупреждение("Не удалось открыть фискальный чек!");
Возврат;
КонецЕсли;
// Записываем СНО сразу после успешного открытия чека
Объект.AttrNumber = 1055;
Объект.AttrValue = Число(ПараметрСНО); // Где ПараметрСНО равен 4 или 8
Если Объект.WriteAttribute() <> 0 Тогда
Сообщить("Ошибка записи тега 1055: " + Объект.ResultDescription, "!");
КонецЕсли;
// Далее переходим к регистрации товарных позиций
В некоторых версиях ДТО 8 драйвер ожидает строго определенный тип переменной для свойства AttrValue. Передача числового значения иногда обрабатывается некорректно, из-за чего касса сбрасывает параметр.
Рассмотрим этот нюанс. Попробуйте передавать значение тега 1055 как в виде числа, так и в виде текстовой строки. В зависимости от релиза драйвера и прошивки ККТ, один из вариантов окажется рабочим:
// Вариант А: Передача числового значения
Объект.AttrValue = 4; // УСН Доход-Расход
// Вариант Б: Передача строкового значения (в некоторых версиях решает проблему)
Объект.AttrValue = "4";
Для диагностики успешности записи атрибута обязательно выполняйте чтение обратно сразу после вызова метода записи. Это поможет вам локализовать проблему на этапе отладки:
Объект.AttrNumber = 1055;
Объект.AttrValue = 8; // ЕНВД
Объект.WriteAttribute();
// Сразу считываем записанное значение для проверки
Объект.AttrNumber = 1055;
Объект.ReadAttribute();
Сообщить("Записанное значение СНО в ККТ: " + Объект.AttrValue);
Если в окно сообщений 1С выводится пустое значение или ноль, значит, драйвер отверг переданные данные, и нужно проверить тип данных или версию драйвера.
Иногда разработчики сталкиваются с ситуацией, когда версия ФФД фискального накопителя отличается от версии ФФД самого кассового аппарата. Например:
При использовании старого формата ФФД 1.0 (который уже утратил актуальность) передача динамической СНО в каждом отдельном чеке на некоторых моделях ККТ блокировалась на уровне прошивки или самого фискального накопителя. В таких условиях ККТ всегда использовала СНО, жестко заданную по умолчанию при фискализации.
Решение: Убедитесь, что ККТ и ФН работают на полноценном формате ФФД 1.05 или ФФД 1.2. Для этого может потребоваться обновление прошивки кассового аппарата (переход на Платформу 5.0) и перерегистрация кассы в ФНС с актуальными параметрами.
Кассовый аппарат физически не сможет пробить чек по системе налогообложения, которая не была активирована в процессе его регистрации. Если в ККТ при фискализации была указана только одна СНО (например, только ЕНВД), то при попытке отправить из 1С код УСН (значение 4) ККТ вернет ошибку или молча проигнорирует команду, подставив единственную доступную СНО.
Чтобы проверить список доступных СНО, выполните следующие действия в сервисной утилите:
Если какая-то из систем отсутствует, потребуется произвести процедуру перерегистрации ККТ в ФНС без замены фискального накопителя, выбрав причину «Изменение параметров регистрации» и отметив галочками все используемые СНО.
Помните, что требования законодательства и форматы фискальных данных категорически запрещают смешивать позиции с разными СНО в пределах одного бумажного или электронного чека.
Если в рамках одного документа в 1С 7.7 у вас присутствуют товары с разных складов (один на УСН, другой на ЕНВД), стандартная обработка обслуживания может попытаться отправить их в один физический чек на кассу. В этом случае возникнет конфликт. Перед пробитием позиций по другой СНО текущий документ на ККТ должен быть гарантированно закрыт. То есть для каждого склада (и соответствующей СНО) должен формироваться и печататься свой отдельный чек.
Драйвер ККМ версии 8 (ДТО 8) давно устарел и не поддерживается производителем. На современных прошивках АТОЛ (Платформа 5) работа через ДТО 8 часто сопровождается необъяснимыми багами, включая игнорирование тегов фискализации. Самым надежным решением является переход на современный драйвер ДТО 10 (Драйвер ККТ v.10).
Для работы с ДТО 10 в среде 1С 7.7 необходимо зарегистрировать внешнюю компоненту addin_fptr10_x86.dll и переписать логику формирования чека. В ДТО 10 передача тегов происходит через объект параметров гораздо проще и надежнее.
Рассмотрим пример кода для 1С 7.7 при использовании ДТО 10:
// Создаем объект драйвера АТОЛ 10
Попытка
ЗагрузитьВнешнююКомпоненту("addin_fptr10_x86.dll");
driver = СоздатьОбъект("AddIn.Fptr10");
Исключение
Предупреждение("Не удалось загрузить библиотеку ДТО 10!");
Возврат;
КонецПопытки;
// Настройка соединения и открытие смены (пропускаем для краткости)
// ...
// Установка режима регистрации
driver.setParam(driver.LIBFPTR_PARAM_DESCRIPTOR, driver.LIBFPTR_DT_RETAIL);
driver.openReceipt();
// Передаем СНО (тег 1055) напрямую через константы драйвера ДТО 10
// Константы СНО в ДТО 10:
// driver.LIBFPTR_TT_OSN = 1 (Общая)
// driver.LIBFPTR_TT_USN_INCOME = 2 (УСН доход)
// driver.LIBFPTR_TT_USN_INCOME_OUT = 4 (УСН доход-расход)
// driver.LIBFPTR_TT_ENVD = 8 (ЕНВД)
// driver.LIBFPTR_TT_PATENT = 32 (Патент)
Если НужныйСклад = "УСН" Тогда
driver.setParam(1055, driver.LIBFPTR_TT_USN_INCOME_OUT); // Передаем УСН
ИначеЕсли НужныйСклад = "ЕНВД" Тогда
driver.setParam(1055, driver.LIBFPTR_TT_ENVD); // Передаем ЕНВД
КонецЕсли;
// Регистрируем СНО в чеке
driver.utilizeTaxationSystem();
// Переходим к регистрации позиций
driver.setParam(driver.LIBFPTR_PARAM_COMMODITY_NAME, "Товар со склада УСН");
driver.setParam(driver.LIBFPTR_PARAM_PRICE, 100.00);
driver.setParam(driver.LIBFPTR_PARAM_QUANTITY, 1);
driver.setParam(driver.LIBFPTR_PARAM_TAX_TYPE, driver.LIBFPTR_TAX_NO); // Без НДС
driver.registration();
// Оплата и закрытие чека
driver.setParam(driver.LIBFPTR_PARAM_PAYMENT_TYPE, driver.LIBFPTR_PT_CASH);
driver.setParam(driver.LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
driver.payment();
driver.closeReceipt();
Использование ДТО 10 полностью решает проблему «залипания» реквизитов и гарантирует корректную передачу тега 1055 в ОФД независимо от того, какая СНО установлена в параметрах кассы по умолчанию.
Если ваша касса АТОЛ 55Ф под управлением 1С 7.7 отказывается менять СНО в чеках, последовательно пройдите по следующим шагам контроля:
1055 должна происходить строго после успешного вызова метода OpenCheck(), но до первого вызова Registration() или BeginItem().4 или 8, попробуйте передать их как текстовую строку: "4" или "8".ReadAttribute() сразу после его записи. Если возвращается пустота — проверяйте синтаксис и драйвер.