![]() |
|
v7: Пробитие чека + Маркировка | ☑ | ||
---|---|---|---|---|
0
Mafiozaa
23.11.20
✎
03:20
|
Приветствую, при пробитии чека с несколькими позициями (а не разным кол-вом) в офд уходит 1 код маркировки, вместо всех, так как по базе все прыгает хорошо, то уверен что где то в обработке фискальника ошибка возникает, обработка fr_elves. При этом все в цикле
Функция ПечататьЧек(Объект, Пароль, СписокТоваров, Получено, ПолучСерт, ПолучКарт, Скидка, ПризнВозврата, НомерСекции, НомерЧека,СкидкаСуммой,НомерДок) Если ПустоеЗначение(Объект) = 1 Тогда ОписаниеРезультата = "устройство не подключено"; Возврат 0; ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 0 Тогда Возврат 0; КонецЕсли; // регистрация товаров РезРегистрация = 1; СписокТоваров.ВыбратьСтроки(); Объект.StringForPrinting = " Товарный чек"; Объект.PrintString(); Объект.StringForPrinting = " "+ НомерДок+" от "+ТекущаяДата(); Объект.PrintString(); Если (Нрег(глПользователь.Наименование))="кассир1" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир1)))+(Константа.Кассир1),32); Объект.PrintString(); КонецЕсли; Если (Нрег(глПользователь.Наименование))="кассир2" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир2)))+(Константа.Кассир2),32); Объект.PrintString(); КонецЕсли; Если (Нрег(глПользователь.Наименование))="кассир3" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир3)))+(Константа.Кассир3),32); Объект.PrintString(); КонецЕсли; Если (Нрег(глПользователь.Наименование))="кассир4" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир4)))+(Константа.Кассир4),32); Объект.PrintString(); КонецЕсли; Если (Нрег(глПользователь.Наименование))="кассир5" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир5)))+(Константа.Кассир5),32); Объект.PrintString(); КонецЕсли; Если (Нрег(глПользователь.Наименование))="кассир6" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир6)))+(Константа.Кассир6),32); Объект.PrintString(); КонецЕсли; Если (Нрег(глПользователь.Наименование))="кассир7" Тогда пробел =" " ; Объект.StringForPrinting = Лев("Продавец:"+прав(пробел,32-(9+СтрДлина(Константа.Кассир7)))+(Константа.Кассир7),32); Объект.PrintString(); КонецЕсли; Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл СтрокаДляПечати = СокрЛП(СписокТоваров.ТовНаим); ДлинаСтроки = 32; //Пока СтрДлина(СтрокаДляПечати)>0 Цикл //Объект.StringForPrinting = Лев(СтрокаДляПечати,ДлинаСтроки); //Объект.PrintString(); //СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати,ДлинаСтроки+1)); //КонецЦикла; Объект.Password = Пароль; Объект.StringForPrinting = Лев(СтрокаДляПечати,ДлинаСтроки); // Объект.Price = СписокТоваров.Цена; Если СписокТоваров.Количество=0 тогда Объект.Price = СписокТоваров.Цена; иначе Объект.Price = СписокТоваров.Сумма/СписокТоваров.Количество; КонецЕсли; Объект.Quantity = СписокТоваров.Количество; Объект.Department = НомерСекции; КодМаркировки = СписокТоваров.Маркировка; Если Лев(КодМаркировки, 2) = "01" Тогда GTIN = Сред(КодМаркировки, 3, 14); SerialNumber = Сред(КодМаркировки, 19, 13); КонецЕсли; Объект.FNOperation(); Объект.GTIN = GTIN; Объект.SerialNumber = SerialNumber; Объект.MarkingType = 17485; Объект.FNSendItemData(); //Проверка наличия колонки "НДС" в таблице значений. НДСЕсть = ""; Попытка НДС = СписокТоваров.НДС; НДСЕсть = 1; Исключение НДСЕсть = 0; КонецПопытки; Если НДСЕсть = 1 Тогда//Печатаем НДС // В настройках ФР надо настроить ставки: // Налог 1 = 18% - НДС 18% // Налог 2 = 10% - НДС 10% // Налог 3 = 20% - НДС 20% Если СписокТоваров.НДС = 18 Тогда Объект.Tax1 = 1; ИначеЕсли СписокТоваров.НДС = 10 Тогда Объект.Tax1 = 2; ИначеЕсли СписокТоваров.НДС = 20 Тогда Объект.Tax1 = 3; Иначе Объект.Tax1 = 0; КонецЕсли; Объект.Tax2 = 0; Объект.Tax3 = 0; Объект.Tax4 = 0; КонецЕсли; Если ПризнВозврата = 0 Тогда Объект.CheckType = 0; Иначе Объект.CheckType = 2; КонецЕсли; Объект.OpenCheck(); Если Объект.ResultCode <> 0 Тогда ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект); АннулированиеЧека(Объект, Пароль); ОтключитьсяОтФР(Объект, Пароль, 0); Возврат 0; КонецЕсли; Если ПустоеЗначение(СписокТОваров.СкидкаПоСтроке) = 0 Тогда пробел ="................................" ; Объект.StringForPrinting = Лев("Стоимость"+прав(пробел,32-(9+СтрДлина(Формат(СписокТоваров.Цена*СписокТоваров.Количество,"Ч.2"))))+Формат(СписокТоваров.Цена*СписокТоваров.Количество,"Ч.2"),32); Объект.PrintString();// СписокТоваров.СкидкаПоСтроке Объект.StringForPrinting = "Скидка "+СписокТоваров.СкидкаПоСтроке+"%"+прав(пробел,32-(5+СтрДлина(СписокТоваров.СкидкаПоСтроке-СписокТоваров.СкидкаСпасибо)+СтрДлина(Формат((СписокТоваров.Цена*СписокТоваров.Количество-СписокТоваров.Сумма-СписокТоваров.СкидкаСпасибо),"Ч.2"))))+Формат(((СписокТоваров.Цена*СписокТоваров.Количество)-СписокТоваров.Сумма-СписокТоваров.СкидкаСпасибо),"Ч.2"); Объект.PrintString(); //доб.скидка СПАСИБО Если пустоезначение(СписокТоваров.СкидкаСпасибо)=0 тогда Объект.StringForPrinting = "Скидка СПАСИБО"+прав(пробел,32-(10+СтрДлина(СписокТоваров.СкидкаСпасибо)+СтрДлина(Формат((СписокТоваров.СкидкаСпасибо),"Ч.2"))))+Формат(((СписокТоваров.СкидкаСпасибо)),"Ч.2"); Объект.PrintString(); Объект.StringForPrinting = "Общая скидка "+прав(пробел,32-(11+СтрДлина(СписокТоваров.СкидкаПоСтроке)+СтрДлина(Формат((СписокТоваров.Цена*СписокТоваров.Количество-СписокТоваров.Сумма),"Ч.2"))))+Формат(((СписокТоваров.Цена*СписокТоваров.Количество)-СписокТоваров.Сумма),"Ч.2"); Объект.PrintString(); КонецЕсли; Объект.StringForPrinting = Лев("Всего"+прав(пробел,32-(5+СтрДлина(Формат(СписокТоваров.Сумма,"Ч.2"))))+Формат(СписокТоваров.Сумма,"Ч.2"),32); Объект.PrintString(); ИначеЕсли ПустоеЗначение(СписокТОваров.СкидкаСпасибо) = 0 тогда пробел ="................................" ; Объект.StringForPrinting = Лев("Стоимость"+прав(пробел,32-(9+СтрДлина(Формат(СписокТоваров.Цена*СписокТоваров.Количество,"Ч.2"))))+Формат(СписокТоваров.Цена*СписокТоваров.Количество,"Ч.2"),32); Объект.PrintString();// Объект.StringForPrinting = "Скидка СПАСИБО"+прав(пробел,32-(10+СтрДлина(СписокТоваров.СкидкаСпасибо)+СтрДлина(Формат((СписокТоваров.СкидкаСпасибо),"Ч.2"))))+Формат(((СписокТоваров.СкидкаСпасибо)),"Ч.2"); Объект.PrintString(); Объект.StringForPrinting = Лев("Всего"+прав(пробел,32-(5+СтрДлина(Формат(СписокТоваров.Сумма,"Ч.2"))))+Формат(СписокТоваров.Сумма,"Ч.2"),32); Объект.PrintString(); //конец скидка СПАСИБО КонецЕсли; // // Если ПустоеЗначение(СписокТОваров.СкидкаПоСтроке) = 0 Тогда // // Объект.Password = Пароль; // Объект.StringForPrinting = Лев(СтрокаДляПечати,ДлинаСтроки); // // Объект.Price = СписокТоваров.Цена; // Объект.Price = СписокТоваров.Сумма/СписокТоваров.Количество; // Объект.Quantity = СписокТоваров.Количество; // Объект.Department = НомерСекции; // // //Проверка наличия колонки "НДС" в таблице значений. // НДСЕсть = ""; // Попытка // НДС = СписокТоваров.НДС; // НДСЕсть = 1; // Исключение // НДСЕсть = 0; // КонецПопытки; // // Если НДСЕсть = 1 Тогда//Печатаем НДС // // // В настройках ФР надо настроить ставки: // // Налог 1 = 18% - НДС 18% // // Налог 2 = 10% - НДС 10% // // Налог 3 = 20% - НДС 20% // // Если СписокТоваров.НДС = 18 Тогда // Объект.Tax1 = 1; // ИначеЕсли СписокТоваров.НДС = 10 Тогда // Объект.Tax1 = 2; // ИначеЕсли СписокТоваров.НДС = 20 Тогда // Объект.Tax1 = 3; // Иначе // Объект.Tax1 = 0; // КонецЕсли; // Объект.Tax2 = 0; // Объект.Tax3 = 0; // Объект.Tax4 = 0; // КонецЕсли; // // Если ПризнВозврата = 0 Тогда // Объект.Sale(); // Иначе // Объект.ReturnSale(); // КонецЕсли; // // Если Объект.ResultCode <> 0 Тогда // ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект); // АннулированиеЧека(Объект, Пароль); // ОтключитьсяОтФР(Объект, Пароль, 0); // Возврат 0; // КонецЕсли; // // // // // // КонецЕсли; // КонецЦикла; //Если СкидкаСуммой <> 0 тогда // Объект.StringForPrinting=" Спасибо за покупку"; // Объект.Summ1 = СкидкаСуммой; // Объект.Discount(); //КонецЕсли; // Объект.Password = Пароль; Объект.Summ1 = Получено; Объект.Summ2 = ПолучСерт; Объект.Summ3 = 0; Объект.Summ4 = ПолучКарт; Объект.StringForPrinting=" "; Объект.StringForPrinting=" Спасибо за покупку"; // Объект.StringForPrinting=" "; // Сообщить("ывпаыв"); Объект.DiscountOnCheck=Скидка; Объект.DiscountOnCheck=0; Объект.CloseCheck(); Если Объект.ResultCode <> 0 Тогда ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект); АннулированиеЧека(Объект, Пароль); ОтрезатьЧек(Объект, Пароль); ОтключитьсяОтФР(Объект, Пароль, 0); Возврат 0; КонецЕсли; Объект.Password = Пароль; Объект.GetECRStatus(); Если Объект.ResultCode <> 0 Тогда ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект); ОтключитьсяОтФР(Объект, Пароль, 0); Возврат 0; КонецЕсли; НомерЧека = Объект.OpenDocumentNumber+?(Объект.ECRAdvancedMode=5,1,0); // ОтрезатьЧек(Объект, Пароль); Возврат ОтключитьсяОтФР(Объект, Пароль); КонецФункции |
|||
1
big
23.11.20
✎
05:40
|
В цикле по строкам делается ОпенЧек, а закрытие всего одно? Сдается мне, что только последняя строка реально и регистрируется как в продажах, так и в ФН
|
|||
2
Mafiozaa
23.11.20
✎
05:43
|
(1) Почему, в офд уходят все позиции чека, нормально все, а именно код маркировки который должен быть на каждую позицию, а уходит только крайней позиции в чеке,
|
|||
3
big
23.11.20
✎
05:43
|
ОткрытьЧек() надо поставить перед циклом, вместо ОпенЧек поставить Объект.Регистрация()
|
|||
4
Mafiozaa
23.11.20
✎
05:44
|
(3) Тут Штрих, не Атол
|
|||
5
Mafiozaa
23.11.20
✎
05:45
|
(3) Но действительно, попробую открыть чек до цикла
|
|||
6
big
23.11.20
✎
05:45
|
(4) А-а-а. Какая-то интересная логика у Штриха ))
|
|||
7
Mafiozaa
24.11.20
✎
05:03
|
Вверх, открытие чека до цикла не решило
|
|||
8
Mafiozaa
24.11.20
✎
05:07
|
Продал 2 пары носков, в чеке есть 2 буквы [M] а в честном знаке, только у вторых виден код маркировки, а у первых прочерк
|
|||
9
Mafiozaa
24.11.20
✎
05:20
|
Подозреваю что где то переменная затирает, пикаю все км, но передается один крайний, скорее всего неправильно передаю переменную
|
|||
10
MWWRuza
гуру
24.11.20
✎
09:18
|
Блин... Разбираться в Вашем "километре" кода, да еще по форуму, не в живой программе, без отладчика... как-то напрягает.
Лучше Вы сами, вот Вам тоже "километр" кода, из моей конфы, где все работает нормально, все передается по всем позициям, сравнивайте: Процедура ПечататьЧек() Док = Расшифровка.Получить("Документ"); Предоплата = Расшифровка.Получить("Предоплата"); Если Предоплата = 1 Тогда ПечататьЧекНаПредоплату(); Возврат; КонецЕсли; Если ПустоеЗначение(Док) = 1 Тогда Возврат; КонецЕсли; ОбрДок = Расшифровка.Получить("ОбрДок"); Если ПустоеЗначение(ОбрДок) = 1 Тогда ОбрДок = Док; КонецЕсли; Если ФискальныйРегистратор.ECRMode() = 8 Тогда ФискальныйРегистратор.CancelCheck(); Сообщить("Аннулирован незакрытый чек"); //Дождемся - когда закончится печать отчета и отрежем ленту ОтрезкаЧека(); ИначеЕсли ФискальныйРегистратор.ECRMode() = 3 Тогда Если Вопрос("Смена превысила 24 часа!" + РазделительСтрок + "Снять Z-отчет?", "Да+Нет") = "Нет" Тогда Предупреждение("Дальнейшая работа с ККМ невозможна!"); Возврат; Иначе ЗакрытиеСмены(); КонецЕсли; КонецЕсли; ФискальныйРегистратор.Password = СокрЛП(глПользователь.ПарольККТ); ФискальныйРегистратор.GetFieldStruct(); ФискальныйРегистратор.TableNumber = 18; ФискальныйРегистратор.RowNumber = 1; ФискальныйРегистратор.FieldNumber = 5; Если Док.Подразделение.ОблагаетсяЕНВД = 1 Тогда ФискальныйРегистратор.ValueOfFieldString = 8; Иначе ФискальныйРегистратор.ValueOfFieldString = 2; КонецЕсли; ФискальныйРегистратор.WriteTable(); ФискальныйРегистратор.StringForPrinting = "№ документа :" + ОбрДок.НомерДок; ФискальныйРегистратор.PrintString(); ФискальныйРегистратор.StringForPrinting = "===================="; ФискальныйРегистратор.PrintString(); ФискальныйРегистратор.Department = Мин(15,Число(ОбрДок.Подразделение.Код)); ОбрДок.ВыбратьСтроки(); СуммаДокумента = 0; Если ОбрДок.Вид() <> "ЗаказНаряд" Тогда Если ОбрДок.ЧекНаВозврат = 0 Тогда ФискальныйРегистратор.CheckType = 0; Иначе ФискальныйРегистратор.CheckType = 2; КонецЕсли; Иначе ФискальныйРегистратор.CheckType = 0; КонецЕсли; Рез = ФискальныйРегистратор.OpenCheck(); Пока ОбрДок.ПолучитьСтроку() > 0 Цикл Если ОбрДок.Вид() = "ЗаказНаряд" Тогда Если ОбрДок.Наличие = 4 Тогда Продолжить; КонецЕсли; КонецЕсли; ПредстЦена = Окр((ОбрДок.Сумма + ОбрДок.НП) / ОбрДок.Количество, 2, 1); СуммаДокумента = СуммаДокумента + ОбрДок.Количество * ПредстЦена; КТН = СокрЛП(ОбрДок.КТН); Наим = Лев(СтрокуНоменклатурыЧек(ОбрДок.Номенклатура.Наименование, ОбрДок.Номенклатура), 40); Если (ПустоеЗначение(КТН) = 0) И (ОбрДок.Касса.ПечПризнМарк = 1) Тогда ФискальныйРегистратор.StringForPrinting = "[M] " + Наим; Иначе ФискальныйРегистратор.StringForPrinting = Наим; КонецЕсли; ФискальныйРегистратор.Price = ПредстЦена; ФискальныйРегистратор.Quantity = ОбрДок.Количество; Рез = ФискальныйРегистратор.FNOperation(); Если ПустоеЗначение(КТН) = 0 Тогда GTIN = Сред(КТН, 3, 14); SerialNumber = Сред(КТН, 19, 13); ФискальныйРегистратор.MarkingType = 17485;// Это "444D" ФискальныйРегистратор.GTIN = GTIN; ФискальныйРегистратор.SerialNumber = SerialNumber; Рез = ФискальныйРегистратор.FNSendItemCodeData(); // отправка тега маркировки //ФискальныйРегистратор.TLVDataHex = "8A041500444d000002C0EED8583F696F2B714341426D382020"; //ФискальныйРегистратор.FNSendTLVOperation(); КонецЕсли; Если ОбработкаОшибок() <> 0 Тогда Возврат; КонецЕсли; КонецЦикла; Получено = Число(Расшифровка.Получить("Получено")); Если Получено <= 0 Тогда Получено = СуммаДокумента; КонецЕсли; Если (Получено > 0) И (Получено > СуммаДокумента) Тогда ФискальныйРегистратор.Summ1 = Окр(Получено,2,1); ФискальныйРегистратор.Summ2 = 0; ФискальныйРегистратор.Summ3 = 0; ФискальныйРегистратор.Summ4 = 0; ФискальныйРегистратор.StringForPrinting = "===================="; ФискальныйРегистратор.CloseCheck(); ВыданаСдача = ФискальныйРегистратор.Change; Иначе Если Док.ВидОпл = Перечисление.ВидОплаты.Мир Тогда ФискальныйРегистратор.Summ2 = Окр(СуммаДокумента,2,1); ФискальныйРегистратор.Summ1 = 0; ФискальныйРегистратор.Summ3 = 0; ФискальныйРегистратор.Summ4 = 0; ИначеЕсли Док.ВидОпл = Перечисление.ВидОплаты.Visa Тогда ФискальныйРегистратор.Summ3 = Окр(СуммаДокумента,2,1); ФискальныйРегистратор.Summ1 = 0; ФискальныйРегистратор.Summ2 = 0; ФискальныйРегистратор.Summ4 = 0; ИначеЕсли Док.ВидОпл = Перечисление.ВидОплаты.Master Тогда ФискальныйРегистратор.Summ4 = Окр(СуммаДокумента,2,1); ФискальныйРегистратор.Summ1 = 0; ФискальныйРегистратор.Summ3 = 0; ФискальныйРегистратор.Summ2 = 0; Иначе ФискальныйРегистратор.Summ1 = Окр(СуммаДокумента,2,1); ФискальныйРегистратор.Summ2 = 0; ФискальныйРегистратор.Summ3 = 0; ФискальныйРегистратор.Summ4 = 0; КонецЕсли; ФискальныйРегистратор.StringForPrinting = "===================="; // ФискальныйРегистратор.FNCloseCheckEx(); ФискальныйРегистратор.CloseCheck(); КонецЕсли; Если ОбработкаОшибок() = 0 Тогда Если Метаданные.Документ(Док.Вид()).РеквизитШапки("ЧекПробитККМ").Выбран() = 1 Тогда Док.ЧекПробитККМ = 1; КонецЕсли; Если Метаданные.Документ(ОбрДок.Вид()).РеквизитШапки("ЧекПробитККМ").Выбран() = 1 Тогда ОбрДок.ЧекПробитККМ = 1; КонецЕсли; Иначе Если Метаданные.Документ(Док.Вид()).РеквизитШапки("ЧекПробитККМ").Выбран() = 1 Тогда Док.ЧекПробитККМ = 0; КонецЕсли; Если Метаданные.Документ(ОбрДок.Вид()).РеквизитШапки("ЧекПробитККМ").Выбран() = 1 Тогда ОбрДок.ЧекПробитККМ = 0; КонецЕсли; КонецЕсли; Если Метаданные.Документ(Док.Вид()).РеквизитШапки("НомерЧекаККМ").Выбран() = 1 Тогда Док.НомерЧекаККМ = ФискальныйРегистратор.DocumentNumber; КонецЕсли; Если Метаданные.Документ(ОбрДок.Вид()).РеквизитШапки("НомерЧекаККМ").Выбран() = 1 Тогда ОбрДок.НомерЧекаККМ = ФискальныйРегистратор.DocumentNumber; КонецЕсли; Если Метаданные.Документ(ОбрДок.Вид()).РеквизитШапки("Касса").Выбран() = 1 Тогда ОбрДок.Касса = ККМ; КонецЕсли; Если Метаданные.Документ(Док.Вид()).РеквизитШапки("Касса").Выбран() = 1 Тогда Док.Касса = ККМ; КонецЕсли; Если Метаданные.Документ(ОбрДок.Вид()).РеквизитШапки("ВыданаСдача").Выбран() = 1 Тогда ОбрДок.ВыданаСдача = Получено - СуммаДокумента; КонецЕсли; Если Метаданные.Документ(Док.Вид()).РеквизитШапки("ВыданаСдача").Выбран() = 1 Тогда Док.ВыданаСдача = Получено - СуммаДокумента; КонецЕсли; ФискальныйРегистратор.OpenDrawer(); Если ОбработкаОшибок() <> 0 Тогда Возврат; КонецЕсли; ОтрезкаЧека(); КонецПроцедуры |
|||
11
Mafiozaa
25.11.20
✎
02:20
|
(10) С этим разобрался, спасибо за отклик))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |