7.7 Переключение касс, тис

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем SerzhM, 9 май 2014.

  1. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Используется в организации два типа касс штрих фрк (со старых времен) и новые сп 402.
    Банк предоставил оборудование для эквайринга, пинпад а слипы печатает фискальник.
    Завели 2 кассы одна для розницы, др безнал.
    Есть обработка для оплат картами, но она написана на Атол драйвере.
    Что происходит сейчас.
    Берем чек ккм, забиваем позиции, нажимаем кнопку оплата картой, долговато грузится, потом просит ввести послед цифры карты, распечатывает слип, а потом говорит что ком порт занят и сам чек не распечатывает.
    Как устроена система.
    При начале работы системы в настройках фискального регистратора проставлены данные от штрих или сп, когда нажимаем кнопку оплаты картой в обработке ПриОткрытии() грузится драйвер атолл
    Код:
    Процедура ПодключитьДрайверККМ()
              Попытка
            Результ = ЗагрузитьВнешнююКомпоненту("FPRNM1C.dll");
                Если Результ = 1 Тогда
                    ECR = СоздатьОбъект("AddIn.FprnM45");
                Иначе
                    Сообщить ("Не загружена внешняя компонента AddIn.FprnM45.");
                КонецЕсли;
                Исключение
                Сообщить ("Не найдена внешняя компонента AddIn.FprnM45.");
            КонецПопытки;
           
            ECR.DeviceEnabled = 1;
            Если ECR.ResultCode <> 0 тогда
                Возврат;
            КонецЕсли;
    КонецПроцедуры // ПодключитьДрайверККМ()
    соответственно когда обработка завершает свое действие и закрывается

    Код:
    Процедура ПриЗакрытии()
    ECP=0;
    //тут еще всякие параметры
    КонецПроцедуры
    В действие вступает процедура чекаККМ Провести()
    Чек проводится, но не распечатывается, ошибка Сом порт занят другим приложением.

    Как сделать переключение между кассами или нужно пилить обработку под эти два вида фискальника (просто атол хорошо тем что он уневерсален и не важно какой фискальник стоит)?
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Смущает фраза про занятый порт... В параметрах разные порты используются соответственно?
  3. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    один порт, 1 фр.
    одна длл подключается при начале работы и указавыется в параметрах настройки оборудования фискальные регистраторы, а другая длл вызывается через обработку и печатает на том же фискальнике. Так вот после подключения длл из обработки она перезанимает порт и дальше из 1с чеки не печатаются
  4. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    вот так подключаю штрих и все работает,
    потом вызываем обработку и в ней тоже подключается фискальник
    Код:
    Процедура ПодключитьДрайверККМ()
              Попытка
            Результ = ЗагрузитьВнешнююКомпоненту("FPRNM1C.dll");
                Если Результ = 1 Тогда
                    ECR = СоздатьОбъект("AddIn.FprnM45");
                Иначе
                    Сообщить ("Не загружена внешняя компонента AddIn.FprnM45.");
                КонецЕсли;
                Исключение
                Сообщить ("Не найдена внешняя компонента AddIn.FprnM45.");
            КонецПопытки;
        
            ECR.DeviceEnabled = 1;
            Если ECR.ResultCode <> 0 тогда
                Возврат;
            КонецЕсли;
    КонецПроцедуры // ПодключитьДрайверККМ()
    Как видно обработки и длл разные.
    До вызова обработки фискальник печатает чеки, после вызова обработки "оплата картой" и распечатки слипов, чеки не печатаются и ругается на то что ком порт занят.
    Т.е получается что при вызове обработки "оплата картой" и подключение фискальника другой длл перезанимается компорт.
    Как этого избежать?
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Попробуйте обнулять объект после оплаты картой....
    Т.е ECR="";
  6. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Код:
    Процедура ПриЗакрытии()
       
        Параметры  = СоздатьОбъект("СписокЗначений");
        Параметры.ДобавитьЗначение(МожноПровестиЧекККМ, "МожноПровестиЧекККМ");
        Параметры.ДобавитьЗначение(МожноЗакрытьБанк, "МожноЗакрытьБанк");
       
        Форма.Параметр = Параметры;
       
        // очищаем порты
        serv.clear();
        serv = 0;
        ECR = 0;
    
    КонецПроцедуры // ПриЗакрытии()
    Обнуляю но вот что то не так.
    Видимо нужно заново вызывать обработку подключения фискальника в чеке ккм.
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Хм.. Обязательно! Ведь порт был перехвачен!
  8. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Пытался подключить оборудование после выхода из обработки при помощи ОткрытьФормуМодально("Обработка.ТорговоеОборудование" , "Подключить");
    Ругается компорт занят, хотя при закрытии обработки драйвер отключил
    ECR = 0;

    Видимо нужно перепрограммировать и в обработке банка вызывать обработку(не длл) фискальника ert и перед передачей данных нужно распознать какое сейчас оборудование штрих или сп.
    Блин гемор я такого не умею.
    Если кто знает как приладить переключение вшених компонент FPRNM1C.dll и DrvFr.dll или вообще поможет наладить процесс печати, тому вознаграждение.
    Пишите в личку, там обсудим.
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Попробуйте.. Может у компоненты есть метод DONE()... Или програмно переключить его на другой порт
  10. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Не нет такой. Может попробовать перед вызовом обработки произвести отключение фр.
  11. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Как передать данные в обработку печати фискальника из другой обработки для штрих фр-к
    Есть обработка штрих фр к при открытии
    Код:
    Процедура ПриОткрытии()
        Перем Объект, НомерЧека, Парам;
       
        СтатусВозврата(0);
        Форма.Параметр.Выгрузить(Парам);
        Форма.Параметр.УдалитьВсе();
       
        Если Парам.РазмерСписка() = 0 Тогда
            Рез = 0;
            ОписаниеРезультата = "в обработку не переданы параметры";
        Иначе
           
    Процесс = НРег(Парам.Получить("Процесс"));
           
            ИначеЕсли Процесс = "печатать_чек" Тогда
                Объект        = Парам.Получить("Объект");
                СписокТоваров = Парам.Получить("СписокТоваров");
                СуммаЧека     = Парам.Получить("СуммаЧека");
                Получено      = Парам.Получить("Получено");
                ЧекНаВозврат  = Парам.Получить("Возврат");
                НомерСекции   = Парам.Получить("НомерСекции");
                Скидка        = Парам.Получить("Скидка");
               
                Рез = ПечататьЧек(Объект, СписокТоваров, СуммаЧека, Получено, Скидка, ЧекНаВозврат, НомерСекции, НомерЧека);
               
                Форма.Параметр.Установить("НомерЧека", НомерЧека);
    
    //Тут создаем что процесс Печать Слип
    ИначеЕсли Процесс = "печатать_слип" Тогда
                Объект = Парам.Получить("ECR");
               
                Рез = ПечататьСлип()
    ИначеЕсли //продолжение при открытии (данные далее нас не интересуют)
    
    //Сама функция печти Слипа
    
    Функция ПечататьСлип()
      Если ПустоеЗначение(Объект) = 1 Тогда
         ОписаниеРезультата = "устройство не подключено";
         Возврат 0;
       КонецЕсли;
      Пока "на экране окно вопроса" = "на экране окно вопроса" Цикл
         Объект.GetECRStatus();
         Результат = ОбработкаОшибокПриПечати(Объект);
         Если Результат = "Отмена" Тогда
           Объект.Disconnect();
           Возврат 0;
         ИначеЕсли Результат = 0 Тогда
           Прервать;
         КонецЕсли;
       КонецЦикла;
       
       Если Объект.ECRAdvancedMode = 3 Тогда
         Объект.ContinuePrint();
         Пока "на экране окно вопроса" = "на экране окно вопроса" Цикл
           Объект.GetECRStatus();
           Результат = ОбработкаОшибокПриПечати(Объект);
           Если Результат = "Отмена" Тогда
             Объект.Disconnect();
             Возврат 0;
           ИначеЕсли Результат = 0 Тогда
             Прервать;
           КонецЕсли;
         КонецЦикла;
       КонецЕсли;  
       
      
    
    Объект.DocumentName = "Нефискальный документ";
    Объект.DocumentNumber = 5;
    Объект.PrintDocumentTitle();
    
    //Печать строки
    Объект.UseReceiptRibbon = TRUE;
    Объект.UseJournalRibbon = false;
    Объект.StringForPrinting = СтрокаТекста;
    Объект.PrintString();
    FinishDocumentMode := 0; \\ с рекламным текстом или без него.
    Driver.FinishDocument;
    //Обрезать документ
    Объект.CutCheck();
    
    Объект.Disconnect();
    //Возврат 1;
    ;
    Теперь перейдем к обработке банковского оборудования
    При открытии идет подключение банковского оборудования и фискальника
    Код:
    Перем serv;
    Перем ECR;
    Перем amount;
    Перем cheque;
    Перем МожноПровестиЧекККМ;
    Перем МожноЗакрытьБанк;
    Перем Сумма;
    Процедура ПодключитьДрайверТерминалаSBRF()
    КонецПроцедуры
    
    //Далее следует попытка провести операцию
    Процедура ОплатаКартой()
         
         Amount = Serv.SParam ("Amount", Сумма);
         Если ....... Тогда
           Предупреждение("Операция с банком не удалась! Попробуйте еще раз.");
           СтатусВозврата(0);
           Возврат;
           
         Иначе
           TermNum  = Serv.GParamString("TermNum");
           ClientCard  = Serv.GParamString("ClientCard");
           ClientExpiryDate = Serv.GParamString("ClientExpiryDate");
           AuthCode  = Serv.GParamString("AuthCode");
       
           cheque = Serv.GParamString("cheque"); Вот здесь передается строкой что нужно напечатать строки разделяются между собой ||
    //       ECR.Caption = cheque; // для атолл драйвера это объект для печати
    //    ECR.TextWrap=1;  //для атолл перенсоить строки
          //Значит тут попробуем передать данные в обработку фискальника
    // для документа ЧекККМ функция отвечающая за печать глФРПечататьЧек
    //Пробуем
      Рез = 0;
       
       Если глФРВкл = 1 Тогда
    Параметры = СоздатьОбъект("СписокЗначений");
         Параметры.Установить("Процесс"  , "печатать_слип");
         Параметры.Установить("Объект"  , ECR);
         Параметры.Установить("ПарольПользователя", глФРПарольПользователя);
    
    РезТекст = глОборудованиеКоманда("ФР", глФРОбработка, Параметры);
         Если ПустоеЗначение(РезТекст) = 0 Тогда
           Сообщить(РезТекст);
         Иначе
           Если Параметры.Получить("Результат") = 0 Тогда
             Сообщить("Фискальный регистратор: ошибка при печати чека");
             Сообщить(Параметры.Получить("ОписаниеРезультата"));
    КонецЕсли;
    КонецЕсли;
    
          // Если ECR.PrintString() <> 0 Тогда //тут проверяем напечатал ли фискальник для атол
             Serv.NFun (6004);
             Предупреждение("Не удалось распечатать Чек операции!
              |Операция с банком не удалась!!!
                    |Включите ККМ или замените ленту и попробуйте еще раз!!!)",60);
             МожноПровестиЧекККМ = 0 ;
             СтатусВозврата(0);
             Возврат;
           Иначе
             МожноПровестиЧекККМ = 1 ;
             Форма.Закрыть(1);
           КонецЕсли;
       
           Для СчПустыхСтрок=1 По 6 Цикл
           ECR.Caption = " ";
           Если ECR.PrintString() <> 0 Тогда
             Сообщить("не напечатали ---");
           КонецЕсли;
           КонецЦикла;
        КонецЕсли;
    
    КонецПроцедуры // ОплатаКартой()
    
    Как то так но вроде кажется что то пропустил
  12. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Что на данный момент получилось, из обработки принятие карт, передать данные в обработку фискальника.
    С терминала банка получил только следующие параметры.
    Код:
    Объект   = Парам.Получить("Объект"); // это то что фискальник подключен
                ECR      = Парам.Получить("ECR");   //Общие данные, одной строкой разделены табуляцией, там( город, наименование магазина, ип, дата, время, тип оплаты)
                Пароль   = Парам.Получить("ПарольПользователя"); //опять для фискальника
                Терминал = Парам.Получить("Терминал");  //номер терминала
                Карта    = Парам.Получить("Карта"); //номер карты полностью без *****
                ДатаК    = Парам.Получить("ДатаК"); //дата валид карты
                КодАвто  = Парам.Получить("КодАвто"); //код авторизации
    Рез = ПечататьСлип(ECR, Объект, Пароль, Терминал, Карта, ДатаК, КодАвто);
    
    Теперь самое интересное на чем и затык пробуем распечатать
    Код:
    Объект.StringForPrinting = ECR; //отказывается печатать хз почему
    Объект.PrintString();
    Объект.StringForPrinting = Терминал; /печатает без слова терминал просто тупо цифры
    Объект.PrintString();
    Объект.StringForPrinting = Карта;  //номер карты не скрывает ****
    Объект.PrintString();
    
    Может кто в курсах как что правильно до оформить?
  13. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    ошибочное сообщение
  14. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Подскажите как разбить длинную строку по 36 символов
  15. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Пока 1=1 Цикл
    СписокСтрок.ДобавитьЗначение(Лев(ДлиннаяСтрока,36)); //список строк
    ДлиннаяСтрока=Сред(ДлиннаяСтрока,37);
    Если СтрДлина(ДлиннаяСтрока)<=36 Тогда
    СписокСтрок.ДобавитьЗначение(ДлиннаяСтрока);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    SerzhM нравится это.
  16. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Не совсем получается
    Код:
    Функция ПечататьСлип(ECR, Объект, Пароль)  //Объект это обработка фискальника, ЕСR данные которые нужно распечатать.
       
       
        Если ПустоеЗначение(Объект) = 1 Тогда
            ОписаниеРезультата = "устройство не подключено";
            Возврат 0;
        ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 0 Тогда
            Возврат 0;
        КонецЕсли;
      
    
       
    Пока 1=1 Цикл
    СписокСтрок.ДобавитьЗначение(Лев(ECR,36));    /// Добавить значение не предоставляет агрегатное значение. 
    ДлиннаяСтрока=Сред(ECR,37);
    Если СтрДлина(ECR)<=36 Тогда
    СписокСтрок.ДобавитьЗначение(ECR);
    Прервать;
    КонецЕсли;
    КонецЦикла; 
    
    //Объект.StringForPrinting = ECR;  Была попытка распечатать длинную строку.
    //Объект.PrintString();
    
    ОтрезатьЧек(Объект, Пароль);
    Возврат ОтключитьсяОтФР(Объект, Пароль);
    КонецФункции
    Пытался вставить попытку отобрать значение ругается что добавить значение не предоставляет агрегатное значение.
    Самое что интересное прописал Сообщить(ECR);
    выдал вот такое сообщение
    Название магазина
    ИП такойто
    Город Улица
    +телефон
    11.05.14 08:57
    ЧЕК
    Оплата
    Номер операции: 0004
    Терминал: 11111111
    Пункт обслуживания: 1111111
    Mastercard
    Карта:(D) ************0445
    Срок действия:
    Клиент: UNEMBOSSED/NAME

    Сумма (Руб):
    0.90
    ОДОБРЕНО
    Код авторизации: 260

    ________________________
    подпись клиента

    _________________________
    подп.кассира(контролера)
    ================================

    ИП такойто
    Город Улица
    +телефон
    11.05.14 08:57
    Копия 1
    ЧЕК
    Оплата
    Номер операции: 0004
    Терминал: 111111
    Пункт обслуживания: 2222222
    Mastercard
    Карта:(D) ************0445
    Срок действия:
    Клиент: UNEMBOSSED/NAME

    Сумма (Руб):
    0.90
    ОДОБРЕНО
    Код авторизации: 260

    ________________________
    подпись клиента

    _________________________
    подп.кассира(контролера)
    ================================
    чет совсем не пойму то ли строка длинная то ли с циклом че не так, не могу получить данные
  17. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Уважаемый! Я же привел кусок кода... Чуточку внимательности

    СписокСтрок=СоздатьОбъект("СписокЗначений");

    Пока 1=1 Цикл
    СписокСтрок.ДобавитьЗначение(Лев(ECR,36));
    ДлиннаяСтрока=Сред(ECR,37);
    Если СтрДлина(ECR)<=36 Тогда
    СписокСтрок.ДобавитьЗначение(ECR);
    Прервать;
    КонецЕсли;
    КонецЦикла;

    и..... вуалЯ!!
    SerzhM нравится это.
  18. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Скорее всего будет еще один нюанс, используется символ для переноса данных на новую строку.
    Когда просто смотришь какие данные в строке выглядит это так, Название магазина || ИП ||
    вот как этот символ выципить( и может по этому символу искать окончание строки)

    Вложения:

  19. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Скорее всего это перевод коретки

    ПереводКоретки=""+Симв(13)+Симв(10);
  20. TopicStarter Overlay
    SerzhM
    Offline

    SerzhM Опытный в 1С

    Регистрация:
    26 окт 2009
    Сообщения:
    511
    Симпатии:
    3
    Баллы:
    29
    Как в этом случает строку перебрать до этого символа?
    А выше вами код не работает загнал комп в ступор, в отладчике берется первые только 36 символов, дальше не хочет, и зациклился что данные берет первые 36 символов а остальное продолжение игнорирует

    Может так?
    Код:
    Пока 1=1 Цикл
    НашаСтрока = СокрЛП(ECR);
    ПозицияСлеша=Найти(НашаСтрока,"""+Симв(13)+Симв(10)");
    СтрокаДо =Лев(НашаСтрока,ПозицияСлеша-1);
    СтрокаПосле = Сред(НашаСтрока,ПозицияСлеша+1,СтрДлина(НашаСтрока));
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Последнее редактирование: 19 май 2014

Поделиться этой страницей