Как настроить печать чеков по двум разным СНО на ККТ АТОЛ в 1С 7.7 (ФФД 1.05)

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

При автоматизации розничной торговли часто возникает необходимость совмещения нескольких систем налогообложения (СНО) на одном фискальном регистраторе. Например, организация может одновременно применять упрощенную систему налогообложения (УСН «доходы минус расходы») и патентную систему (ПСН) или единый налог на вмененный доход (ЕНВД). Современные кассовые аппараты, такие как АТОЛ 55Ф, аппаратно поддерживают эту возможность. Однако при попытке настроить разделение продаж по складам в устаревших конфигурациях на платформе 1С 7.7 (например, в «Торговле и Склад 7.7») разработчики часто сталкиваются с проблемой: касса упорно игнорирует передаваемый код СНО и пробивает все чеки по системе налогообложения, выбранной в настройках драйвера по умолчанию.

В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы работы драйверов АТОЛ, выясним роль форматов фискальных данных (ФФД) и предложим пошаговые инструкции по исправлению кода в обработках обслуживания для ДТО 8 и ДТО 10.


Выясняем причины проблемы: почему касса игнорирует тег 1055?

Для передачи применяемой системы налогообложения в чеке используется фискальный тег 1055 (СНО). Согласно документации АТОЛ, каждому типу СНО соответствует определенная битовая маска (числовое значение):

Если в коде обработки обслуживания (например, frAtol54_comm_105.ert) прописана передача этого тега, но при печати чека все равно подставляется дефолтное значение, это может происходить по пяти основным причинам. Рассмотрим каждую подробнее.


Причина №1: Неверная последовательность команд в коде (ДТО 8)

При использовании драйвера АТОЛ версии 8 (ДТО 8) критически важен момент времени, в который программа пытается передать тег 1055. Если записать атрибут до фактического открытия чека или во время регистрации товарных позиций, ККТ просто проигнорирует команду WriteAttribute().

Правильный алгоритм работы с ДТО 8 выглядит следующим образом:

  1. Вход в режим регистрации (установка Mode = 1 и вызов метода SetMode()).
  2. Установка параметров чека (тип чека, признак расчета).
  3. Открытие чека методом OpenCheck().
  4. Строго сразу после открытия чека и до регистрации первой позиции — передача тега 1055.
  5. Регистрация позиций (методы BeginItem(), EndItem() или Registration()).
  6. Закрытие чека методом 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, "!");
КонецЕсли;

// Далее переходим к регистрации товарных позиций

Причина №2: Несовместимость типов данных в свойстве AttrValue

В некоторых версиях ДТО 8 драйвер ожидает строго определенный тип переменной для свойства AttrValue. Передача числового значения иногда обрабатывается некорректно, из-за чего касса сбрасывает параметр.

Рассмотрим этот нюанс. Попробуйте передавать значение тега 1055 как в виде числа, так и в виде текстовой строки. В зависимости от релиза драйвера и прошивки ККТ, один из вариантов окажется рабочим:


// Вариант А: Передача числового значения
Объект.AttrValue = 4; // УСН Доход-Расход

// Вариант Б: Передача строкового значения (в некоторых версиях решает проблему)
Объект.AttrValue = "4"; 

Для диагностики успешности записи атрибута обязательно выполняйте чтение обратно сразу после вызова метода записи. Это поможет вам локализовать проблему на этапе отладки:


Объект.AttrNumber = 1055;
Объект.AttrValue = 8; // ЕНВД
Объект.WriteAttribute();

// Сразу считываем записанное значение для проверки
Объект.AttrNumber = 1055;
Объект.ReadAttribute();
Сообщить("Записанное значение СНО в ККТ: " + Объект.AttrValue);

Если в окно сообщений 1С выводится пустое значение или ноль, значит, драйвер отверг переданные данные, и нужно проверить тип данных или версию драйвера.


Причина №3: Ограничения версий форматов фискальных данных (ФФД)

Иногда разработчики сталкиваются с ситуацией, когда версия ФФД фискального накопителя отличается от версии ФФД самого кассового аппарата. Например:

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

Решение: Убедитесь, что ККТ и ФН работают на полноценном формате ФФД 1.05 или ФФД 1.2. Для этого может потребоваться обновление прошивки кассового аппарата (переход на Платформу 5.0) и перерегистрация кассы в ФНС с актуальными параметрами.


Причина №4: Параметры фискализации кассового аппарата

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

Чтобы проверить список доступных СНО, выполните следующие действия в сервисной утилите:

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

Если какая-то из систем отсутствует, потребуется произвести процедуру перерегистрации ККТ в ФНС без замены фискального накопителя, выбрав причину «Изменение параметров регистрации» и отметив галочками все используемые СНО.


Причина №5: Ограничение «Один чек — одна СНО»

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

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


Переход на современный ДТО 10 в 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 отказывается менять СНО в чеках, последовательно пройдите по следующим шагам контроля:

  1. Проверьте фискализацию ККТ. Откройте тест драйвера и убедитесь, что при регистрации ККТ были выбраны обе системы налогообложения.
  2. Соблюдайте последовательность в коде. Запись атрибута 1055 должна происходить строго после успешного вызова метода OpenCheck(), но до первого вызова Registration() или BeginItem().
  3. Поиграйте с типами данных. Если ККТ не принимает число 4 или 8, попробуйте передать их как текстовую строку: "4" или "8".
  4. Контролируйте успешность записи. Добавьте в код отладочное чтение реквизита функцией ReadAttribute() сразу после его записи. Если возвращается пустота — проверяйте синтаксис и драйвер.
  5. Проверьте ОФД. Иногда на современных прошивках СНО не печатается на бумажной ленте из-за настроек шаблона чека, но при этом корректно уходит в электронном виде. Обязательно проверьте электронную копию чека в личном кабинете вашего ОФД.
  6. Переходите на ДТО 10. Если старый драйвер 8.16 продолжает вести себя нестабильно, откажитесь от него в пользу современной компоненты АТОЛ 10. Она работает гораздо стабильнее со всеми типами современных прошивок ККТ.
← На главную