Имя: Пароль:
1C
1С v8
Передача и печать тегов при пробитии чека
0 Ivan Bezdomnyi
 
03.07.20
12:02
Доброго времени суток.
Имеется самописная конфигурация (обычные формы). Упрощенное пробитие чека выглядит так:

    ЗагрузитьВнешнююКомпоненту("DrvFR.dll");
    FR = Новый COMОбъект("AddIn.DrvFR");
    FR.Password = 30;
    FR.ComNumber = НомерКомПорта;
    FR.Connect();
    FR.CheckType = 0;
    FR.OpenCheck();
    FR.TaxType = 8;
    FR.Tax1 = 0;
    FR.PaymentItemSign = 4; //Услуга
    FR.Quantity = 1;
    FR.Price = Наличными;
    FR.Department = 1;
    FR.StringForPrinting = "Страхование";
    FR.Password = 30;
    FR.FNOperation();
    FR.Summ1 = Наличными;
    FR.Summ2 = 0;
    FR.Summ4 = 0;
    FR.Summ5 = 0;
    FR.FNCloseCheckEx();

Например с тегами 1227 (Наименование клиента) и 1228 (ИНН клиента) проблем нет. Они передаются и печатаются в чеке если перед FR.FNCloseCheckEx() вставить:
    FR.TagNumber = 1227;
    FR.TagType = 7;
    FR.TagValueStr = Клиент;
    FR.FNSendTag();
    FR.StringForPrinting = "";
    FR.TagNumber = 1228;
    FR.TagType = 7;
    FR.TagValueStr = ИННКлиента;
    FR.FNSendTag();
    FR.StringForPrinting = "";

Но вот с остальными тегами проблема, никак не передаются и не печатаются.
Нужны:
- Признак агента по предмету расчета
- Наименование поставщика
- ИНН поставщика
- Телефон поставщика

Пробовал аналогично:
    FR.TagNumber = 1222;
    FR.TagType = 1; // ttByte
    FR.TagValueInt = 64;
    FR.FNSendTagOperation();        
    FR.StringForPrinting = "";
    FR.TagNumber = 1057;
    FR.TagType = 1; // ttByte
    FR.TagValueInt = 64;
    FR.FNSendTag();        
    FR.StringForPrinting = "";
    FR.TagNumber = 1225;
    FR.TagType = 7;
    FR.TagValueStr = Страховая;
    FR.FNSendTag();
    FR.StringForPrinting = "";
    FR.TagNumber = 1226;
    FR.TagType = 7;
    FR.TagValueStr = ИННСтраховой;
    FR.FNSendTag();
    FR.StringForPrinting = "";
    FR.TagNumber = 1171;
    FR.TagType = 7;
    FR.TagValueStr = ТелефонСтраховой;
    FR.FNSendTag();
    FR.StringForPrinting = "";

Реакции никакой. Затем в документации «Штрих-М: Драйвер ККТ» нашел метод FNBeginSTLVTag - Начинает формирование тега STLV (Тег, включающий в себя другие вложенные теги).
И исходя из таблицы с итс https://its.1c.ru/db/kkt#content:159:hdoc пробовал вот так:
    //1059
    FR.TagNumber = 1059;
    FR.FNBeginSTLVTag();
    TagID_1059 = FR.TagID;
    //
    FR.TagID = TagID_1059;
    FR.TagNumber = 1222;
    FR.TagType = 1;
    FR.TagValueInt = 64;
    FR.FNAddTag();
    //
    FR.TagID = TagID_1059;
    FR.TagNumber = 1226;
    FR.TagType = 7;
    FR.TagValueStr = ИННСтраховой;
    FR.FNAddTag();        
    //
    //1224
    FR.TagID = TagID_1059;
    FR.TagNumber = 1224;
    FR.FNBeginSTLVTag();
    TagID_1224 = FR.TagID;
    //
    FR.TagID = TagID_1224;
    FR.TagNumber = 1171;
    FR.TagType = 7;
    FR.TagValueStr = ТелефонСтраховой;
    FR.FNAddTag();
    //
    FR.TagID = TagID_1224;
    FR.TagNumber = 1225;
    FR.TagType = 7;
    FR.TagValueStr = Страховая;
    FR.FNAddTag();
    //
    FR.FNSendSTLVTag();    

Но тоже никакой реакции. Может кто сталкивался и может подсказать как напечатать эти теги в чеке?
1 Ivan Bezdomnyi
 
07.07.20
12:08
ап
2 Чё
 
