Маркировка на ККТ АТОЛ с ФФД 1.2

07.12.21

Учетные задачи - Кассовые операции

Реализация функций продажи/возврата маркированной продукции в ФФД 1.2 для ККМ марки АТОЛ для самописных конфигураций. DTO 10.9.1.0.

Всем доброго дня.

Уверен, что многие еще столкнутся с данной проблемой, после перепрошивки кассовых аппаратов АТОЛ на версию формата фискальных данных 1.2. Эта информация в основном для тех, кто поддерживает самописные конфигурации.

Ранее мы просто брали GTIN и серийный номер из маркировки, формировали 16-ричный код и записывали его в реквизит 1162.

Теперь этот путь закрыт.

Основная суть изменившегося подхода при пробитии чека - мы должны занести в память кассового аппарата полный код маркировки с криптохвостом, проверить его и проверенный код пробить в чеке, чтобы получить заветный [M+].

Мой код для отражения продажи/возврата маркированной продукции,передаваемой в Честный Знак, тестировалось на драйвере DTO 10.9.1.0:

 

	//Переменные на входе
	// Кассир - ФИО кассира
	// ВидЧека - "ПРОДАЖА" или "ВОЗВРАТ"
	// Телефон - телефон контрагента
	// ШтрихкодМаркировки - маркировка товара из системы Честный Знак 
	// Номенклатура - название товара
	// Цена,Количество,СуммаНДС (в примере 20%)
	// СуммаАванса,СуммаНал,СуммаБезнал
	
	//Переменные на выходе
	// НомерЧека, НомерДокумента
	
	//Обращаемся к объекту драйвера DTO10
	//Инициализируем параметры кассы.
	
	FR = Новый COMОбъект("AddIn.Fptr10"); 
	FR.setSingleSetting(FR.LIBFPTR_SETTING_MODEL, Строка(FR.LIBFPTR_MODEL_ATOL_AUTO));
	FR.setSingleSetting(FR.LIBFPTR_SETTING_PORT, FR.LIBFPTR_PORT_COM);
	FR.setSingleSetting(FR.LIBFPTR_SETTING_COM_FILE, 1);
	FR.setSingleSetting(FR.LIBFPTR_SETTING_BAUDRATE, 9600);
	FR.setSingleSetting(FR.LIBFPTR_SETTING_ACCESS_PASSWORD, "0");
	FR.setSingleSetting(FR.LIBFPTR_SETTING_USER_PASSWORD, 1);
	FR.applySingleSettings();
	
	Если FR.open()<>0 тогда //Соединение с ККТ 
		Сообщить("Ответ: "+FR.errorCode()+" Ошибка: "+FR.errorDescription());
		возврат;
	КонецЕсли;
	
	FR.setParam(1021, СокрЛП(Кассир));
	
	FR.operatorLogin();
	
	// После прошивки - важный параметр "Система налогообложения",
	// который слетает в неопределенность. 
	// Либо ставьте в драйверве в регистрации по умолчанию, либо указывайте явно
	FR.setParam(1055, FR.LIBFPTR_TT_OSN);
	//FR.setParam(1055, fptr.LIBFPTR_TT_ENVD);
	
	Попытка
		//стираем все запрошенные маркировки из памяти кассового аппарата
		FR.clearMarkingCodeValidationResult();
	Исключение
	КонецПопытки;	

	Если ВидЧека  = "ВОЗВРАТ" тогда
		FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL_RETURN);
	Иначе
		FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL);
	КонецеСли;
	
	FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, false);			

	Если не СокрЛП(Телефон) = "" тогда
		FR.setParam(1008, СокрЛП(Телефон));			
	КонецЕСли;	
	
	
	FR.openReceipt();
	
	status = 1;
	
	Разделитель = Символ(29);
	
	ПодготовленныйШК = СокрЛП(ШтрихкодМаркировки);
	
	ПодготовленныйШК = СтрЗаменить(ПодготовленныйШК,Разделитель,"");
	
	КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);
	
	//Получился код маркировки с восстановленными знаками GS1, если вдруг их не было в строке
	//Много где было сказано, что надо использовать только 16-ричную кодировку. Это не так.
	
	
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_TYPE, FR.LIBFPTR_MCT12_AUTO);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE, КМ);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, Истина);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);					
	
	FR.beginMarkingCodeValidation();
	ВремяНачала = ТекущаяДата();
	ВремяОжидания = 100;
	
	// Начало проверки 
	Пока истина Цикл
		FR.getMarkingCodeValidationStatus();
		Если FR.getParamBool(FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY) тогда
			прервать;
		КонецЕсли;	
		Если ТекущаяДата() - ВремяНачала > ВремяОжидания тогда
			прервать;
		КонецЕсли;	
	КонецЦикла;
	
	validationResult = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
	
	FR.acceptMarkingCode();
	
	//Наш штрихкод проверен и занесен в память аппарата
	// Теперь его ОБЯЗАТЕЛЬНО надо повторить в самой продаже
	// Если этого не сделать - то ничего и не отошлется
	
	FR.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME,СокрЛП(Номенклатура));
	FR.setParam(FR.LIBFPTR_PARAM_PRICE, Окр(Цена,2));
	FR.setParam(FR.LIBFPTR_PARAM_QUANTITY, Количество);
	FR.setParam(FR.LIBFPTR_PARAM_TAX_TYPE,FR.LIBFPTR_TAX_VAT20);
	FR.setParam(FR.LIBFPTR_PARAM_TAX_SUM, СуммаНДС);
	
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE, КМ);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
	FR.setParam(FR.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);	
	
	Если FR.registration() <> 0 тогда
		Сообщить("Ответ: "+FR.errorCode()+" Ошибка: "+FR.errorDescription());
        FR.cancelReceipt();
        Возврат;
	КонецЕсли;
	
	//Оплата
	Если СуммаАванса>0 тогда
		FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_PREPAID);
		FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, СуммаАванса);
		FR.payment();
	КонецеСли;
	
	Если СуммаНал>0 тогда
		FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_CASH);
		FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, СуммаНал);
		FR.payment();
	КонецеСли;
	
	Если СуммаБезнал>0 тогда
		FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_ELECTRONICALLY);
		FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, СуммаБезнал);
		FR.payment();
	КонецеСли;
	
	FR.closeReceipt();
	
	//открыть ящик
	FR.openDrawer();
	
	FR.setParam(FR.LIBFPTR_PARAM_DATA_TYPE, FR.LIBFPTR_DT_STATUS);
	FR.queryData();
	
	НомерЧека       = FR.getParamInt(FR.LIBFPTR_PARAM_RECEIPT_NUMBER);
	НомерДокумента  = FR.getParamInt(FR.LIBFPTR_PARAM_DOCUMENT_NUMBER);
	

 

АТОЛ ФФД 1.2 ошибка 1162

См. также

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА (Разрешит. режим) + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

6000 руб.

27.02.2017    776764    4716    9507    

2806

54-ФЗ и Разрешительный режим. Обработки для подключения онлайн-касс к 1С 8 (поддержка Маркировки) + Эмулятор + ФФД 1.2

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима.

5400 руб.

25.05.2015    323784    1865    3029    

1008

Обмен между 1С:Розница и Frontol 6 по организациям (Розница - Фронтол)

ККМ Розничная торговля Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обмен между 1С:Розница и Frontol 6 при торговле от нескольких организаций, а также ряд других полезных функций. Данный модуль синхронизации незаменим для тех, кто ведёт учет по нескольким организациям в 1С:Розница, а на РМК (рабочем месте кассира) установлен Frontol или планируется его установка. Подходит для 1С:Розница 2.3 / 3.0, 1С:УНФ 3.0

