Как исправить ошибку передачи кодов маркировки для каждой позиции в чеке при работе с фискальным регистратором в 1С 7.7?

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

При работе с маркированными товарами в 1С 7.7 часто возникает ситуация, когда в кассу передается код маркировки только для последней позиции чека, либо данные затираются в процессе выполнения цикла. Разберем, как правильно организовать алгоритм работы с фискальным регистратором, чтобы каждая позиция была корректно обработана в соответствии с требованиями законодательства.

Основные причины возникновения проблемы

Прежде чем приступать к исправлению кода, проанализируем, почему возникает такая ошибка. Чаще всего проблема кроется в нарушении последовательности вызовов методов драйвера ККТ. Основные типичные ошибки включают:

  1. Вызов метода OpenCheck() внутри цикла обработки товаров. Это приводит к тому, что для каждой позиции открывается или сбрасывается новый чек, вместо добавления позиции в существующий.
  2. Отсутствие очистки или явного переопределения параметров маркировки (таких как GTIN и SerialNumber) перед отправкой данных для следующей строки.
  3. Некорректная последовательность методов FNOperation() и FNSendItemCodeData() (или их аналогов для вашего драйвера), из-за чего данные маркировки не «привязываются» к конкретной номенклатурной позиции.

Алгоритм правильной работы с маркировкой

Чтобы решить проблему, необходимо строго придерживаться следующего порядка действий:

  1. Инициализируйте соединение с фискальным регистратором до входа в цикл обработки списка товаров.
  2. Откройте чек один раз перед началом цикла, используя метод OpenCheck().
  3. Внутри цикла, при обработке каждой строки:
    • Передайте основные данные товара (наименование, цена, количество).
    • Выполните FNOperation().
    • Если товар маркируемый, присвойте свойствам объекта драйвера значения GTIN, SerialNumber и MarkingType.
    • Вызовите метод отправки данных маркировки, например FNSendItemCodeData().
  4. Закройте чек методом CloseCheck() только после завершения цикла.

Пример реализации корректного кода

Рассмотрим, как должен выглядеть фрагмент кода, отвечающий за корректную регистрацию позиций в чеке:


// Открываем чек до начала цикла
ФискальныйРегистратор.CheckType = 0;
Рез = ФискальныйРегистратор.OpenCheck();

Пока ОбрДок.ПолучитьСтроку() > 0 Цикл
    // Передаем основные данные позиции
    ФискальныйРегистратор.Price = ПредстЦена;
    ФискальныйРегистратор.Quantity = ОбрДок.Количество;
    
    // Регистрируем товар
    Рез = ФискальныйРегистратор.FNOperation();
    
    // Если товар маркируемый, передаем тег маркировки
    Если ПустоеЗначение(КТН) = 0 Тогда
        GTIN = Сред(КТН, 3, 14);
        SerialNumber = Сред(КТН, 19, 13);
        
        ФискальныйРегистратор.MarkingType = 17485;
        ФискальныйРегистратор.GTIN = GTIN;
        ФискальныйРегистратор.SerialNumber = SerialNumber;
        
        // Отправка данных маркировки
        Рез = ФискальныйРегистратор.FNSendItemCodeData();
    КонецЕсли;
КонецЦикла;

// Закрываем чек после обработки всех строк
ФискальныйРегистратор.CloseCheck();

Рекомендации по отладке и проверке

Для того чтобы окончательно убедиться в правильности работы программы, мы рекомендуем выполнить следующие шаги:

Следуя этой структуре, вы избавитесь от ошибки «затирания» кодов маркировки и обеспечите корректную передачу данных в ОФД для каждой позиции чека.

← На главную