Имя: Пароль:
1C
1C 7.7
v7: продажа сигарет ДТО 8.16
0 jh77
 
25.09.20
01:19
Добрый день.

ККТ Атол55Ф, была прошивка 10-8346
чек продажи сигарет формируется (на чеке выводилось КТ: и т.д.)

обновили прошивку на 12-8541
чек продажи сигарет не формируется, выдаеш ошибку, не верная длина реквизита 1162

Ниже код формирования позиции чека и вспомогательные функции
Подскажите почему у меня не получается сформировать чек?




    Документ.ВыбратьСтроки();
    Пока Документ.ПолучитьСтроку() = 1 Цикл
        Объект.НачатьПозицию();
        
        Объект.Price=Документ.Цена;
        Объект.Quantity=Документ.Количество;
        Объект.Summ=Документ.Сумма;
        Объект.TaxTypeNumber=4;
        Объект.ItemType=2;
        Объект.Department=1;
        Объект.PaymentMode=4;
        Объект.Name=СокрЛП(Документ.Товар.НаименованиеКасса);
                      
        ТипаМарка=СокрЛП(Документ.Марка);
        //ТипаМарка - код пачки сигарет, считанный сканером
        
        ТипаГТИН=сред(ТипаМарка,1,14);
        ТипаСериал=сред(ТипаМарка,15,7);
        ТипаЦена=Сред(ТипаМарка,22,4);
                    
        МаркировкаГруппа=ТипаГТИН;
        МаркировкаЭкземпляр=ТипаСериал+ТипаЦена;
        Для й = 1 по 13-СтрДлина(МаркировкаЭкземпляр) Цикл
            МаркировкаЭкземпляр=МаркировкаЭкземпляр + " ";
        КонецЦикла;
        ТипМарки=5.1;
        
        ДлинаСериала=СтрДлина(МаркировкаЭкземпляр);
        Объект.StreamFormat=5;
        КТН = Вбайты(ТипМарки,0,1,2) +
              ?(ПустоеЗначение(МаркировкаГруппа)=1,"",Вбайты(сокрлп(МаркировкаГруппа),0,1,6)) +
              Вбайты(МаркировкаЭкземпляр,0,2,ДлинаСериала);
        Ответ=ОбратитьсяКАтрибутуФР(Объект, 1162, сокрлп(КТН), 1, 1);
        
        Если Ответ=0 Тогда
            Попытка
                Объект.CancelCheck();
            Исключение
            КонецПопытки;
            ОтключитьсяОтФР(Объект, 0);
            Возврат 0;
        КонецЕсли;
        Объект.ЗакончитьПозицию();
    КонецЦикла;



//********************************************************************************
Функция ОбратитьсяКАтрибутуФР(Объект, AttrNumber, текЗначение, флПечать = 0, флЗапись = 0)
//Функция ОбратитьсяКАтрибутуФР(Объект, AttrNumber, текЗначение, флПечать = 1, флЗапись = 0)
    
    Попытка
        Объект.AttrNumber = AttrNumber;
        Если флЗапись = 1 Тогда // проверять на "ПредЗначение <> текЗначение НЕЛЬЗЯ", т.к. записывать необходимо ВСЕГДА принудительно, иначе не будет результата при дальнейшем использовании
            Объект.AttrValue = ?(число(AttrNumber)=1229, окр(текЗначение*100,0), текЗначение);
            Объект.AttrPrint = флПечать;
            Объект.WriteAttribute();
        Иначе
            Объект.ReadAttribute();
            текЗначение = Объект.AttrValue;
        КонецЕсли;
    Исключение
        Сообщить("Ошибка "+?(флЗапись = 1, "записи атрибута ", "обращения к атрибуту ") + AttrNumber);
        Возврат 0;
    КонецПопытки;
    Если Объект.ResultCode <> 0 Тогда
        ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
        Сообщить("Ошибка "+?(флЗапись = 1, "записи атрибута ", "обращения к атрибуту ") + AttrNumber+": "+ОписаниеРезультата);
        Возврат 0
    КонецЕсли;
    
    Возврат 1; // 0 - ошибка исполнения, 1 - успешная запись или чтение
    
КонецФункции
//******************************************************************************                  
Функция ДополнитьСтрокуЛ(Стр,Чем,Длина)

    Добавить=Длина-СтрДлина(Стр);
    Добавок="";
    Для Сч = 1 По Добавить  Цикл
        Добавок=Добавок+Чем;
    КонецЦикла;

    Возврат Добавок+Стр;

КонецФункции //ДополнитьСтрокуЛ()
//********************************************************************************
Функция Из_10_В_Любую(Знач Значение=0,Нотация=36) Экспорт
     Если Нотация<=0 Тогда Возврат("") КонецЕсли;
     Значение=Число(Значение);
     Если Значение<=0 Тогда Возврат("0") КонецЕсли;
     Значение=Цел(Значение);
     Результат="";
     Пока Значение>0 Цикл
          Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат;
          Значение=Цел(Значение/Нотация) ;
     КонецЦикла;
     Возврат Результат;
КонецФункции
//******************************************************************************
//Вбайты(5,0,1,2) + ?(ПустоеЗначение(МаркировкаГруппа)=1,"",Вбайты(сокрлп(МаркировкаГруппа),0,1,6)) + Вбайты(МаркировкаЭкземпляр,0,2,ДлинаСериала)
Функция Вбайты(Зн, Порядок=0, Способ=0, Длина=0) //Порядок = 0 (big endian), 1 (little endian)
    Если Способ = 0 Тогда //без преобразования
        Рез1 = зн
    ИначеЕсли Способ = 1 Тогда //число из 10-ой в 16-ую
        Рез1 = Из_10_В_Любую(Зн,16);
    ИначеЕсли Способ = 2 Тогда //строку в 16-ую
        Рез1 = "";
        для й = 1 по СтрДлина(Зн) Цикл
            Рез1 = Рез1 + Из_10_В_Любую(КодСимв(Сред(зн,й,1)),16);
        КонецЦикла;
    КонецЕсли;
    Рез1 = ДополнитьСтрокуЛ(Рез1, "0", Длина*2); //добиваем нулями строку, если длина задана фиксированной
    
    //добавим пробелы для разделения байтов
    кк = СтрДлина(Рез1) / 2; Рез = "";
    для й = 1 по кк Цикл
        Если Порядок = 0 Тогда    //big endian - порядок следования байтов от старшего к младшему
            Рез = Рез + Сред(Рез1,й*2-1,2)+" "
        Иначе                    //little endian - порядок следования байтов от младшего к старшему
            Рез = Сред(Рез1,й*2-1,2)+" " + Рез
        КонецЕсли;
    КонецЦикла;
    
    Возврат Рез
КонецФункции //Вбайты()
//********************************************************************************
1 victuan1
 
25.09.20
05:51
(0) Рекомендую обратиться к разработчику, код которого вы заимствовали по адресу эл. почты victuan # маил ру
2 HawkEye
 
25.09.20
08:37
(0) вечером посмотрю, сейчас нет под рукой...
3 victuan1
 
25.09.20
08:53
(0) Вот здесь ошибка:
ТипМарки=5.1;

Должно быть:
ТипМарки=17485;