1500 руб.

22.03.2019    80623    432    478    

173

Печать кассовых чеков на одну ККМ с нескольких рабочих мест для 1С:УТ11.х, КА2.х, Розница 2.х, УНФ, ERP 2.х, БП 3, БГУ2

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.4, 11.5, КА 2.4, 2.5, Розница 3.0, 2.3 и 2.2, УНФ 1.6, УНФ 3x, ERP 2.4, 2.5, БП 3, БГУ2 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4000 руб.

27.08.2018    117515    1002    566    

839

Загрузка чеков в 1С из ФНС в документы БП, УНФ, ERP, КА и УТ

Кассовые операции Файловый обмен (TXT, XML, DBF), FTP ЭДО и ОФД Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)

В публикации размещены специализированные обработки для загрузки кассовых чеков в базах 1С (для локальных баз): '1С:Бухгалтерия предприятия, ред. 3.0', '1С:Управление нашей фирмой 8, ред. 3.0', '1С:Комплексная автоматизация, ред. 2.5', ‘1С:ERP Управление предприятием, ред. 2’ и ‘1С:Управление торговлей, ред. 11.5’. Вы просто сканируете QR коды с бумажных и электронных чеков c помощью мобильного приложения ФНС и чеки автоматически (без ручного ввода) загружаются в документы 'Авансовый отчет', 'Расходы предпринимателя', 'Путевой лист', 'Приходная накладная', 'Поступление (акты, накладные, УПД)', 'Приобретение товаров и услуг', 'Отчет о розничных продажах' и 'Поступление денежных документов'.

12960 руб.

19.08.2020    66236    309    73    

213

Загрузка данных из ОФД в 1С:Бухгалтерию 3.0, 1С:КА 2.4, 2.5, УНФ 1.6/3.0 о денежных поступлениях (чеках)

Кассовые операции ЭДО и ОФД Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Платные (руб)

Согласно 54-ФЗ по правилам ведения кассовых операций необходимо оформлять приходные кассовые ордера (ПКО) и расходные кассовые ордера (РКО) на основании чеков ККМ. Все данные о чеках, можно взять на сайте оператора фискальных данных (ОФД). Обработка загрузки данных из ОФД в 1С сделает за вас в 1С - ПКО и РКО, Операции по платежным картам или Отчет о розничных продажах (может создать номенклатуру в 1С, указать налоги и др. реквизиты в документах в зависимости от налогообложения ККМ в торговой точке). Проверено на: OFD.RU / Первый ОФД / Такском / Платформа ОФД / Ярус / ОФД Яндекс / ОФД Астрал /ОФД СБИС / Гарант ОФД / КОРУС ОФД / КОНТУР ОФД / ОФД АО Тандер / ИнитПро / Группа Элемент/

3600 руб.

09.08.2017    149038    874    372    

531

Программа для управления ККМ Атол и Штрих нового поколения (он-лайн ККТ под 54-ФЗ) с помощью текстового ini.файла для 1с77, 1с8Х любых конфигураций

Кассовые операции ККМ Системный администратор Программист Бухгалтер Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Программа для управления ККМ Атол и Штрих нового поколения (он-лайн ККТ под 54-ФЗ) с помощью текстового файла (ini файла) с изменениями включена 1 лицензия Для любых программ, которые умеют работать с текстовыми файлами. Внутри комплекта есть готовые к использованию обработки

4800 руб.

31.07.2017    167146    571    605    

197

Пробитие чека ККМ с разных складов через РМК в УТ 11

Кассовые операции ККМ Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Россия Управленческий учет Платные (руб)

Расширение для 1С:Управление торговлей 11.5, которое позволяет пробивать чеки ККМ и списывать товар с разных складов. Склад списание товара можно указывать в табличной части рабочего места кассира (РМК).

5880 руб.

12.04.2023    8357    34    2    

28
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. quazare 3705 07.12.21 11:15 Сейчас в теме
прошу дополнить на какую версию драйвера написан код под объект

FR = Новый COMОбъект("AddIn.Fptr10");
126. user976872 13.06.23 20:28 Сейчас в теме
(1) можно с Вами связаться ? нужна помощь по ффд 1.2 в самописной конфе
2. quazare 3705 07.12.21 11:16 Сейчас в теме
не увидел на драйвере DTO 10.9.1.0

извините....
3. aximo 2039 07.12.21 14:06 Сейчас в теме
есть ли у вас ссылка на описание методов объекта Fptr10 ? Поделитесь пожалуйста здесь
5. slava_1c 550 07.12.21 14:43 Сейчас в теме
10. пользователь 16.12.21 10:32
Сообщение было скрыто модератором.
...
6. lvictor58 135 10.12.21 14:39 Сейчас в теме
А заветный [M+] сам пропишется в чеке или его потом руками подрисовывать надо будет? У меня есть клиент, работающий на ТиС 7.7 там в обработке пробития чека на ФР его в виде строки добавляют.
7. slava_1c 550 10.12.21 15:53 Сейчас в теме
(6)Так в том то и дело что сам прописывается. Это признак того что касса сама ПРОВЕРИЛА этот код. Ничего руками добавлять не нужно.
8. boevik 2 13.12.21 21:11 Сейчас в теме
9. slava_1c 550 13.12.21 22:20 Сейчас в теме
(8) Нет, не делал, но судя по описанию АПИ - там, вроде как, все описано:

http://integration.atol.ru/api/?csharp#fiskalnye-cheki

{
    "type": "sell",
    "validateMarkingCodes": true,
    "operator": {
        "name": "Иванов",
        "vatin": ""
    },
    "electronically": false,
    "items": [
        {
            "type": "position",
            "name": "*3282705 Товар",
            "price": 299.95,
            "quantity": 1.0,
            "measurementUnit": "piece",
            "amount": 299.95,
            "infoDiscountAmount": 0.0,
            "tax": {
                "type": "vat20",
                "sum": 0.0
            },
            "paymentObject": "commodityWithMarking",
            "paymentMethod": "fullPayment",
            "imcParams": {
                "imcType": "auto",
                "imc": "MDEwMjkwMDAwMDQ3NTgzMDIxTWRFZng6WHA2WUZkNx05MTgwMjkdOTJhUUl­Ra0k3b0hYbXpHL21kS3h6Q1VDS1RKSFhvQk9EZG1DZE01azhRajdnYVpWMnh­ibjY2eEJYR0lLcnRmdnFQSU5BMmprYmp5ajMvTytreTZvdTFOQT09",
                "itemEstimatedStatus": "itemPieceSold",
                "imcModeProcessing": 0
            }
        }
    ],
    "payments": [
        {
            "type": "0",
            "sum": 300.0
        }
    ],
    "taxes": [],
    "total": 299.95,
    "clientInfo": {
        "emailOrPhone": "address@mail.ru"
    },
    "companyInfo": {
        "email": "test@ofd.ru"
    }
}
Показать
11. OlegK14 12.01.22 20:42 Сейчас в теме
Пробовал получить КМ с вашим алгоритмом вставки GS1 (КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);) и вот какая штука получается. В 1 с в сообщении он выводится полнистью, символ GS1 не виден как положено но если его скопировать в блокнот то два последних символа пропадают.
12. slava_1c 550 12.01.22 21:46 Сейчас в теме
(11)Не очень понял, если честно, что значит пропадают символы при копировании в блокнот. Суть алгоритма в том, чтобы сначала полностью избавиться от символов разделителя GS1 (был он или не был в строке - не важно), а затем точно его добавить. В этом случае никаких лишних символов точно не будет. Рекомендую Notepad++ он скрытые символы прекрасно показывает.

Для примера:

И такой код
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacg­OKUkJyRAlnsUB/0rAiHfzFUk=

И такой код
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacgOK­UkJyRAlnsUB/0rAiHfzFUk=

на выходе должны дать

010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacg­OKUkJyRAlnsUB/0rAiHfzFUk=
13. user1313774 17.01.22 19:18 Сейчас в теме
Формула КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);
любопытна.
А как насчет того, что для фототоваров серийный номер (то, что находится после кода применения 21) содержит не 13 символов, а больше?
А код маркировки молочной продукции для групповой упаковки меньше.
А с табаком там вообще фиг поймешь
14. slava_1c 550 18.01.22 00:02 Сейчас в теме
(13) Спасибо за замечание.

Минули меня стороной данные типы маркированной продукции, однако данный пост скорее показывает как без ошибки сформировать чек на ККТ АТОЛ с ФФД 1.2, нежели универсальный алгоритм замещения символов.

Тогда оговорюсь - алгоритм замещения символов корректен для шин, одежды, обуви.

В других типах маркировки следует обращать внимание на описанный в Честном Знаке формат маркировки.

А сколько этих типов завтра придумают одному Алишеру известно..
21. KVIKS 407 02.02.22 01:22 Сейчас в теме
(13)Для табака на пачке для на кода 29 символов - брал ее всю целиком, на выходе получил М+
15. user1313774 18.01.22 10:33 Сейчас в теме
Ну, справедливости, ради я бы отметил, что документация по форматам маркировки после табака становится более-менее вменяемой с каждым новым видом продукции

А еще буду очень благодарен тем, кто сталкивался с работой маркировки ФФД 1.2 в реальных условиях и смог бы проконсультировать меня по таким вопросам:
1. В документации по драйверу и примерам обычно описывается ситуация, когда код маркировки проверяется в момент формирования чека, ну или до его открытия. Сколько в среднем занимает по времени проверка кода маркировки онлайн?
Мне хотелось бы организовать эту проверку на этапе добавления товара в реализацию до формирования фискального чека, чтобы можно было уже на этом этапе отказаться от продажи товара, если проверка кода была неуспешна.
2. Как средствами драйвера организовать проверку оффлайн и нужно ли это? Если я правильно понимаю, то оффлайн проверка это проверка кодов самим ФН. Откуда они там берутся и что такое "ключ проверки", упоминаемый в документации?
3. Судя про приведенному примеру, чек будет сформирован на все товары, если маркировка успешна будет напечатано "М+", если нет, то "М-". Что потом делать с товарами, которые продались с "М-"?
16. slava_1c 550 18.01.22 20:01 Сейчас в теме
(15) Чисто из своих наблюдений.

1. Онлайн проверка кода занимает немного времени - буквально секунды (я имею ввиду розничную продажу, когда кодов от силы 4 (например шины)) НО. Я пробовал проверить коды без открытия чека, а потом их продать - ругается аппарат. Только после того как чек открыт , прошла проверка, коды маркировки подтянулись - все отрабатывает как надо. Как вариант - можно чек открыть, проверить и отменить, однако проще по-моему проверить статус непосредственно через АПИ Честного знака. Это те же секунды. Правда, для этого на компьютере должна быть электронная подпись. Да и нужно ли их проверять в момент продажи - вопрос. Приняли товар, проверили коды и забыли. А далее уже в момент онлайн проверки ККМ - чтобы [M+] получить.

2. Оффлайн проверка, как я понял - это проверка на формат самой маркировки. Нужно указать тип маркировки и аппарат проверит, что код маркировки валиден. Естественно, о том, есть он в Честном знаке или нет и в каком он статусе, аппарат не скажет.

3. Если хоть один код маркировки не пройдет проверку, чек не нужно печатать - товар который не прошел проверку нужно заменить на другой.
17. user1313774 19.01.22 11:10 Сейчас в теме
(16) Огромное спасибо! В данный момент под рукой нет аппарата под ФФД 1.2, приходится работать "вслепую".
26. user1141799 18.02.22 08:55 Сейчас в теме
(16)
. Если хоть один код маркировки не пройдет проверку, чек не нужно печатать - товар который не прошел проверку нужно заменить на другой.



Добрый день. Подскажите где в 1с Ка 2.4 увидеть, что код маркировки не прошел проверку? Я только в самом чеке это вижу.
18. alexey-simf 14 21.01.22 15:50 Сейчас в теме
Сейчас как раз воюю с ФФД 1.2 (Самописный кассовый клиент не 1С, который взаимодействует с фискальником через JSON).
В документации от Атола есть метод "validateMarks" ("Проверка массива КМ"), который позволяет проверить массив данных о кодах маркировки (далее КМ) в одно действие; результатом является массив результатов проверки каждого из КМ (порядок в ответе соответствует порядку в запросе). Если я правильно понял, то выигрыш в сравнении с методом "beginMarkingCodeValidation", как минимум, в отсутствии необходимости опрашивать фискальник на наличие результата после каждого КМ.

На fs.atol.ru / Программное обеспечение / ДТО / 10.х / существует файл "Работа с ФФД 1.2.pdf". В нём для JSON есть три блок-схемы взаимодействия с фискальником, во второй из них как раз используется метод "validateMarks".
В том же pdf есть пример, где параметр "validateMarkingCodes" в методе "sell" используется со значение "false", т.е. в этом методе уже не надо повторно выполнять проверку КМ, а только записать их чтобы фискальник передал их ОФД.

Ещё раз повторюсь, я сейчас только разбираюсь и потому уверенность в своих выводах не стопроцентная.
19. slava_1c 550 21.01.22 17:44 Сейчас в теме
(18)Возможно JSON будет работать немного по другому, нежели команды.

У меня как раз и не получалось сначала ВСЕ проверить, а потом просто указать коды с признаком успешной валидации.

Когда я делал проверку валидации отдельно, до открытия чека, - он упорно не отсылал код в ЧЗ и признак [M+] не ставил.

Поэтому я оставил построчную проверку и отправку внутри открытого чека.

Попробуйте - возможно в варианте JSON запроса все отработает как нужно. Удачи в тестировании!
20. Dark_Warrior56 27.01.22 16:13 Сейчас в теме
(18) Скажите, вам удалось победить проверку КМ через json?)
22. alexey-simf 14 03.02.22 18:03 Сейчас в теме
(20)
Хорошие примеры, позволяющие понять последовательность, нашёл в онлайн документации от атола (integration. и далее).
Слева выбрать "Работа с марками в ФФД 1.2" а справа смотреть примеры для "Python" или "Java"

