Имя: Пароль:
1C
1C 7.7
v7: ТиС 7.7 Феликс РК.Проблемы с доработкой обработки обслуживания
,
0 tommi
 
22.10.11
13:57
Необходимо чтобы можно было печатать чеки на Феликс РК с типом оплаты Кредит. карты.Установил драйвер Атол,начал изменять обработку fr_comm.ert.
1 tommi
 
22.10.11
14:04
Код:
Функция ПечататьЧек(Объект, Пароль, СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ДлинаСтроки, ТипОплаты)
   
   Если ПустоеЗначение(Объект) = 1 Тогда
       ОписаниеРезультата = "устройство не подключено";
       Возврат 0;
   ИначеЕсли ПодключитьсяКФР(Объект) = 0 Тогда
       Возврат 0;
   КонецЕсли;
   
   Объект.Mode = 1; // режим регистрации чеков
   Объект.Password = Пароль; // пароль на режим регистрации
   Объект.SetMode();
   Объект.GetStatus();
   Если Объект.СостояниеЧека <> 0 Тогда        
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
   КонецЕсли;
   
   Если Объект.Результат <> 0 Тогда
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
       ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
       ОтключитьсяОтФР(Объект, 0);
       Возврат 0;
   КонецЕсли;
   
   // регистрация товаров
   РезРегистрация = 1;
   СписокТоваров.ВыбратьСтроки();
           
   ДлинаНаименования = Объект.ДлинаСтрокиСимволов; // зависит от модели ФР
   Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
       //Проверка наличия колонки "НДС" в таблице значений.
       НДСЕсть = "";
       Попытка
           НДС = СписокТоваров.НДС;
           НДСЕсть = 1;
       Исключение
           НДСЕсть = 0;
       КонецПопытки;
           
       Если НДСЕсть = 1 Тогда
           Объект.Name       = "";
       Иначе
           Объект.Name       = Лев(СписокТоваров.ТовНаим, ДлинаНаименования);
       КонецЕсли;
               
       Объект.Price      = Окр(СписокТоваров.Цена,2,1);
       Объект.Quantity   = СписокТоваров.Количество;                

       Если ПризнВозврата = 0 Тогда            
           
           Если НДСЕсть = 1 Тогда//Печатаем НДС
               
               // В настройках ФР надо настроить ставки:
               // Налог 1 = 18% - НДС 18%
               // Налог 2 = 10% - НДС 10%
               // Налог 3 = 20% - НДС 20%
               // Налог 4 =  0% - без НДС
               // и Тип налога = 2 (Налог на каждую продажу)
       
               Если СписокТоваров.НДС = 18 Тогда
                   Объект.Department = 1;
               ИначеЕсли СписокТоваров.НДС = 10 Тогда
                   Объект.Department = 2;
               ИначеЕсли СписокТоваров.НДС = 20 Тогда
                   Объект.Department = 3;
               Иначе
                   Объект.Department = 4;
               КонецЕсли;
           Иначе
               Объект.Department = 4;
           КонецЕсли;
           
                       
           
           Объект.Регистрация();
       Иначе
                       //**Изменения
           Объект.EnableCheckSumm = ?(ТипОплаты=1,"FALSE","TRUE");
           //**Изменения    
           Объект.Возврат();
       КонецЕсли;

       Если Объект.Результат <> 0 Тогда
           ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
           Попытка
               Объект.CancelCheck();
           Исключение
           КонецПопытки;
           ОтключитьсяОтФР(Объект, 0);
           Возврат 0;
       КонецЕсли;
       
       Если НДСЕсть = 1 Тогда
           СтрокаДляПечати = СписокТоваров.ТовНаим;
           Пока СтрДлина(СтрокаДляПечати)>0 Цикл
               Объект.Caption = Лев(СтрокаДляПечати,ДлинаНаименования);
               Объект.PrintString();
               СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати,ДлинаНаименования+1));
           КонецЦикла;
       КонецЕсли;
       
       Если Объект.Результат <> 0 Тогда
           ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
           Попытка
               Объект.CancelCheck();
           Исключение
           КонецПопытки;
           ОтключитьсяОтФР(Объект, 0);
           Возврат 0;
       КонецЕсли;
       
   КонецЦикла;
       
   Если ПустоеЗначение(Скидка) = 0 Тогда
       Если Скидка < 0 Тогда
           // надбавка
           Объект.Percents = -Скидка;
           Объект.ПроцентнаяНадбавка();
       Иначе
           // Скидка
           Объект.Percents = Скидка;
           Объект.ПроцентнаяСкидка();
       КонецЕсли;
               
   КонецЕсли;
   
   Если Объект.Результат <> 0 Тогда
       Объект.Percents    = 0;
       ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
       ОтключитьсяОтФР(Объект, 0);
       Возврат 0;
   КонецЕсли;

   Объект.Department = НомерСекции;
   
   НомерЧека = Объект.НомерЧека;
   
       //**Изменения
   Если (ТипОплаты=1) Тогда
       Объект.Summ = Окр(СуммаЧека, 2, 1);
       Объект.TypeClose = 3;
       Объект.Payment();
       Объект.ЗакрытьЧек();
   Иначе
       Если (Получено > 0) И (Получено > СуммаЧека) Тогда
           Объект.Summ = Окр(Получено, 2, 1);
           Объект.ОплатаСоСдачей();
       Иначе
           Объект.ЗакрытьЧек();
       КонецЕсли;
   КонецЕсли;
       //**Изменения
   //Если (Получено > 0) И (Получено > СуммаЧека) Тогда
   //    Объект.Summ = Окр(Получено, 2, 1);
   //    Объект.ОплатаСоСдачей();
   //Иначе
   //    Объект.ЗакрытьЧек();
   //КонецЕсли;
   
   Если Объект.Результат <> 0 Тогда
       ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
       Сообщить(ОписаниеРезультата);
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
       ОтключитьсяОтФР(Объект, 0);
       Возврат 0;
   КонецЕсли;            
   
   Возврат ОтключитьсяОтФР(Объект);

КонецФункции


Теперь при оплате безнал,печатается чек с безналом,но потом выходят 2 чека с анулированием.Посмотрел в лог файле,там сперва 2 ошибки :Ошибка! ResultCode = -3836 ResultDescription = "Подсчет суммы сдачи невозможен",а потом еще :Ошибка! ResultCode = -3810 ResultDescription = "Накопление меньше суммы возврата или аннулирования".В чем ошибка понять не могу.HELP!!!
2 miki
 
22.10.11
16:19
Убери в
      Объект.TypeClose = 3;
       Объект.Payment();
       Объект.ЗакрытьЧек();

оплату. Т. е. так:
      Объект.TypeClose = 3;
//        Объект.Payment();
       Объект.ЗакрытьЧек();
3 MikeFromAtol
 
22.10.11
19:15
Вообще да, надо использовать только одну из этих команд - либо Payment, либо ЗакрытьЧек.

Если не используются комбинированные оплаты, то лучше использовать ЗакрытьЧек
4 tommi
 
28.10.11
15:43
Наконец то попробывали безнал.Впервый раз все прошло удачно,все были рады.Через несколько дней опять сделали безнал. и опять тоже самые ошибки : вышел анулированный чек и в логе та же ошибка: Ошибка! ResultCode = -3836 ResultDescription = "Подсчет суммы сдачи невозможен" BadParam = 0 BadParamDescription = "Ошибок в параметрах нет".
5 tommi
 
28.10.11
15:44
Причем тут сдача,понять не могу.Кассиры даже когда пробивали чек,у них сумма чека была равна с полученной суммой.
6 MikeFromAtol
 
29.10.11
18:00
В логе драйвера что написано по этому поводу? Лог лежит рядом с длл, файл будет называться что то типа fprmn.log
7 Torquader
 
29.10.11
21:46
Не знаю, как "думает" феликс, но у аппаратов Штрих-М была подобная проблема при использовании скидки и указании безналичной оплаты.
Дело в том, что когда указывается скидка на чек, то аппарат делает округление по его внутреннему алгоритму, а 1С - по её. В итоге, переданная сумма для оплаты оказывалась на одну копейку больше, чем та, которую получал аппарат внутри себя - ну и тут же следовал отказ от закрытия чека, так как операция со сдачей невозможна при использовании вида оплаты, отличного от наличных.
До конца проблему так и не решили, но обнулили копейки у всех продаваемых товаров - в результате никаких округлений не происходило.
Также проблема округления может возникать при указании количества, отличного от единицы.
8 MikeFromAtol
 
29.10.11
23:06
Ну кстати может быть запросто и такая проблема.
Мы года полтора назад именно поэтому в драйвере в интерфейсе для 1С изменили логику работы команды ПечатьФИскальнойСтроки, чтобы в ФР передавалась уже сумма со скидками, чтобы ФР сам не занимался округлениями
9 Torquader
 
30.10.11
14:11
(8) Штрих-М вообще в большинстве своих программ все данные товаров на ФР печатает в текстовом виде, а потом оформляет продажу на общую сумму чека и закрывает нужным видом оплаты - таким образом - избегая всяких проблем с округлением.
10 miki
 
30.10.11
15:14
(5)Потому что пытаешься исполнить метод "оплаты со сдачей" (даже если сдача ==0), что абсурдно для б/нала и очевидно даже ФР'у.
11 MikeFromAtol
 
30.10.11
15:48
(9) ну как бе в программах нашей разработки все делается точно так же )
12 tommi
 
