При переходе на новые версии драйверов АТОЛ ДТО (версии 10.8 и выше) многие разработчики сталкиваются с тем, что привычный код для печати чеков перестает работать. Это связано с внедрением поддержки ФФД 1.2 и обязательной маркировки товаров (Честный Знак). Фирма «1С» изменила стандарт взаимодействия с оборудованием (БПО), чтобы унифицировать передачу сложных данных. В этой статье мы подробно разберем, как адаптировать вашу обработку под современные требования драйвера.
Проанализируем ситуацию: старые версии драйверов (до 10.5) использовали метод СформироватьЧек, в который передавалось от 7 до 9 и более параметров (идентификатор устройства, признак электронного чека, данные чека, номер чека, номер смены и так далее). Однако в новых реализациях, соответствующих стандарту БПО 3.0, сигнатура метода была радикально упрощена. Теперь драйвер ожидает всего 4 параметра. Когда 1С пытается передать старое количество аргументов, система выдает ошибку «Слишком много фактических параметров».
Разберем по шагам, как теперь должен выглядеть вызов функции. Весь массив данных, который раньше передавался отдельными переменными, теперь инкапсулирован либо в XML-строку ДанныеЧека, либо возвращается через специальный выходной массив.
Типовой вызов в обновленном варианте выглядит следующим образом:
Результат = ОбъектДрайвера.СформироватьЧек(
ИДУстройства,
Электронно,
ДанныеЧека,
ВыходныеПараметры
);
Рассмотрим подробнее назначение каждого параметра:
Посмотрим на пример того, как получить данные после успешной печати чека. Раньше мы передавали переменные НомерЧека или НомерСмены по ссылке, и они заполнялись автоматически. Теперь нам нужно самостоятельно извлечь их из массива ВыходныеПараметры.
Проанализируем структуру возвращаемого массива (индексы могут зависеть от версии БПО, но чаще всего они распределены так):
Если Результат Тогда
// Индекс 0: Фискальный признак (ФП)
ФискальныйПризнак = ВыходныеПараметры[0];
// Индекс 1: Дата и время документа на кассе
ДатаВремяЧека = ВыходныеПараметры[1];
// Индекс 2: Номер чека (порядковый номер за смену)
НомерЧека = ВыходныеПараметры[2];
// Индекс 3: Номер смены
НомерСмены = ВыходныеПараметры[3];
Иначе
// Обработка ошибки
ТекстОшибки = "";
ОбъектДрайвера.ПолучитьОшибку(ТекстОшибки);
Сообщить("Ошибка печати чека: " + ТекстОшибки);
КонецЕсли;
Поскольку мы переходим на ДТО 10.8 для работы с маркировкой, крайне важно правильно сформировать параметр ДанныеЧека. В новых версиях драйвера старый формат формирования строки больше не принимается. Структура XML должна соответствовать актуальным требованиям XSD-схем 1С.
Особое внимание уделим блоку маркировки. Если вы продаете товар с кодом DataMatrix, в узел <Item> (товарная позиция) необходимо добавить тег <MarkingCode>. Выясним важный нюанс: для ФФД 1.2 драйвер АТОЛ ожидает передачу «чистого» кода маркировки, который считывается сканером. Драйвер сам разберет его на составляющие и передаст в систему «Честный Знак» через ККТ.
Пример фрагмента формирования XML для маркированного товара:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalCheck");
// ... формирование шапки чека ...
ЗаписьXML.ЗаписатьНачалоЭлемента("Items");
ЗаписьXML.ЗаписатьНачалоЭлемента("Item");
ЗаписьXML.ЗаписатьАтрибут("Name", НаименованиеТовара);
ЗаписьXML.ЗаписатьАтрибут("Quantity", Формат(Количество, "ЧЦ=10; ЧДЦ=3; ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", Формат(Цена, "ЧЦ=10; ЧДЦ=2; ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("Amount", Формат(Сумма, "ЧЦ=10; ЧДЦ=2; ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("VATRate", "20"); // Ставка НДС
// Блок маркировки для ДТО 10.8
Если ЭтоМаркируемыйТовар Тогда
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", КодМаркировки);
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Item
ЗаписьXML.ЗаписатьКонецЭлемента(); // Items
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalCheck
ДанныеЧека = ЗаписьXML.Закрыть();
Если вы дорабатываете старую обработку, созданную под драйверы 8.х или ранние 10.х, мы рекомендуем следующий алгоритм действий:
МенеджерОборудованияКлиент.СформироватьЧек(), которые уже учитывают все изменения драйверов.ProcessCheck(JSONЗадание). Однако это потребует полной смены логики формирования пакета данных с XML на JSON.СформироватьЧек в новых драйверах крайне желательно использовать метод ПроверитьМаркировку. Это позволит избежать ситуации, когда чек начинает печататься, но прерывается из-за невалидного кода Честного Знака.Важный момент: при работе с ДТО 10.8 через COM-соединение или Native-компоненту, убедитесь, что в системе не осталось хвостов от старых версий драйверов (особенно atol_kkt_10.dll), так как 1С может случайно инициализировать старый объект, который не знает о новом количестве параметров.
Таким образом, для исправления ошибки вам необходимо сократить количество аргументов в вызове функции до четырех и перенести логику обработки номера чека и смены в анализ выходного массива. Это обеспечит корректную работу с маркировкой и стабильную печать чеков на актуальных прошивках ККТ АТОЛ.