Примеры JSON
Dark_Warrior56; +1 Ответить
23. Dark_Warrior56 03.02.22 21:32 Сейчас в теме
(22) Спасибо, в мануал поглядываю. "validateMarkingCodes" не использовал, правда.
Подскажите, как вы кодируете КМ? Я беру полный КМ (с криптохвостом), меняю GS1 на символ(29) и перегоняю в Base64. КМ в таком виде нормально принимает тест маркировки в ДТО, но он же в json возвращается с ошибкой "409 Некорректный код маркировки".
24. alexey-simf 14 04.02.22 11:03 Сейчас в теме
(23)
Подскажите, как вы кодируете КМ? Я беру полный КМ (с криптохвостом), меняю GS1 на символ(29) и перегоняю в Base64
Это делает разработчик кассовой программы (на C#), но по сути так же, только без замены символов; всегда только полный код с криптохвостом.

Я сначала в тестовой утилите занимался отладкой JSON, а когда получилось полностью прогнать всю цепочку действий, тогда отдал эти JSONа разработчику кассовой программы.

В случае ругательств на некорректность КМ я всегда дополнительно проверял их в УТ 11: Закупки - Обмен с ИС МП - (см. также) Проверка кодов маркировки - получалось информативней. Причём как в base64, так и в чистом виде.
Dark_Warrior56; +1 Ответить
25. Dark_Warrior56 08.02.22 13:29 Сейчас в теме
(24) Если что, проблема решилась добавлением в json параметра "validateMarkingCodes": true и настройкой в драйвере "Для проверки КМ использовать прямой доступ к ФН-М". Это если кто-то забредет в эту ветку с аналогичной проблемой.
27. alexey-simf 14 05.03.22 11:35 Сейчас в теме
(25) Вчера как раз столкнулся с проблемой. В тестовой утилите при установленной галочке про прямой доступ к ФН-М json-запрос возвращал корректный результат, а без этой галочки, была ошибка 402 на тему отсутствия связи (вчера с DNS-проблемы были в Крыму, а может и по всей РФ). В то же время, кассовое ПО, отправляя json-запрос драйверу через web-сервис всегда получало ошибку 402, словно упомянутая галочка игнорировалась :(
28. user897732 15.03.22 11:11 Сейчас в теме
Добрый день! А подскажите, пожалуйста, один момент.
В целом в принципе то все понятно, но вот, что в Вашем примере:

validationResult = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
FR.acceptMarkingCode();

что в примерах того же Атола, выходит, что Вы получаете результат проверки и сразу же делаете акцепт.
То есть акцепт никак не зависит от результатов проверки? А как же тогда это: " Если хоть один код маркировки не пройдет проверку, чек не нужно печатать - товар который не прошел проверку нужно заменить на другой."

Тем более у Вас там таймаут есть при проверке, то есть КМ в принципе может даже не завершить еще проверку,
что тогда будет в validationResult? Ноль?
29. slava_1c 550 15.03.22 13:23 Сейчас в теме
(28) Добрый день.

Смысл том что в цикле мы сначала запрашиваем статус функцией FR.getMarkingCodeValidationStatus();

и если переменная FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY равна TRUE,

то тогда цикл прерывается и уже в переменную FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT записывается результат проверки.

Цикл также может прерваться по таймауту, но в случае проверки одного кода - этого таймаута достаточно.

Т.е. проверка происходит в цикле выше, а не в конструкции getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
30. user897732 15.03.22 13:40 Сейчас в теме
(29) Я понимаю, что проверка происходит в цикле, но ведь то что переменная FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY равна TRUE, означает, что проверка завершилась, но это ведь не означает, что она прошла успешно? Наверняка могут быть какие нибудь ошибки.
И опять же, что возвращается в этом параметре:

validationResult = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);

если цикл завершился по таймауту?
31. user897732 15.03.22 13:45 Сейчас в теме
(29) Есть же кроме LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT еще и LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR, который возвращает ошибку онлайн проверки,
вот я и не могу понять, почему ни в Вашем примере ни в Атоловском это не проверяется
32. slava_1c 550 15.03.22 14:53 Сейчас в теме
(31) Результат в любом случае, неуспешно по таймауту он завершился или же успешно устанавливается в переменную LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT в момент регистрации чека.

В любом случае, если результат не удовлетворительный, чек не пробьется по ошибке в момент регистрации

FR.registration() <> 0
33. user897732 15.03.22 15:03 Сейчас в теме
(32) А ну вот что то такое я подозревал, только не смог найти нигде подтверждения.
Спасибо большое. Пока не на чем было тестироваться, возможно завтра наконец привезут МГМ с ФФД 1.2
и тогда все станет окончательно ясно.
34. user897732 15.03.22 15:07 Сейчас в теме
(32) да, прошу прощения за беспокойство еще раз,
остался еще один непонятный момент, метод writeSalesNotice
в документации числится для передачи уведомления о реализации товара,
а в Вашем примере его нет, он не обязателен?
35. slava_1c 550 15.03.22 15:35 Сейчас в теме
По тексту в комментариях я указывал что тестировал и внедрял данный код на шинах и обуви

Для товарных групп: Шины, Легкая промышленность, Духи, Обувь, заполнять тег 1265 "Значение отраслевого реквизита" не требуется.

Если у Вас необходимо отправлять уведомление, то значит нужно выполнять этот метод.
38. user897732 16.03.22 10:07 Сейчас в теме
(35) Понял, спасибо, у нас лексредства, сейчас буду узнавать для них
36. alexey-simf 14 15.03.22 16:51 Сейчас в теме
Хочу поделиться новыми знаниями.

Ранее я приводил пример проверки массива кодов маркировки (validateMarks). Результат может быть двух видов (визуально, не обращая внимания на значения)

Если фискальник смог связаться с сервисом проверки кодов


Если фискальник НЕ смог связаться с сервисом проверки кодов


В обоих случаях ответ содержит секцию "itemInfoCheckResult".

В описании API на integration_atol_ru есть "Пример чека прихода (предварительная проверка маркированного товара под ФФД ≥ 1.2, передача кода маркировки)". Который, по сути, является примером использования метода "sell".
У этого метода есть параметр "items", содержащий данные строк. Для каждой строки может быть задано много параметров, но нам сейчас важен "imcParams". В этом объекте есть несколько параметров, среди которых есть "itemInfoCheckResult" (Результат проверки). Так вот, в случае регистрации чека ("type": "sell") при "validateMarkingCodes": false (проверка КМ проводится заранее и не проводится в момент регистрации) в упомянутый чуть выше параметр строки "itemInfoCheckResult" следует передавать набор значений, полученный ранее при проверке КМ по массиву (validateMarks). Этот результат определяет какой вариант будет напечатан в чеке: М / М- / М+.
37. slava_1c 550 15.03.22 17:32 Сейчас в теме
(36) Забавно. Получается, можно безо всякой проверки заполнить эту структуру правильными флагами и регистрировать чеки с [M+] вообще ничего не проверяя...
39. alexey-simf 14 24.03.22 17:10 Сейчас в теме
(37) ну вроде так, если я правильно всё это понимаю.

Задавал вопрос в Атол:
Существует ли способ выполнить продажу маркированных духов если на кассе
временно отсутствует доступ в интернет?


Получил ответ:
конечно существует
послали запрос на проверку

получили статус "сервер ИСМ не отвечает"
с этим статусом и произвели регистрацию


Т.е. разработчик ПО "сам" указывает статус, с которым будет происходить регистрация. Скорее всего, в коммерческих решениях всё сделано правильно, но вот в самописных...
40. speedwagon33 04.04.22 23:46 Сейчас в теме
Можете пожалуйста помочь, уже всю голову сломал. Пытаюсь передать маркированные шины - все очень худо. Все время возвращается ошибка с неверной передачей кода маркировки. Код отсканирован через сканер. Но ошибка со стороны кассы летит и летит. В чем проблема?
41. slava_1c 550 05.04.22 04:29 Сейчас в теме
(40) Слишком мало информации.

1. Какой код ошибки и описание ошибки?
2. Какой-то конкретный код не передается, а остальные передаются? Если да, то его желательно показать
3. Что пишет лог кассы?
4. Пользуетесь для передачи программным кодом из публикации или чем-то другим?
42. speedwagon33 05.04.22 07:17 Сейчас в теме
(41)1) Возвращает код ошибки 409 - неверная маркировка. При попытке проверить валидность кода в цикле пишет что код не найден в КМ. 422 вроде бы ошибка
2)Тестировал на двух кодах - оба не передаются
3)Лог могу куда нибудь в мессенджер прислать
4)Использую почти полностью код твой, только момент подключения к ККМ другой. Там стучит по tcpip, но думаю это не принципиально, связь с кассой есть.
43. speedwagon33 05.04.22 08:43 Сейчас в теме
(41) Пример кода:
0104717784236841215ga2rHsmCq>?H91EE0692MbGeVwKZokrwRA64WXuL/opbsb/23lBNggP0z9jnzX8=