31.10.11
01:51
Так если это проблема со скидкой,то можно только сумму чека уменьшить на процент скидки  или еще нужно будет уменьшить на процент скидки каждую цену товара в чеке?
13 tommi
 
03.11.11
23:29
Вот увидел в логе такую последовательность при печати безналом:
Driver.GetStatus
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 3F
                   0000000062 Получен ответ: 44 30 01 11 10 30 10 12 40 1F 01 03 58 59 18 32 34 01 02 94 17 25 00 00 00 00 00 00 02 01
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 91 18 00 00
                   0000000016 Получен ответ: 55 00 32 03 36 00 00 00 00 00 00
                   0000000000 RcpPixelLineLength = 336
                   0000000000 Driver.Set_Name Муфта (белая) PPRC разъёмная H (
                   0000000000 Driver.Set_Price 86
                   0000000000 Driver.Set_Quantity 8
                   0000000000 Driver.Set_Department 4
30.10.2011 10:04:32 0000000000 Driver.Registration
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 92 00 01
                   0000000016 Получен ответ: 55 00 00
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 52 03 00 00 00 86 00 00 00 00 80 00 04
                   0000000015 Получен ответ: 55 00 00
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 4C 8C E3 E4 E2 A0 20 28 A1 A5 AB A0 EF 29 20 50 50 52 43 20 E0 A0 A7 EA A5 AC AD A0 EF 20 48 20 28
                   0000000016 Получен ответ: 55 00 00
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 52 02 00 00 00 86 00 00 00 00 80 00 04
                   0000000078 Получен ответ: 55 00 00
                   0000000000 Driver.Set_Department 0
                   0000000000 Driver.Set_Summ 1000
30.10.2011 10:04:32 0000000000 Driver.Delivery         <----------------------
30.10.2011 10:04:32 0000000000 Посылка команды ККМ: 00 00 4A 00 04 00 00 10 00 00
                   0000000016 Получен ответ: 55 97 00
Строка со стрелками стоит Delivery,т.е я так понимаю все равно проводит со сдачей,хотя в коде не стоит Объект.ОплатаСоСдачей() в режиме безнала,может какая то бреж коде.Посмотрите пожалуйсто,буду очень признателен,а то я уже с ума схожу с этим фискальником:

Функция ПечататьЧек(Объект, Пароль, СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ДлинаСтроки, ТипОплаты)
   
   Если ПустоеЗначение(Объект) = 1 Тогда
       ОписаниеРезультата = "устройство не подключено";
       Возврат 0;
   ИначеЕсли ПодключитьсяКФР(Объект) = 0 Тогда
       Возврат 0;
   КонецЕсли;
   
   Объект.Mode = 1; // режим регистрации чеков
   Объект.Password = Пароль; // пароль на режим регистрации
   Объект.SetMode();
   Объект.GetStatus();
   Если Объект.СостояниеЧека <> 0 Тогда        
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
   КонецЕсли;
   
   Если Объект.Результат <> 0 Тогда
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
       ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
       ОтключитьсяОтФР(Объект, 0);
       Возврат 0;
   КонецЕсли;
   
   // регистрация товаров
   РезРегистрация = 1;
   СписокТоваров.ВыбратьСтроки();
           
   ДлинаНаименования = Объект.ДлинаСтрокиСимволов; // зависит от модели ФР
   Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
       //Проверка наличия колонки "НДС" в таблице значений.
       НДСЕсть = "";
       Попытка
           НДС = СписокТоваров.НДС;
           НДСЕсть = 1;
       Исключение
           НДСЕсть = 0;
       КонецПопытки;
           
       Если НДСЕсть = 1 Тогда
           Объект.Name       = "";
       Иначе
           Объект.Name       = Лев(СписокТоваров.ТовНаим, ДлинаНаименования);
       КонецЕсли;
               
       Объект.Price      = Окр(СписокТоваров.Цена,2,1);
       Объект.Quantity   = СписокТоваров.Количество;                

       Если ПризнВозврата = 0 Тогда            
           
           Если НДСЕсть = 1 Тогда//Печатаем НДС
               
               // В настройках ФР надо настроить ставки:
               // Налог 1 = 18% - НДС 18%
               // Налог 2 = 10% - НДС 10%
               // Налог 3 = 20% - НДС 20%
               // Налог 4 =  0% - без НДС
               // и Тип налога = 2 (Налог на каждую продажу)
       
               Если СписокТоваров.НДС = 18 Тогда
                   Объект.Department = 1;
               ИначеЕсли СписокТоваров.НДС = 10 Тогда
                   Объект.Department = 2;
               ИначеЕсли СписокТоваров.НДС = 20 Тогда
                   Объект.Department = 3;
               Иначе
                   Объект.Department = 4;
               КонецЕсли;
           Иначе
               Объект.Department = 4;
           КонецЕсли;
           
                       
           
           Объект.Регистрация();
       Иначе
           Объект.EnableCheckSumm = ?(ТипОплаты=1,"FALSE","TRUE");
               
           Объект.Возврат();
       КонецЕсли;

       Если Объект.Результат <> 0 Тогда
           ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
           Попытка
               Объект.CancelCheck();
           Исключение
           КонецПопытки;
           ОтключитьсяОтФР(Объект, 0);
           Возврат 0;
       КонецЕсли;
       
       Если НДСЕсть = 1 Тогда
           СтрокаДляПечати = СписокТоваров.ТовНаим;
           Пока СтрДлина(СтрокаДляПечати)>0 Цикл
               Объект.Caption = Лев(СтрокаДляПечати,ДлинаНаименования);
               Объект.PrintString();
               СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати,ДлинаНаименования+1));
           КонецЦикла;
       КонецЕсли;
       
       Если Объект.Результат <> 0 Тогда
           ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
           Попытка
               Объект.CancelCheck();
           Исключение
           КонецПопытки;
           ОтключитьсяОтФР(Объект, 0);
           Возврат 0;
       КонецЕсли;
       
   КонецЦикла;
   
   Если (ТипОплаты <> 1) Тогда    
       Если ПустоеЗначение(Скидка) = 0 Тогда
           Если Скидка < 0 Тогда
               // надбавка
               Объект.Percents = -Скидка;
               Объект.ПроцентнаяНадбавка();
           Иначе
               // Скидка
               Объект.Percents = Скидка;
               Объект.ПроцентнаяСкидка();
           КонецЕсли;
           
       КонецЕсли;
   КонецЕсли;

   Если Объект.Результат <> 0 Тогда
       Объект.Percents    = 0;
       ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
       ОтключитьсяОтФР(Объект, 0);
       Возврат 0;
   КонецЕсли;

   Объект.Department = НомерСекции;
   
   НомерЧека = Объект.НомерЧека;
   

   Если (ТипОплаты=1) Тогда
       Если ПустоеЗначение(Скидка)=1 Тогда
           Объект.Summ = Окр(СуммаЧека, 2, 1);
       Иначе
           Объект.Summ = Окр(-Скидка / 100 * СуммаЧека + СуммаЧека, 2, 1);
       КонецЕсли;
       Объект.TypeClose = 3;
       Объект.ЗакрытьЧек();
   Иначе
       Если (Получено > 0) И (Получено > СуммаЧека) Тогда
           Объект.Summ = Окр(Получено, 2, 1);
           Объект.ОплатаСоСдачей();
       Иначе
           Объект.ЗакрытьЧек();
       КонецЕсли;
   КонецЕсли;
   //Если (Получено > 0) И (Получено > СуммаЧека) Тогда
   //    Объект.Summ = Окр(Получено, 2, 1);
   //    Объект.ОплатаСоСдачей();
   //Иначе
   //    Объект.ЗакрытьЧек();
   //КонецЕсли;
   
   Если Объект.Результат <> 0 Тогда
       ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
       Сообщить(ОписаниеРезультата);
       Попытка
           Объект.CancelCheck();
       Исключение
       КонецПопытки;
       ОтключитьсяОтФР(Объект, 0);
       Возврат 0;
   КонецЕсли;            
   
   Возврат ОтключитьсяОтФР(Объект);