14.07.20
18:38
День добрый!
Попробуй вместо вызова:
FR.FNSendSTLVTag();  
использовать:
FR.FNSendSTLVTagOperation();  
т.к. составной тег 1224 относится к строковой части чека
3 Сияющий в темноте
 
14.07.20
23:56
А кто будет ошибки выполнения команд анализировать?
4 Чё
 
15.07.20
11:45
Вот пример работающего в моем случае кода:
//функция записи STLV тега
Функция ЗаписатьSTLVТег(глФР,Пароль,НомерСоставногоТега,ТЗЗначенийВнутреннихТегов,ЭтоОперация) Экспорт
    Если ТЗЗначенийВнутреннихТегов.Количество()=0 тогда //если таблица вложенных тегов пуста
        Возврат Ложь;
    КонецЕсли;
    глФР.Password = Пароль;
    глФР.TagNumber = НомерСоставногоТега;
    TagID = глФР.FNBeginSTLVTag(); //начало ввода составного тега
    
    Для Каждого Стр Из ТЗЗначенийВнутреннихТегов Цикл
        НомерТега = Стр.НомерТега;
        ТипТега = Стр.ТипТега;
        ЗначениеТега = Стр.ЗначениеТега;
        глФР.TagID = TagID;
        глФР.TagNumber = НомерТега;
        глФР.TagType = ТипТега;
        Если ТипТега = 0 Тогда // ttByte
            глФР.TagValueInt = ЗначениеТега;
        ИначеЕсли ТипТега = 1 Тогда // ttUint16
            глФР.TagValueInt = ЗначениеТега;
        ИначеЕсли ТипТега = 2 Тогда // ttUint32
            глФР.TagValueInt = ЗначениеТега;
        ИначеЕсли ТипТега = 3 Тогда // ttVLN
            глФР.TagValueBin = ЗначениеТега;
        ИначеЕсли ТипТега = 4 Тогда // ttFVLN
            глФР.TagValueFVLN = ЗначениеТега;
        ИначеЕсли ТипТега = 5 Тогда // ttBitMask
            глФР.TagValueBin = ЗначениеТега;
        ИначеЕсли ТипТега = 6 Тогда // ttUnixTime
            глФР.TagValueDateTime = ЗначениеТега;
        ИначеЕсли ТипТега = 7 Тогда // ttString
            глФР.TagValueStr = ЗначениеТега;
        КонецЕсли;
        глФР.FNAddTag();
    КонецЦикла;
    //если это составной тег строки чека то ЭтоОперация = Истина, если В общие реквизиты ЭтоОперация = Ложь
    Если ЭтоОперация Тогда
        глФР.FNSendSTLVTagOperation();
    Иначе
        глФР.FNSendSTLVTag();
    КонецЕсли;    
    
    Если глФР.ResultCode <> 0 Тогда
        ОписаниеРезультата = ПолучитьОписаниеРезультата(глФР);
        Сообщить("Ошибка записи STLV тега: " + СокрЛП(НомерСоставногоТега) + " - " + ОписаниеРезультата);
        Сообщить(глФР.ResultCode);
        Возврат Ложь;    //неудача
    КонецЕсли;
    
    Возврат Истина;      
КонецФункции

//подготовка данных для STLV тега и вызов функции записи тега
                            ТЗЗначенийВнутреннихТегов  = Новый ТаблицаЗначений;
                            ТЗЗначенийВнутреннихТегов.Колонки.Добавить("НомерТега");
                            ТЗЗначенийВнутреннихТегов.Колонки.Добавить("ТипТега");
                            ТЗЗначенийВнутреннихТегов.Колонки.Добавить("ЗначениеТега");

                            Стр = ТЗЗначенийВнутреннихТегов.Добавить();
                            Стр.НомерТега = 1171; //телефон поставщика
                            Стр.ТипТега = 7;
                            Стр.ЗначениеТега = СокрЛП(ПараметрыЧека.ТелефонПоставщика1171);
                            
                            Стр = ТЗЗначенийВнутреннихТегов.Добавить();
                            Стр.НомерТега = 1225; //наименование поставщика
                            Стр.ТипТега = 7;
                            Стр.ЗначениеТега = текНаименованиеАгента;
                            
                            Если не ЗаписатьSTLVТег(фр, 30, 1224, ТЗЗначенийВнутреннихТегов, Истина) Тогда //передаем тэг 1224:
                                Сообщить("Не удалось установить наименование поставщика");
                                Возврат Ложь;
                            КонецЕсли;