Лог кассы возвращает:
2022.04.05 08:39:25.005 T:00012204 INFO [FiscalPrinter] libfptr_get_marking_code_validation_status()
2022.04.05 08:39:25.005 T:00012204 ERROR
[FiscalPrinter] Объекту 0x1C651D68 присвоен код ошибки 422 [Данный КМ отсутствует в таблице]


Уже попробовал даже в 64Base передать - всё равно безуспешно. Лог уже набился на 600 мб от таких манипуляций :)
44. speedwagon33 05.04.22 08:44 Сейчас в теме
(41)
При регистрации чека следующее в логе:

2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = "Шина R15 195/50 MAXXIS (лето)"
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 6160
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = 6
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "30 31 30 34 37 31 37 37 38 34 32 33 36 38 34 31 32 31 35 67 61 32 72 48 73 6D 43 71 3E 3F 48 39 31 45 45 30 36 39 32 4D 62 47 65 56 77 4B 5A 6F 6B 72 77 52 41 36 34 57 58 75 4C 2F 6F 70 62 73 62 2F 32 33 6C 42 4E 67 67 50 30 7A 39 6A 6E 7A 58 38 3D"
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = 1
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 0
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = 6
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_DEPARTMENT (65568) = 1
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] libfptr_registration()
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] output > 34
2022.04.05 08:39:25.026 T:00012204 INFO [Transport] send fiscal (1D) 1D 40 33 34 (4 bytes total)
2022.04.05 08:39:25.031 T:00012204 INFO [Transport] recv fiscal (1D) 1D 30 30 34 3B 34 3B 34 3B 32 36 32 3B (13 bytes total)
2022.04.05 08:39:25.031 T:00012204 INFO [FiscalPrinter] input < 4;4;4;262;
2022.04.05 08:39:25.031 T:00012204 INFO [FiscalPrinter] Чтение таблицы КМ (0 элементов)
2022.04.05 08:39:25.031 T:00012204 ERROR [FiscalPrinter] Объекту 0x1C651D68 присвоен код ошибки 409 [Некорректный код маркировки]
2022.04.05 08:39:25.031 T:00012204 INFO [FiscalPrinter] libfptr_close()
45. rinat_az 32 05.04.22 09:58 Сейчас в теме
На лекарствах такой вариант почему то не проходит, поэтому я загоняю код через setParamStrHex в hex-ах.
Но вопрос по тегу 1261 (отраслевой стандарт ) если в одном чеке и лекарства и молоко и вода. кто нибудь в курсе как быть? в ФФД 1.1 mdlp указывается для конкретно позиции, т.е. все понятно, а в ФФД 1.2 он же на весь чек..
46. speedwagon33 05.04.22 11:40 Сейчас в теме
(45) Выше ныл, разобрался в чём дело. Нужно правильно расставить непечатаемые символы. Все дело исключительно в них. Не обязательно в 16СС всё это дело переводить.
У меня вопрос с шинами стоял.
Нужно смотреть лог - сейчас в логе корректно начали проставляться символы 29 - до этого криво прилетало.

				
ПодготовленныйШК = СокрЛП(СокрЛП(Т[Сч].ЧестныйЗнак));
				
ПодготовленныйШК = СтрЗаменить(ПодготовленныйШК,Разделитель,"");
	
КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);


Как то так у меня это выглядит, так же как и у ТС
48. slava_1c 550 05.04.22 14:02 Сейчас в теме
(46) Прекрасно, что разобрались, поздравляю. Кстати, для проверки работы сканера на самом сайте Честного знака есть специальный сервис проверки. Если сканер подключен как эмулятор клавиатуры - сначала нужно проверить сканирование на нем.
У клиента были сканеры, которые просто не считывали спецсимволы.
47. speedwagon33 05.04.22 11:41 Сейчас в теме
(45) В ФФД 1.2 убрали поддержку ТЭГа 1261, сами только вчера на новый формат данных перешли.
49. rinat_az 32 06.04.22 08:42 Сейчас в теме
(47)
и поддержку ТЭГа 126
а есть какоето постановление, документ... Че-то сижу трясу инет и нет ничего везде только рекомендации по заполнению..
50. slava_1c 550 06.04.22 12:51 Сейчас в теме
(49) Как написано в самом АТОЛе
"В уведомление о реализации товара с КМ также можно передать данные о реализации маркированного товара с помощью метода writeSalesNotice(), который принимает параметры:
1228 - ИНН клиента
1261 - отраслевой реквизит чека (можно несколько)" Т.е. несколько допустимо
https://integration.atol.ru/api/?csharp#proverka-km
51. Tarlich 116 12.04.22 20:43 Сейчас в теме
Просьба пример цикла когда несколько товаров (и не весь маркируемый)
и если можно пример когда когда продаем количество меньше одного (т.е вскрыли пачку и продаем частями , то все равно должны указать марку)
52. slava_1c 550 15.04.22 04:24 Сейчас в теме
(51) хмм... если честно, не думал что это может вызвать какие то трудности, да и зависит все от конкретной реализации - я же не знаю как у вас реализовано хранение кодов маркировки. Если там же где товары, тогда выборка по товарам, если в отдельной таблице, тогда это будет запрос или перебор двух таблиц с поиском по идентификатору строки.

Грубо так:

Для каждого стр из Товары Цикл

    Если стр.Товар.ВидНоменклатуры = ВидМаркируемогоТовара тогда
         
        ШтрихкодМаркировки = стр.ШтрихкодМаркировки;

        ПодготовленныйШК = СокрЛП(ШтрихкодМаркировки); 
        ....
        FR.acceptMarkingCode();

    КонецЕсли;

КонецЦикла;
Показать



все коды проверили, если все акцептовалось - дальше уже цикл самой продажи.

Продажа меньше одного - это, я так понимаю, работа с SSCC кодами упаковок и агрегацией. По идее вложенные на этапе упаковки конечные коды маркировки должны без проблем пробиваться при продаже поштучно через ККМ.
53. Бит 74 05.05.22 08:05 Сейчас в теме
Может кто подскажет, не удаётся проверить марку пачки сигарет (в том числе и драйвером атола) как пример qr - 04640030090846KjbdAiJ
base64 - MDQ2NDAwMzAwOTA4NDZMNTtValdI
MarkingCode - HTA0NjQwMB0zMDA5MDg0NktqYmRBaUo=
Заранее большое человеческое спасибо
54. slava_1c 550 05.05.22 08:39 Сейчас в теме
Не занимаюсь сигаретами, но ради интереса на пачке отсканировал код - 00000046206008NWqX<Q<AC68mC3I

Он в ЧЗ без проблем бьется

Может наведет на мысль.