КонецФункции
14 MikeFromAtol
 
03.11.11
23:38
А отладчиком пройтись и посмотреть, после чего вызывается эта команда? Я сам в 1С просто совсем не силен :)
15 tommi
 
03.11.11
23:41
Хорошая идея,так и поступлю
16 big
 
04.11.11
05:06
Каша какая-то. Бить скидки через ККМ - это хорошо разложенные грабли на пути к светлому будущему )))  Проблемы гарантированы.
17 tommi
 
07.11.11
12:36
Проблема оказалась не в скидках.При пробивании чека с безналом,все пробивается.А следующий нет,выводит аннулирование предыдущего и так пока не перезагрузить 1с.Посмотрел через отладчик.В процедуре ОтключитьсяОтФР() не может установить режим Mode=0, после установки отсается все равно 1.Добавил ResetMode() не помогло.КАК еще можно закрыть чек?
18 tommi
 
07.11.11
12:53
Ошибка теперь Ошибка! ResultCode = -3802 ResultDescription = "Чек открыт - операция невозможна"
19 tommi
 
07.11.11
17:00
Поставил после Объект.ОплатаСоСдачей(); - Объект.ЗакрытьЧек(); Теперь вроде все работатет, но почему до безнала и так работало,а теперь надо закрывать ???
20 Torquader
 
08.11.11
00:55
А там есть простая команда - закрыть чек без сдачи и наличными - она, видимо, и работала, а нормальную команду просто не отладили.