Имя: Пароль:
1C
 
Работа с ФФД 1.2 для Штрих-М на нетиповой конфигурации
,
0 mzelensky
 
21.02.22
10:10
Доброго времени суток!

Имеется нетиповая конфа на платформе 8.2.15. Необходимо подключить работу касс по новому формату ФФД 1.2 (с контролем марок). Сейчас используется софт Штрих-М и соответствующее оборудование.

Читал, что в типовой рознице "2.3.10.43" уже более-менее все работает, но просто взять функционал из нее довольно проблематично - необходимый функционал сильно размазан по БСП и какой либо инструкции как все это работает нет.

Поэтому вопрос - если у кого-то есть уже готовые наработки (не обязательно готовое решение, достаточно именно примера формирования последовательности запросов и пример пакета данных), то буду крайне благодарен за информацию. Готов рассмотреть покупку.
1 mzelensky
 
21.02.22
12:25
ап
2 Kigo_Kigo
 
21.02.22
13:20
На инфострате полноплатных обработок , да еще с подключением, что бы не купить, раз сами не зуб ногой?
3 mzelensky
 
21.02.22
13:23
(2) Покажи мне хотя бы одну. Под Штрих-М. Не написанную чисто под типовую?
4 Kigo_Kigo
 
21.02.22
13:28
5 Kigo_Kigo
 
21.02.22
13:42
&НаКлиенте
Функция ПодключитьсяКФР(Пароль)
    Рез = 0;
    
    глФР.Password=Пароль;
    глФР.Connect();
    
    Ответ = глФР.ResultCode;
    Если Ответ=0 Тогда
        Рез=1;
    Иначе
        Сообщить(глФР.ResultCodeDescription);
    КонецЕсли;
    глФР.Beep();
    
    Возврат Рез;
КонецФункции
&НаКлиенте
Функция ОтключитьсяОтФР(Пароль, ЗапоминатьОшибку = 1)
    Рез = 0;
    
    // пеключим ФР в нерабочий режим
    глФР.Password=Пароль;
    глФР.Disconnect();
    
    Ответ = глФР.ResultCode;
    Если Ответ=0 Тогда
        Рез=1;
    ИначеЕсли ЗапоминатьОшибку = 1 Тогда
        Сообщить(глФР.ResultCodeDescription);
    КонецЕсли;
    
    Возврат Рез;
КонецФункции