У вас в примере какой то очень короткий получается. И не бьется естественно.
55. Бит 74 05.05.22 15:53 Сейчас в теме
В том то и дело, что проверка пачки через честный знак проходит (сама пачка получена через запрос о составе блока), но проверка не проходит не в 1с, не в драйвере атола, вот и удумаю где косяк в драйвере атола (релизе прошивки или самом драйвере) или в алгоритме преобразования MarkingCode. Думал может кто проверит и даст какой у него получается MarkingCode на рабочей базе в которой отправляются марки. Это хоть как то сузит разброс возможных проблем. Сами атоловцы отправили в драйвер и все на этом.
56. Бит 74 12.05.22 02:43 Сейчас в теме
(54) да Вы оказались правы, проблема в отсутствии криптохвоста у марки пачки (так как сами марки получаются через запрос содержимого блока) через ЧЗ, а он возвращает без криптохвоста. Может кто сталкивался с проблемой пробития ффд 1.2 марки без криптохвоста. Или это безвыходная ситуация?
57. slava_1c 550 12.05.22 06:58 Сейчас в теме
(56)Да в том то и дело, что при проверке подразумевается полный код с криптохвостом. Однако, выше по сообщениям (36) описан алгоритм без проверки кодов. Можно попробовать копнуть туда.
58. balirinka 18.05.22 17:16 Сейчас в теме
Без крипто-хвоста бьется, но проверку не пройдет, будет [M-] на чеке. А почему вы запрашиваете состав блока? Если блок отсканировали, то можно передать код блока с крипто-хвостом на кассу.
59. пользователь 03.06.22 21:23
Сообщение было скрыто модератором.
...
60. пользователь 04.06.22 16:06
Сообщение было скрыто модератором.
...
61. user1796722 09.06.22 07:29 Сейчас в теме
Добрый день. Тоже мучаюсь с кодом маркировки шин. Можно пример корректного КМ из файла логов. Уже голову сломал что нужно еще докрутить чтобы Код прошел проверку.

Приходит ответ что КМ имеет некорректный формат
Вот код маркировки из логово
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacg­­OKUkJyRAlnsUB/0rAiHfzFUk=
62. user1796722 09.06.22 10:19 Сейчас в теме
Я правильно понимаю:

01 04717784236841 21 - это GTIN
5ga2rHsmCq>?H - это серийный номер
92MbGeVwKZokrwRA64WXuL/opbsb/23lBNggP0z9jnzX8= - это GTIN и серийный номер в строке кодировки base64

Откуда берется часть кода "91EE06"? Или это константа и всегда принимает такое значение?
63. slava_1c 550 09.06.22 13:49 Сейчас в теме
64. user1796722 10.06.22 04:52 Сейчас в теме
65. elenikiti 04.07.22 12:18 Сейчас в теме
Добрый день. Самописная конфигурация на 77. Работаем пока в тестовом контуре.
При печати чека с одним кодом всё ОК. При попытки пробить два товара с КМ на втором товаре ошибка:
Ответ 26 Ошибка Неверный формат команды
Проверяю КМ в цикле по товарам. Чек уже открыт.
Посоветуйте пожалуйста, что с этим делать?
66. slava_1c 550 04.07.22 17:29 Сейчас в теме
(65)
Ответ 26 Ошибка Неверный формат команды


Добрый день.

Первым делом посмотрите в логе ККМ - что вызвало ошибку.

В 90% случаев - ошибка становится ясна.

Также напомню то, что говорил выше: проверка товаров на предмет валидации кодов
FR.acceptMarkingCode()
должна проводиться непосредственно перед отправкой строки чека на регистрацию
67. elenikiti 05.07.22 09:09 Сейчас в теме
К сожалению в логе мало что понимаю, фактически не работала с кассами до этого момента.
Думаю это вот этот фрагмент:
2022.07.05 09:04:01.011 T: T:0000217C ERROR [FiscalPrinter] Код ошибки ККТ - 3635h
2022.07.05 09:04:01.011 T: T:0000217C ERROR [FiscalPrinter] Объекту 0x04AA4340 присвоен код ошибки 410 [Неверное состояние процесса проверки КМ]
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = "А/ш ш 195/55/16 PIRELLI Formula Ice 91T. ЦЕНА ПО АКЦИИ."
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MEASUREMENT_UNIT (65851) = 0
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0108019227248081215Ckth%XdlI0al"
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 65886
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 10
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = 7
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1212 (1212) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1214 (1214) = 4
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] libfptr_registration()
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] output > 34
2022.07.05 09:04:01.019 T: T:0000217C INFO [Transport] send fiscal (08) 08 40 33 34 (4 bytes total)
2022.07.05 09:04:01.020 T: T:0000217C INFO [Transport] recv fiscal (08) 08 30 30 34 3B 34 3B 34 3B 32 36 32 3B (13 bytes total)
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] input < 4;4;4;262;
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] Чтение таблицы КМ (1 элементов)
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] 1. [CRC = -2087129350, 2106 = -1] 30 31 30 38 30 31 39 32 32 37 32 34 38 30 38 31 32 31 35 43 6B 74 68 25 58 64 6C 49 30 61 6C
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] output > bQ0;0;1;18446744073709551615;0108019227248081215Ckth%XdlI0al;
2022.07.05 09:04:01.020 T: T:0000217C INFO [Transport] send fiscal (09) 09 40 62 51 30 3B 30 3B 31 3B 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31 35 3B 30 31 30 38 30 31 39 32 32 37 32 34 38 30 38 31 32 31 35 43 6B 74 68 25 58 64 6C 49 30 61 6C 3B (63 bytes total)
2022.07.05 09:04:01.021 T: T:0000217C INFO [Transport] recv fiscal (09) 09 59 44 (3 bytes total)
2022.07.05 09:04:01.021 T: T:0000217C ERROR [FiscalPrinter] Код ошибки ККТ - 4459h
2022.07.05 09:04:01.021 T: T:0000217C ERROR [FiscalPrinter] Объекту 0x04AA4340 присвоен код ошибки 26 [Неверный формат команды]
2022.07.05 09:04:01.032 T: T:0000217C INFO [FiscalPrinter] libfptr_cancel_receipt()
2022.07.05 09:04:01.032 T: T:0000217C INFO [FiscalPrinter] output > a1
2022.07.05 09:04:01.033 T: T:0000217C INFO [Transport] send fiscal (0A) 0A 40 61 31 (4 bytes total)
2022.07.05 09:04:01.033 T: T:0000217C INFO [Transport] recv fiscal (0A) 0A 3B 61 (3 bytes total)
2022.07.05 09:04:01.033 T: T:0000217C ERROR [FiscalPrinter] Код ошибки ККТ - 613Bh
2022.07.05 09:04:01.033 T: T:0000217C INFO [FiscalPrinter] output > 01
2022.07.05 09:04:01.033 T: T:0000217C INFO [Transport] send fiscal (0B) 0B 40 30 31 (4 bytes total)
2022.07.05 09:04:01.034 T: T:0000217C INFO [Transport] recv fiscal (0B) 0B 30 30 30 3B 37 3B 30 3B 30 3B 30 3B (13 bytes total)
2022.07.05 09:04:01.034 T: T:0000217C INFO [FiscalPrinter] input < 0;7;0;0;0;
2022.07.05 09:04:01.034 T: T:0000217C ERROR [FiscalPrinter] Объекту 0x04AA4340 присвоен код ошибки 81 [Чек закрыт - операция невозможна]
68. elenikiti 05.07.22 09:26 Сейчас в теме
Все ваши рекомендации внимательно прочитала.
Добилась того, что чек с одним КМ печатается.
Но при попытки пробить два товара с КМ получаю ошибку.
69. slava_1c 550 05.07.22 14:29 Сейчас в теме
А у Вас. получается, на кассовом оборудовании не ФФД1.2?

