При работе с маркированными товарами в 1С 7.7 часто возникает ситуация, когда в кассу передается код маркировки только для последней позиции чека, либо данные затираются в процессе выполнения цикла. Разберем, как правильно организовать алгоритм работы с фискальным регистратором, чтобы каждая позиция была корректно обработана в соответствии с требованиями законодательства.
Прежде чем приступать к исправлению кода, проанализируем, почему возникает такая ошибка. Чаще всего проблема кроется в нарушении последовательности вызовов методов драйвера ККТ. Основные типичные ошибки включают:
OpenCheck() внутри цикла обработки товаров. Это приводит к тому, что для каждой позиции открывается или сбрасывается новый чек, вместо добавления позиции в существующий.GTIN и SerialNumber) перед отправкой данных для следующей строки.FNOperation() и FNSendItemCodeData() (или их аналогов для вашего драйвера), из-за чего данные маркировки не «привязываются» к конкретной номенклатурной позиции.Чтобы решить проблему, необходимо строго придерживаться следующего порядка действий:
OpenCheck().FNOperation().GTIN, SerialNumber и MarkingType.FNSendItemCodeData().CloseCheck() только после завершения цикла.Рассмотрим, как должен выглядеть фрагмент кода, отвечающий за корректную регистрацию позиций в чеке:
// Открываем чек до начала цикла
ФискальныйРегистратор.CheckType = 0;
Рез = ФискальныйРегистратор.OpenCheck();
Пока ОбрДок.ПолучитьСтроку() > 0 Цикл
// Передаем основные данные позиции
ФискальныйРегистратор.Price = ПредстЦена;
ФискальныйРегистратор.Quantity = ОбрДок.Количество;
// Регистрируем товар
Рез = ФискальныйРегистратор.FNOperation();
// Если товар маркируемый, передаем тег маркировки
Если ПустоеЗначение(КТН) = 0 Тогда
GTIN = Сред(КТН, 3, 14);
SerialNumber = Сред(КТН, 19, 13);
ФискальныйРегистратор.MarkingType = 17485;
ФискальныйРегистратор.GTIN = GTIN;
ФискальныйРегистратор.SerialNumber = SerialNumber;
// Отправка данных маркировки
Рез = ФискальныйРегистратор.FNSendItemCodeData();
КонецЕсли;
КонецЦикла;
// Закрываем чек после обработки всех строк
ФискальныйРегистратор.CloseCheck();
Для того чтобы окончательно убедиться в правильности работы программы, мы рекомендуем выполнить следующие шаги:
GTIN и SerialNumber на каждой итерации. Если значения остаются прежними, значит, вы забыли их обновить для текущей строки.FNSendItemCodeData(). Это позволит увидеть, что именно отправляется в кассу.Следуя этой структуре, вы избавитесь от ошибки «затирания» кодов маркировки и обеспечите корректную передачу данных в ОФД для каждой позиции чека.