&НаКлиенте
Функция ОткрытьСмену(рКодОшибки=0) Экспорт
    Попытка
        рКодОшибки=0;
        
        фр=глФР;
        фр.Password=1;
        
        Если фр.ECRMode<>4 Тогда // смена уже открыта, или некий другой режим
            рКодОшибки=99;
            Возврат Истина;
        КонецЕсли;
        
        рез=фр.OpenSession();
        Если рез<>0 Тогда
            Сообщить("ОткрытьСмену, ошибка выполнения: "+фр.ResultCodeDescription);
            рКодОшибки=фр.ResultCode;
            Возврат Ложь;
        КонецЕсли;
        
        Сообщить("ОткрытьСмену, смена успешно открыта.");
        Возврат Истина;
    Исключение
        Сообщить("ОткрытьСмену, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
        Возврат Ложь;
    КонецПопытки;
КонецФункции
&НаКлиенте
Функция ЗакрытьСмену(рКодОшибки=0) Экспорт
    Попытка
        рКодОшибки=0;
        
        фр=глФР;
        фр.Password=30; // можно ещё 29
        
        Если фр.ECRMode<>2 и фр.ECRMode<>3 Тогда // смена уже закрыта, или другой режим
            рКодОшибки=99;
            Возврат Истина;
        КонецЕсли;
        
        рез=фр.PrintReportWithCleaning();
        Если рез<>0 Тогда
            Сообщить("ЗакрытьСмену, ошибка выполнения: "+фр.ResultCodeDescription);
            рКодОшибки=фр.ResultCode;
            Возврат Ложь;
        КонецЕсли;
        
        Сообщить("ЗакрытьСмену, смена успешно закрыта.");    
        Возврат Истина;
    Исключение
        Сообщить("ЗакрытьСмену, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
        Возврат Ложь;
    КонецПопытки;
КонецФункции


&НаСервере
Функция ВернутьИННКассира()
    Возврат Объект.Кассир.Физлицо.ИНН;
КонецФункции

&НаКлиенте
Функция ФнОперация(ТипЧека,Цена,Количество,Налог,Сумма, ПризнакСпособаРасчета, ПризнакПредметаРасчета, Наименование,получено,ПоКарте,КудаОтправитьЧек,Детально)
    
    
    КорректноКудаОтправитьЧек = -1;//-1 не ввден, 1- корректно,0 не корректно
    Если СокрЛП(КудаОтправитьЧек) <> "" Тогда
        Если Найти(СокрЛП(КудаОтправитьЧек),"@") <> 0 Тогда
            КорректноКудаОтправитьЧек = 1;
        ИначеЕсли Лев(СокрЛП(КудаОтправитьЧек),2) = "+7" Тогда
            КорректноКудаОтправитьЧек = 1;
        Иначе
            КорректноКудаОтправитьЧек = 0;
        КонецЕсли;
        Если  КорректноКудаОтправитьЧек = 0 Тогда
            Сообщить("Не корректно введен email или номер телефона клиента");
            Возврат 0;
        Иначе
            КорректноКудаОтправитьЧек = -1;
            //Предупреждение("Проверте  email или номер телефона клиента, номер телефона должен начинаться на +7");
        КонецЕсли;
        
    КонецЕсли;
    //Если Объект.Кассир.ПарольККТ = 0 тогда
        глФР.Password = 1;
    //Иначе
        //глФР.Password = Объект.Кассир.ПарольKKT;
    //КонецЕсли;
     ИннКассира = ВернутьИННКассира();

    Если СокрЛП(ИннКассира) = "" тогда
        Сообщить("У кассира/приемщика не указан ИНН");
        Возврат 0;
    Иначе
        глФР.TagNumber = 1203;
        глФР.TagType = 7;
        глФР.TagValueStr = СокрЛП(ИннКассира);
        //глФР.TagValueStr = "623";
        глФР.FNSendTag();
    КонецЕсли;
    СколькоНадоПолученно = 0;
    
    
    
    Если Детально = 0 Тогда
        глФР.CheckType = ТипЧека;
        глФР.StringForPrinting = Наименование;
        глФР.Price = Цена;
        глФР.Quantity = Количество;
        глФР.Tax1 = Налог;
        глФР.Tax2 = Налог;
        глФР.Tax3 = Налог;
        глФР.Tax4 = Налог;
        глФР.Department = 1;
        //глФР.Summ1 = Сумма;
        //глФР.PaymentTypeSign = ПризнакСпособаРасчета;
        //глФР.PaymentItemSign = ПризнакПредметаРасчета;
        Если Объект.ЧекНаВозврат  = Истина Тогда
            глФР.ReturnSale();
            
        Иначе
            
            глФР.Sale();
        КонецЕсли;

        
    Иначе
        Для каждого СтрокаРаботы Из Объект.Работы Цикл
            глФР.CheckType = ТипЧека;
            глФР.StringForPrinting = СокрЛП(СтрокаРаботы.Номенклатура);
            Если СтрокаРаботы.Количество <> 0 Тогда
                глФР.Price = СтрокаРаботы.Сумма/СтрокаРаботы.Количество;
                глФР.Quantity = СтрокаРаботы.Количество;
                //СколькоНадоПолученно = СколькоНадоПолученно + СтрокаРаботы.Сумма/СтрокаРаботы.Количество*СтрокаРаботы.Количество;
                
            Иначе
                глФР.Price = СтрокаРаботы.Сумма;
                глФР.Quantity = 1;
                //СколькоНадоПолученно = СколькоНадоПолученно + СтрокаРаботы.Сумма;
                
            КонецЕсли;
            глФР.Tax1 = Налог;
            глФР.Tax2 = Налог;
            глФР.Tax3 = Налог;
            глФР.Tax4 = Налог;
            глФР.Department = 1;
            //глФР.Summ1 = Сумма;
            
            //глФР.PaymentItemSign = ПризнакПредметаРасчета;
            //            ГлФР.FNOperation();
            
            Если Объект.ЧекНаВозврат  = Истина Тогда
                глФР.ReturnSale();
                
            Иначе
                
                глФР.Sale();
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЕсли;
    //глФР.PaymentTypeSign = 4;
    //ГлФР.FNOperation();

    Если КорректноКудаОтправитьЧек  = 0 Тогда
        глФР.CustomerEmail  = СокрЛП(КудаОтправитьЧек);
        глФР.FNSendCustomerEmail();
        
    КонецЕсли;
    Если (Получено = 0) И (ПоКарте = 0) Тогда
        глФР.Summ1    = Объект.Работы.Итог("Сумма");
        глФР.Summ2    = 0;
        глФР.Summ3    = 0;
        глФР.Summ4    = 0;
    ИначеЕсли (Получено <> 0) И (ПоКарте = 0) Тогда
        глФР.Summ1    = Объект.Получено;
        глФР.Summ2    = 0;
        глФР.Summ3    = 0;
        глФР.Summ4    = 0;
    ИначеЕсли (Получено <> 0) И (ПоКарте <> 0) Тогда
        глФР.Summ1    = Объект.Получено;
        глФР.Summ2    = Объект.ПоКарте;
        глФР.Summ3    = 0;
        глФР.Summ4    = 0;
        
    ИначеЕсли (Получено = 0) И (ПоКарте <> 0) Тогда
        глФР.Summ1    = 0;
        //ГлФР.CheckSubTotal(глФР.Summ2);
        
        глФР.Summ2    = Объект.ПоКарте;
        глФР.Summ3    = 0;
        глФР.Summ4    = 0;
    КонецЕсли;
    //итогоитого=0;
    //Сообщить(СколькоНадоПолученно);
    //ГлФР.RoundingSumm();

    глФР.FNCloseCheckEx();
    Если глФР.ResultCode <> 0 Тогда
        Сообщить(глФР.ResultCode);
        глФР.Password=30;
        глФР.SysAdminCancelCheck();
        //ОтключитьсяОтФР(Объект, Пароль, 0);
        Возврат 0;
    Иначе
        Объект.ЧекПробитККМ = Истина;
    КонецЕсли;
    Возврат 1;
КонецФункции      
&НаКлиенте
Процедура ИнициализироватьФР() Экспорт
    Попытка
        ПодключитьВнешнююКомпоненту("AddIn.DrvFR"); // достаточно штатной установки драйвера на локальный ПК или сервер
        ком=Новый COMОбъект("AddIn.DrvFR"); // никакой более регистрации на современных ОС обычно не требуется
        глФР=ком; // экспортная переменная глФР переменная должна быть объявлена в глобальном модуле обычного приложения
    Исключение
        Сообщить("Ошибка инициализации фискального регистратора кассовых чеков: "+ОписаниеОшибки(),СтатусСообщения.Важное);
    КонецПопытки;
    Пароль = 30;
    ПодключитьсяКФР(Пароль);
    рКодОшибки = "";
    //ОткрытьСмену(рКодОшибки);
    //Если рКодОшибки <> 99 тогда //сменаОтрыта
    //    Сообщить(рКодОшибки);
    //КонецЕсли;
    ТипЧека =  1;
    Цена  = Объект.Работы.Итог("Сумма");
    Количество = 1;
    Налог = 0;
    Сумма = Цена;
    ПризнакСпособаРасчета = 1;
    ПризнакПредметаРасчета = 4;
    Наименование = "Оплата по Заказ-наряду № " + Строка(Объект.Номер) + " от " + Строка(Объект.Дата);
    Рез = 0;
    Если Объект.Детально тогда
        Рез = ФнОперация(ТипЧека,Цена,Количество,Налог,Сумма, ПризнакСпособаРасчета, ПризнакПредметаРасчета, Наименование,Объект.Получено,Объект.Покарте,Объект.КудаОтправитьЧек, 1);
        
    Иначе
        Рез = ФнОперация(ТипЧека,Цена,Количество,Налог,Сумма, ПризнакСпособаРасчета, ПризнакПредметаРасчета, Наименование,Объект.Получено,Объект.Покарте,Объект.КудаОтправитьЧек,0);
    КонецЕсли;
    //ЗакрытьСмену(рКодОшибки) оставим для снятия Zотчета
    Если Рез = 0 Тогда
        Сообщить("Чек ККМ не пробит",СтатусСообщения.Важное);
    Иначе
        Записать();
    КонецЕсли;
    ОтключитьсяОтФР(Пароль);
    
КонецПроцедуры

&Наклиенте
Процедура ПробитьЧекККМ(Кнопка)


ИнициализироватьФР();

//ПодключитьсяКФР("30")
КонецПроцедуры
6 Kigo_Kigo
 
21.02.22
13:42
но здесь без кода маркировки, но там 3-4 команды надо чтобы допилить до передачи КД, сча примера нет под рукой
7 Kigo_Kigo
 
21.02.22
13:43
КД = КТ(Код товара)
8 mzelensky
 
21.02.22
13:44
(4) Для начала спасибо ,уже хоть что-то. У них там какая-то неразбериха с версиями обработок\драйверов. Но это я уже у тех.поддержки выясню
9 mzelensky
 
21.02.22
13:47
(5) Это точно для Штрих-М под формат ФФД 1.2 ?
10 Kigo_Kigo
 
21.02.22
13:51
(9) Да, работает с 15-м драйвером, допилена клиенту для передачи кода товаров(база с передачей КТ не доступна мне сейчас), правда какая ФФД у него уже не помню
11 Kigo_Kigo
 
21.02.22
13:52
Но кода товаров улетают и видны в ОФД
12 mzelensky
 
21.02.22
13:54
(11) Они и на ФФД 1.0 улетают.

Нужна работа именно по новому протоколу ФФД 1.2 с функциями контроля марок
13 ColonelAp4u
 
21.02.22
14:33
(12) ответил на почту
14 helloman
 
21.02.22
15:47
(13) Можно и мне пожалуйста
15 mzelensky
 
21.02.22
15:49
(13) Огромное спасибо, получил. Чуть позже изучу
16 mzelensky
 
21.02.22
15:49
(14) Если что, черкни - перешлю.
17 helloman
 
21.02.22
16:23
(16) Написал
Независимо от того, куда вы едете — это в гору и против ветра!