Я смотрю посылается короткий код. В ФФД1.2 обязательно длинный.

И если производится проверка, то должна быть последовательность - начало проверки, валидация, и в момент списания - акцепт.

beginMarkingCodeValidation
getMarkingCodeValidationStatus
acceptMarkingCode

У Вас в коде этих запросов нет.
70. elenikiti 06.07.22 11:14 Сейчас в теме
ФФД 1.2
КМ короткие, такие дал тестовый контур ЧЗ.
Может запросы выше в логе остались?
Файл прикладываю, буду благодарна за помощь.
Прикрепленные файлы:
fptr10.log
71. slava_1c 550 06.07.22 16:07 Сейчас в теме
В приложенном файле нет ни одного чека, подозреваю, что это сегодняшний лог и в нем не было никаких транзакций по типу libfptr_open_receipt

Проще всего - покажите код печати чека на 77.
72. elenikiti 07.07.22 11:37 Сейчас в теме
Объект.openReceipt(); // открыли чек 
Сообщить("открыли чек ");
//Табличная часть
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл  Сообщить("позиция  "+СписокТоваров.Наименование);
	ПризнакНаличияКМ=32;
        Если ПустоеЗначение(СписокТоваров.КМ)=0 Тогда    // Код маркировки 
			ПризнакНаличияКМ=33;
			mark = СокрЛП(СписокТоваров.КМ);   
 			Сообщить("КМ  "+mark);
		        Статус = Объект.LIBFPTR_MES_PIECE_SOLD; // штучный товар 1 
			Штуки  = Объект.LIBFPTR_IU_PIECE;
			
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_TYPE,Объект.LIBFPTR_MCT12_AUTO); 
			Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE, mark);
			Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_STATUS, Статус);  // штучный товар
		//	Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, 1);
			Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);	
			Объект.beginMarkingCodeValidation();  //начать проверку КМ  

			ВремяНачала = ТекущееВремя(); ВремяОжидания = ТекущееВремя() + 100;
			Сообщить("-------------");
			Сообщить("Начата проверка КМ  "+mark);
			Пока 1=1 Цикл
				Объект.getMarkingCodeValidationStatus();   
				ПроверкаЗавершена = 
                               Объект.getParamBool(Объект.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
				Если ПроверкаЗавершена = 1 тогда  // проверка завершена  
					прервать;
				КонецЕсли;	
   		                Если ТекущееВремя() > ВремяОжидания тогда Сообщить("Время  истекло. ");
					прервать;
		                КонецЕсли;	
			КонецЦикла;
			
Сообщить("КМ был отправлен на сервер  "+Объект.getParamBool(Объект.LIBFPTR_PARAM_IS_REQUEST_SENT));
validationResult = Объект.getParamInt(Объект.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT); 
			Если validationResult = 0 Тогда																									
				Сообщить("Отмена чека при проверки КМ! ");
				Объект.cancelReceipt(); // отмена чека
				Объект.close();
				СтатусВозврата(0);
				Возврат 0;
			КонецЕсли;
			
			Объект.acceptMarkingCode();	// подтверждение реализации 		
			Объект.setParam(Объект.LIBFPTR_PARAM_COMMODITY_NAME,СокрЛП(СписокТоваров.Наименование));  	
//Объект.setParam(Объект.LIBFPTR_PARAM_MEASUREMENT_UNIT, Объект.LIBFPTR_IU_PIECE); 
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE, mark);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_STATUS, 1); //штучный 
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0); 
			Сообщить("обработка КМ "+mark+" завершена. ");
		Иначе
		  	Объект.setParam(Объект.LIBFPTR_PARAM_COMMODITY_NAME,СокрЛП(СписокТоваров.Наименование));
        КонецЕсли;
		Объект.setParam(Объект.LIBFPTR_PARAM_PRICE, СписокТоваров.Цена);
		Объект.setParam(Объект.LIBFPTR_PARAM_QUANTITY, СписокТоваров.Количество);
 		Объект.setParam(1212, ПризнакНаличияКМ); 
//параметр для ФФД 1.2!!! 32 - товар не имеющий код маркировки, 33 - товар имеющий код маркировки
 		
 		Сообщить("Попытка регистрации оплаты. ");

	 	Если ПолученоНал > 0 Тогда
                       Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_TYPE, Объект.LIBFPTR_PT_CASH); 
			Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, ПолученоНал);
			Если Объект.Payment() <> 0 тогда   //Зарегистрировать оплату
				Ошибка = 1;
	  			ПолучитьОписаниеРезультата(Объект,"Оплата не прошла");
				глСообщитьВЛог("Атол, Ошибка оплаты налом " + ОписаниеРезультата);
				Попытка
					Объект.cancelReceipt(); // отмена чека
					Объект.close();
				Исключение
				КонецПопытки;
	                       Возврат 0;
	            КонецЕсли;   
		КонецЕсли;

	лСуммаВстречноеПредставление = глФРДопПарам.Получить("СуммаВстречноеПредставление");
	Если ПустоеЗначение(лСуммаВстречноеПредставление) = 0 Тогда
		Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_TYPE, Объект.LIBFPTR_PT_OTHER);
		Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, лСуммаВстречноеПредставление);
			Если Объект.Payment() <> 0 тогда   //Зарегистрировать оплату
			Ошибка = 1;
			ПолучитьОписаниеРезультата(Объект,"Оплата не прошла");
			глСообщитьВЛог("Атол, Ошибка оплаты СуммаВстречноеПредставление " + ОписаниеРезультата);
			Попытка
				Объект.cancelReceipt(); // отмена чека
				Объект.close();
			Исключение
			КонецПопытки;
			Возврат 0;
		КонецЕсли;   
	КонецЕсли;

	Если Ошибка = 0 Тогда
		Сообщить("Можно закрыть чек! ");
		Объект.closeReceipt(); // Закрытие чека	
	КонецЕсли;

	Если Объект.checkDocumentClosed() < 0 Тогда   
		Сообщить("закрылся? "+Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_CLOSED));
		Если Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_CLOSED) = 0 Тогда
			Объект.cancelReceipt(); // отменить и сформировать заново 
		КонецЕсли;	
		Сообщить("напечатался? "+Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_PRINTED));
		Если Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_PRINTED) = 0 Тогда 
			Объект.cancelReceipt(); // отменить и сформировать заново 
			Если Объект.continuePrint() < 0  Тогда // не получилось напечатать.  заново
				Предупреждение("Чек не напечатан!"); // отключиться 
				ПолучитьОписаниеРезультата(Объект,"Печать не прошла");
				глСообщитьВЛог("Атол, Ошибка печати  " + ОписаниеРезультата);
				Попытка
					Объект.cancelReceipt(); // отмена чека
				Исключение
				КонецПопытки;
				Возврат 0;
			КонецЕсли;
		КонецЕсли;	
	КонецЕсли; //Проверить закрытие документа
Показать
73. slava_1c 550 07.07.22 12:48 Сейчас в теме
(72) Странно, в логе, который Вы ранее показывали - у вас строки

2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1212 (1212) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1214 (1214) = 4
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] libfptr_registration()

А в коде:

Объект.setParam(1212, ПризнакНаличияКМ);
//параметр для ФФД 1.2!!! 32 - товар не имеющий код маркировки, 33 - товар имеющий код маркировки 


т.е, 1212 = 33

А строк где 1214=4 и registration() НЕТ ВООБЩЕ!

Это, кстати дает ответ на вопрос почему не проходит когда две строки.

