Переход на формат фискальных данных (ФФД) 1.2 в старых конфигурациях 1С, таких как УПП 1.3 или УТ 10.3, представляет собой сложную задачу для разработчика. В отличие от предыдущих форматов, ФФД 1.2 требует не просто передачи строки кода маркировки, а выполнения полноценной процедуры проверки КМ через фискальный накопитель и систему «Честный Знак». Рассмотрим подробнее, как адаптировать программный код и XML-структуры для корректной работы с оборудованием Атол.
Проанализируем ситуацию: раньше для передачи маркированного товара в чек достаточно было заполнить тег 1162 (через структуру GoodCodeData). При переходе на ФФД 1.2 этот механизм кардинально изменился. Теперь касса должна сначала отправить запрос на проверку кода маркировки в ОФД, получить ответ и только после этого разрешить продажу с признаком [М+].
Если вы попытаетесь использовать старый метод формирования XML, вы неизбежно столкнетесь с ошибкой «Неподдерживаемый тип кода товара». Это происходит потому, что ККТ под управлением ФФД 1.2 ожидает иную типизацию данных и структуру атрибутов.
Выясним причину основных ошибок при передаче данных. Код маркировки (КМ) необходимо передавать целиком, включая так называемый «криптохвост» (ключ проверки и имитовставку). Если передать только серийный номер и GTIN (короткий код), проверка в ОФД может вернуть статус [М-], что будет означать отрицательный результат проверки.
Рассмотрим пошагово процесс подготовки данных:
GS — ASCII 29).Посмотрим на пример кода, который часто использовался в старых версиях УПП и который перестал работать:
// Старый вариант (не работает в ФФД 1.2)
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
ЗаписьXML.ЗаписатьАтрибут("StampType", "1520");
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", КодМаркировки);
ЗаписьXML.ЗаписатьКонецЭлемента();
Для ФФД 1.2 нам необходимо изменить наименование реквизита. Проанализируем допустимые значения атрибутов:
Таким образом, правильная реализация для обуви (как в рассматриваемом случае) будет выглядеть следующим образом:
Если НЕ ПустаяСтрока(РеквизитКодаТовара) Тогда
// РеквизитКодаТовара должен быть предварительно сконвертирован в Base64
ШтрихкодBase64 = Base64Строка(Новый Картинка(Новый ДвоичныеДанныеИзСтроки(ПолныйКМ)));
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
// Используем атрибут GS1.M для полной марки обуви
ЗаписьXML.ЗаписатьАтрибут("GS1.M", XMLСтрока(ШтрихкодBase64));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
Помимо корректного программного кода, необходимо убедиться в выполнении системных требований. Рассмотрим их подробнее:
ATOL_KKT_10 версии 2.x, её необходимо заменить.Рассмотрим подробнее процесс «общения» с кассой. В ФФД 1.2 мы не просто печатаем чек, а реализуем следующий цикл:
1. Команда очистки: Перед началом работы с чеком рекомендуется вызвать метод ClearMarkingCodeValidStatus для очистки результатов предыдущих проверок в буфере ККТ.
2. Запрос статуса: Касса отправляет данные в ОФД. В коде 1С мы должны дождаться ответа. Это делается через методы beginMarkingCodeCheck и последующий getMarkingCodeCheckStatus.
3. Анализ результата: Если проверка прошла успешно, в объекте GoodCodeData передаются параметры для печати. В чеке появится заветный символ [М+].
Если вы работаете через типовые обработки обслуживания 1С (ATOLKKT.epf), убедитесь, что в функции СформироватьXMLПакетДляЧека логика заполнения GoodCodeData соответствует новым требованиям. Если конфигурация сильно изменена, как в случае автора темы, лучшим решением будет точечная доработка модуля формирования XML-строки с использованием условий по версии ФФД.
Проанализируем ситуацию, когда возникает ошибка Syntax error: value, object or array expected. Это часто случается, если в атрибут GS1.M попадает пустая строка или некорректно сформированный Base64. Убедитесь, что при конвертации в Base64 вы используете именно двоичные данные считанного кода, а не просто строку GTIN. Также проверьте, чтобы в XML не попадали запрещенные символы управления, которые сканер может добавлять в начало или конец строки кода.
Используйте метод XMLСтрока() для подготовки данных перед записью в атрибут, это поможет избежать проблем с типизацией данных внутри XML-пакета, передаваемого драйверу.