Внимательно изучите вот тут - это практически Ваш код

https://integration.atol.ru/api/?csharp#proverka-km
74. elenikiti 07.07.22 13:33 Сейчас в теме
Я натыкалась на это противоречие, но решила, что так и нужно:
1212 Признак предмета расчета int Все
75. elenikiti 07.07.22 13:34 Сейчас в теме
fptr.setParam(Constants.LIBFPTR_PARAM_TAX_TYPE, Constants.LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(1260, industryInfo);
76. elenikiti 07.07.22 13:38 Сейчас в теме
Получается с КМ нужно использовать новые значения этого параметра, 32 или 33.
77. elenikiti 07.07.22 13:54 Сейчас в теме
Регистрация там есть, просто зацепила, когда подчищала код от комментов:
	Объект.setParam(1214, ПризнакСпособРасчета); 
        Сообщить("Попытка регистрации позиции. ");
		Если Объект.registration() <> 0 тогда  /// Регистрация позиции
 			ПолучитьОписаниеРезультата(Объект,"Регистрация позиции ");  
 			Ошибка = 1;
			Попытка
				Сообщить("Отмена чека при регистрации позиции! ");
				Объект.cancelReceipt(); // отмена чека
				Объект.close();
			Исключение
			КонецПопытки;
			СтатусВозврата(0);
			Возврат 0;
		Иначе
			Сообщить("Регистрация позиции выполнена. ");
		КонецЕсли;   
	КонецЦикла;	// Цикл по строкам товаров 
	Сообщить("Попытка регистрации оплаты. ");
	Если ПолученоНал > 0 Тогда
Показать
78. slava_1c 550 07.07.22 13:55 Сейчас в теме
Увидел ответ по поводу регистрации.
79. elenikiti 07.07.22 14:04 Сейчас в теме
Пока и с одной строкой не проходит печать.
Прикрепленные файлы:
fptr10.log
80. elenikiti 07.07.22 14:28 Сейчас в теме
Не понимаю. В какой-то момент сверка КМ делалась, не смотрю на то, что они короткие. Хотя бы 5-ку в статус я получала. Пусть с одним КМ, но чек хотя бы начинал печататься. Теперь и этого нет (((
Я переписала алгоритм. Сначала проверяю КМ, запоминаю ответ. Потом заново перебираю таблицу товаров.
Но это пока не помогло. Чек аннулируется т.к. не проходит проверку КМ.
Прикрепленные файлы:
fptr10.log
81. slava_1c 550 07.07.22 14:33 Сейчас в теме
В логе видно что даже кассир не регистрируется
output > B1кассир Никитина;1;
2022.07.07 14:16:57.510 T: T:00001774 INFO [Transport] send fiscal (0F) 0F 40 42 31 AA A0 E1 E1 A8 E0 20 8D A8 AA A8 E2 A8 AD A0 3B 31 3B (22 bytes total)
2022.07.07 14:16:57.511 T: T:00001774 INFO [Transport] recv fiscal (0F) 0F 59 44 (3 bytes total)
2022.07.07 14:16:57.511 T: T:00001774 ERROR [FiscalPrinter] Код ошибки ККТ - 4459h
2022.07.07 14:16:57.511 T: T:00001774 ERROR [FiscalPrinter] Объекту 0x049D13D0 присвоен код ошибки 196 [Не удалось зарегистрировать кассира]
2022.07.07 14:16:57.511 T: T:00001774 INFO [FiscalPrinter] libfptr_cancel_marking_code_validation()

Ошибок в процессе вывода чека никаких быть не должно - начните с этого
82. slava_1c 550 07.07.22 14:39 Сейчас в теме
И вот тут
Объект.getParamBool(Объект.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);

Я бы задержку поставил.

А то в логе 100500 вызовов
83. elenikiti 07.07.22 15:01 Сейчас в теме
(82)
А то в логе 100500 вызовов


Это вот это место:
ВремяНачала = ТекущееВремя();
ВремяОжидания = ТекущееВремя() + 100;
Сообщить("-------------");
Сообщить("Начата проверка КМ  "+mark);
Пока 1=1 Цикл
Объект.getMarkingCodeValidationStatus();   //Сообщить("ожидаем проверки КМ  ");
ПроверкаЗавершена = Объект.getParamBool(Объект.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
Если ПроверкаЗавершена = 1 тогда  // проверка завершена  Перечисление.Булево.Да
	прервать;
КонецЕсли;	
Если ТекущееВремя() > ВремяОжидания тогда Сообщить("Заданное время ожидания ответа истекло. ");
	прервать;
КонецЕсли;	
КонецЦикла;
			
Сообщить("КМ был отправлен на сервер  "+Объект.getParamBool(Объект.LIBFPTR_PARAM_IS_REQUEST_SENT));
validationResult = Объект.getParamInt(Объект.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT); 
Показать


Вызовов много, так как жду ответа 100 секунд. Задержку в плане sleep() ?
84. slava_1c 550 07.07.22 15:11 Сейчас в теме
Да можно хоть пустым циклом))
85. slava_1c 550 07.07.22 15:15 Сейчас в теме
И все-таки на мой взгляд неправильно посылать в ФФД1.2 короткий код без симоволов GS1, хоть это и тестовый контур.

В том же примере с АТОЛа код вполне себе длинный.
86. elenikiti 07.07.22 15:32 Сейчас в теме
Я попыталась создать в тестовом контуре свой КМ, не дали! Требуют длину 12 символов ((
87. slava_1c 550 07.07.22 16:01 Сейчас в теме
Попробуйте коды которые у вас имеются отсканировать и передать в тестовый контур.
88. SeTIrk 20.07.22 09:15 Сейчас в теме
Не могу сообразить как должна выглядеть регистрация для нескольких КИЗ в 1 строке.

// для каждого киз
fptr.beginMarkingCodeValidation()
fptr.getMarkingCodeValidationStatus()
// ну и какую-то проверку что статус корректный.

// фиксируем кизы
fptr.acceptMarkingCode()

// открываем чек
fptr.openReceipt();

// вот тут не понятно, как их все передать?
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, mark);
Показать
89. SeTIrk 20.07.22 11:01 Сейчас в теме
(88) Нашел на форуме атола: "один штук - одна позиция
так велит ФФД"
90. SeTIrk 20.07.22 13:21 Сейчас в теме
(88) Теперь другой вопрос, почему КИЗ блока может возвращать 5?
010460026600180121;6Y-AEs{FNC1}8005147000{FNC1}93sOTQ{FNC1}24010132404
От пачки нормально приходит 15.
Неужели придется все блоки в пачки переводить? Вроде бы блок идет потребительский уровень.
91. SeTIrk 21.07.22 07:37 Сейчас в теме
(90) Разобрался, видимо вечером голова не работала лишний {FNC1} возле 21 влепил. А когда писал заново расставил...
(88) Не экономно пробили 40 блоков одного вида, потратили пол рулона бумаги, можно омуль завернуть, и ещё останется.
92. Morikpro 26.07.22 23:07 Сейчас в теме
Отличная подсказка , автору спасибо !
93. m1_1976 13 08.09.22 12:26 Сейчас в теме
Для тех кто мучается с короткой маркой (короткая марка)

Пример: У нас только молочная продукция. 31 символ в марке.
Вот такое преобразование делаю :

КМ = Лев(ПодготовленныйШК, 24) + Разделитель + Сред(ПодготовленныйШК, 25);

То есть тот самый GS1 должен быть 25 символом

P.S.
Спасибо сообщению (63) ТАМ все понятно какие марки как ждет.