Имя: Пароль:
1C
1C 7.7
v7: Мария-301МТМ - зависание после отправки данных по модему «МТМ-01»
0 Lexis2001
 
14.11.13
13:31
Который день бьюсь над проблемой. Помогите кто сталкивался.
Имеем ситуацию:
1С 7.70.027, M301ManagerPlus 3.0.0.24 настроенный на связь с фискальным регистратором через DCOM. Мария подключена к компу с Win XP. С него заходим на удаленный рабочий стол Win 2003 R2 Standard. При инициализации ЕККА удалённо запускается на компе с XP M301ManagerPlus через DCOM. Успешно бьём чеки.
Эта схема работала прекрасно до того дня как к Марии подключили злополучный модем. Теперь мы работаем ровно 20 минут (именно каждые 20 минут идёт отправка данных через модем). После часа ИКС (см. выше) выбивается отчёт о передаче данных, далее висим, и кнопки Переключиться, Повторить. Нужно завершать 1С, Оле манагер и снова заходить. Было замечено, что передача отчётов происходит при инициализации ЕККА. Пробовал ставить паузу после инициализации в три секунды чтобы дать время отправить данные - не помогло. Пробовал убрать M301.LockPrinter (и Unlock соответственно) - не помогло. Намертво виснет после каждого отчёта о передаче данных. Возможно он эксклюзивно забирает себе порт и всё, далее работать нельзя. Обязательно-ли каждый раз инициализировать аппарат? С другой стороны он не отправит данные если не будет инициализирован... Help...
1 palpetrovich
 
14.11.13
13:42
А разве так он должен работать? К примеру Датекс3530т отсылает информацию только после Z-отчета.  

зы: с "модемной марией" не работатл
2 torrensen
 
14.11.13
13:51
Попробуйте сделать инициализацию ЭККА только при печати чека, а по окончании отключайтесь. Правда это увеличивает время печати.
3 Lexis2001
 
14.11.13
13:52
(1) Датекс может так и работает, не сталкивался. Но марийка  виснет каждый раз как выбиваешь чек или делаешь икс отчет по словам продавца. В обоих операциях общее одно - инициализация аппарата. Следовательно, виню лишь её. Ну и само собой каждые 20 минут отправляется отчет о передаче данных, а не на каждый чек. С периодом игрался тоже, толку пока нет. По DCOM-у не работает никто из знакомых. У всех другая версия OLE manager. И у всех всё ок. Поэтому вопрос. Может-ли 3.0.0.24 работать через без DCOM?
4 torrensen
 
14.11.13
13:54
Есть у машки такое свойство, если она связывается с эквайером, то никакой другой функции она не делает. Настроил работает через DCOM по описаной выше схеме
5 Lexis2001
 
14.11.13
13:54
(2) Так сейчас и есть. Инициализация при каждой печати чека. Отключаться командой Done()? Какие действия производит команда? Я задумался о том что делать инициализация только один раз и держать порт открытым до закрытия 1С-ки. Ибо именно при ней начинаются зависания.
6 Lexis2001
 
14.11.13
13:56
(4) Другими словами если после инициализации подождать какое-то время пока модем передаст данные то дальше успешно пойдет работа? Я ставил 3 секунды паузы. Может выставить 10? Как прочитать признак что модем передал данные и теперь мы можем печатать чеки с чистой совестью?
7 Lexis2001
 
14.11.13
13:58
(4) То есть работает через DCOM, есть модем, и ничего не виснет? Поделитесь секретом плиз :)
8 torrensen
 
14.11.13
13:59
У меня настроена функция повторной печати чека. а связвается машка где-то раз в 20 минут. может отключить интернет на время работы и включать его только для z-отчета.
9 Lexis2001
 
14.11.13
14:00
Отключить интернет слишком грубый костыльный метод. Не подходит. Можно подробнее что за функция повторной печати чека? Это как?
10 Lexis2001
 
14.11.13
14:06
Нюанс - WinSRV2003 виртуальная машина если это имеет значение. Скорость ком-порта 115200. Версия прошивки модема 1.30. Проблема "Сервер занят, переключиться, повторить" появилась именно после установки модема.
11 torrensen
 
14.11.13
14:14
У меня так
        Результат = M301Manager.OpenCheck(ОтделЭККА);
        Если Результат <> 1 Тогда
            глКомментарий("Не удается открыть чек. Попробуйте позже!",0,,"!");
            Перейти ~ЗавершениеРаботы;
        КонецЕсли;
        
        ЧекЭККАОткрыт = 1;
        
        Состояние(" Печать строк чека...");
                     
        Попытка
            СуммаПоЧеку = 0;
            
            тПродажи.ВыбратьСтроки();
            Пока тПродажи.ПолучитьСтроку() = 1 Цикл
                _GoodName     = тПродажи.ИмяТовара;
                _Qty        = тПродажи.Количество;
                _Price        = тПродажи.ЦенаШтука * 100;
                _Dividual    = 0; // 0-штуки 1-весовой товар
                    
                _Tax1Index  = 1;  // 0 - БЕЗ НДС
                _Tax2Index    = 0;
                
                _Article    = тПродажи.Артикул;
                
                Если тПродажи.СкидкаСумма = 0 Тогда
                    _DiscountDirect    = -1;
                    _DiscountName     = "";
                    _Discount         = 0;
                Иначе
                    _DiscountDirect    = 0;
                    _DiscountName     = "" + тПродажи.СкидкаПроцент + "%";
                    _Discount         = тПродажи.СкидкаСумма * 100;
                КонецЕсли;
                                         
                СуммаПоСтроке = M301Manager.FiscalLineEx(_GoodName, _Qty, _Price, _Dividual, _Tax1Index, _Tax2Index, _Article, _DiscountDirect, _DiscountName, _Discount);
                
                Если СуммаПоСтроке <> (тПродажи.СуммаСоСкидкой * 100) Тогда
                    Попытка
                        Состояние(" Отмена чека...");
                        глКомментарий("По строке " + тПродажи.НомерСтроки + " неправильно вычислена сумма. Нужно= " + тПродажи.СуммаСоСкидкой + " ЭККА получил= " + СуммаПоСтроке / 100,0,,"!");
                        
                        Результат = M301Manager.AbortCheck();
                        Если Результат = 1 Тогда
                            ЧекЭККАОткрыт = 0;
                        Иначе
                            глКомментарий("ОШИБКА ОТМЕНЫ ЧЕКА!",0,,"!");
                        КонецЕсли;
                        
                        Перейти ~ЗавершениеРаботы;
                    Исключение
                        ВызватьИсключение;
                    КонецПопытки;
                КонецЕсли;
            
                СуммаПоЧеку = СуммаПоЧеку + СуммаПоСтроке;
            КонецЦикла;
            
            Если СуммаПоЧеку = (тПродажи.Итог("СуммаСоСкидкой")*100) Тогда
                тОплаты.ПолучитьСтрокуПоНомеру(1);          // наличные
                _GetCash     = тОплаты.СуммаОплаты * 100;
                тОплаты.ПолучитьСтрокуПоНомеру(2);            // по карте
                _GetPay     = тОплаты.СуммаОплаты * 100;
                тОплаты.ПолучитьСтрокуПоНомеру(3);          // в кредит
                _GetCredit     = тОплаты.СуммаОплаты * 100;
                тОплаты.ПолучитьСтрокуПоНомеру(4);          // тара
                _GetPacking = тОплаты.СуммаОплаты * 100;
                    
                Пока Напечатано = 0 Цикл
                    ИтоговаяСуммаЧека = 0;
                    Состояние(" Закрытие чека...");
                    
                    _ДатаНачалаЗакрытияЧека = _GetPerformanceCounter();    
                                
                    M301Manager.ShowErrorMessages(0);
                    ИтоговаяСуммаЧека = M301Manager.CloseCheckEx(_GetCash,_GetPay,_GetCredit,_GetPacking);
                    Попытка
                        Состояние(" Ожидание окончания печати чека...");
                        
                        Пока (_GetPerformanceCounter() - _ДатаНачалаЗакрытияЧека) < (ВремяОжиданияОкончанияПечати + ДополнительноеВремяОжидания) Цикл
                            Состояние(" Ожидание окончания печати чека...");
                        КонецЦикла;
                        
                        КодОшибкиПечати = M301Manager.LastErrorCode();
                        ТекстОшибкиПечати = M301Manager.LastErrorMessage();
                                      
                        Если КодОшибкиПечати <> "" Тогда
                            глКомментарий("LastErrorCode()    = " + КодОшибкиПечати,0,,"!!!");
                            глКомментарий("LastErrorMessage() = " + ТекстОшибкиПечати,0,,"!!!");    
                        КонецЕсли;
                                                
                        Состояние("");
                        
                        Если КодОшибкиПечати = "" Тогда
                            Напечатано = 2;
                            M301Manager.ShowErrorMessages(1);
                        ИначеЕсли КодОшибкиПечати = "HARDPAPER" Тогда
                            Ответ = Вопрос("Нет бумаги в ЭККА!" + РазделительСтрок + "Продолжить?", "Да+Нет");
                            Если Ответ = "Да" Тогда
                                Продолжить;    
                            КонецЕсли;
                            M301Manager.ShowErrorMessages(1);
                            Перейти ~ЗавершениеРаботы;
                        ИначеЕсли КодОшибкиПечати = "CONNTIMEOUT" Тогда
                            Ответ = Вопрос("Нет связи с ЭККА!" + РазделительСтрок + "Продолжить?", "Да+Нет");
                            Если Ответ = "Да" Тогда
                                Продолжить;    
                            КонецЕсли;
                            M301Manager.ShowErrorMessages(1);
                            Перейти ~ЗавершениеРаботы;
                        Иначе              
                            Предупреждение(ТекстОшибкиПечати);
                            M301Manager.ShowErrorMessages(1);
                            Перейти ~ЗавершениеРаботы;
                        КонецЕсли;
                    Исключение
                        M301Manager.ShowErrorMessages(1);
                        Перейти ~ЗавершениеРаботы;
                    КонецПопытки;
                КонецЦикла;
                    
                Если ИтоговаяСуммаЧека <> тПродажи.Итог("СуммаСоСкидкой")*100  Тогда
                    глКомментарий("Ошибка вычисления общей суммы по чеку!",0,,"!!!");
                    Перейти ~ЗавершениеРаботы;
                КонецЕсли;
                
                ЧекЭККАОткрыт = 0;
                Состояние(" Проверка нового чека...");
                ДанныеНовогоЧека = M301Manager.GetCheckResultXML();
                ПроверитьНомерЧекаЭККА(ДанныеНовогоЧека);
                
                ДатаВремяПечати = M301Manager.GetPrinterTime();
                Если ДатаВремяПечати <> "" Тогда
                    //сообщить("GetPrinterTime() = " + ДатаВремяПечати + "< >" + ТекущееВремя());
                    
                    _Часы  = Сред(ДатаВремяПечати, 9, 2);
                    _Мин   = Сред(ДатаВремяПечати, 11, 2);
                    //_Сек   = Сред(ДатаВремяПечати, 13, 2);
                
                    ВремяЧекаЭККА = СокрЛП("" + _Часы + ":" + _Мин);
                КонецЕсли;
                
                Состояние(" Вывод на дисплей...");
                M301Manager.PutToDisplay("СУМА", ИтоговаяСуммаЧека / 100);
                
                Перейти ~ЗавершениеРаботы;
            КонецЕсли;
        Исключение
        КонецПопытки;
        
        //////////////////////////////////
        ~ЗавершениеРаботы:
        Если ЧекЭККАОткрыт = 1 Тогда
            Состояние(" Отмена чека...");
            
            Результат = M301Manager.AbortCheck();
            Если Результат = 1 Тогда
                ЧекЭККАОткрыт = 0;
            Иначе
                глКомментарий("ОШИБКА ОТМЕНЫ ЧЕКА!",0,,"!");
            КонецЕсли;
        КонецЕсли;
        
        Состояние(" Отмена доступа к принтеру...");
        Результат = M301Manager.UnLockPrinter();
        Если Результат = 1 Тогда
            БлокировкаПринтераЭККА = 0;
        Иначе
            Предупреждение("Невозможно отменить доступ к принтеру!", 5);
        КонецЕсли;
        
        ~КонецРаботы:
        Состояние(" Отключение...");
        M301Manager.Done();
        Состояние("");
    Исключение
        глКомментарий("Ошибка печати чека",0,,"!!!");
        глКомментарий(ОписаниеОшибки(),0,,"!!!");
                        
        Если ЧекЭККАОткрыт = 1 Тогда
            M301Manager.AbortCheck();    
        КонецЕсли;
        
        Если БлокировкаПринтераЭККА = 1 Тогда
            M301Manager.UnLockPrinter();    
        КонецЕсли;
                        
        Если Объект301Создан = 1 Тогда
            M301Manager.Done();    
        КонецЕсли;
        
        Состояние("");
    КонецПопытки;
12 Lexis2001
 
14.11.13
14:32
(11) Пардон, не совсем точно выразился. Да, это прекрасная процедура печати чека, несомненно. Но в моём конкретном случае ошибка вылетает до того как начнётся печать чека. Собака зарыта в инициализации.
13 Lexis2001
 
14.11.13
14:32
Как правильно вставить код? Какие-то теги есть тут?
14 Lexis2001
 
14.11.13
14:33
Попытка
                M301.ShowErrorMessages = 0;
                Если M301.InitEx(Число(НомерКассы), Пользователь, Пароль, 0, "Торговля", Сервер) = 1 Тогда
                    scr = СоздатьОбъект("WScript.Shell");
                    scr.Run("sleep 3",0,1);
                    scr = 0;
                    // Захватить доступ к принтеру
                    //Если M301.LockPrinter(30) = 1 Тогда
                        //Инф=СокрЛП(M301.GetPrinterConfig());
                        //ЗначениеИзФайла(КаталогИБ()+"Artics.sys",Артикулы,1);
                        // Открыть смену
                        //M301.NullCheck();
                        ККРВключен=1;
                        // Освободить принтер для других приложений
                        //M301.UnlockPrinter();
                        глПереченьДрайверов.ДобавитьЗначение(M301,НазваниеДрайвера+ЭККА.Код);
                    //Иначе
                        //ККРВключен=0;
                        //Сообщить("Принтер занят другим приложением. Попоробуйте позже");
                    //КонецЕсли;
                    
                    M301.Done();
                    
                Иначе
                    ККРВключен=0;
                    Сообщить("Не удолось подключиться к OLE-серверу M301Manager");
                КонецЕсли;
            Исключение
                ККРВключен=0;
                Сообщить("Не удолось подключиться к OLE-серверу M301Manager");
            КонецПопытки;
15 Lexis2001
 
14.11.13
14:34
//Если M301.LockPrinter(30) = 1 Тогда

это я специально закомментировал, но эффекта не дало
16 Lexis2001
 
14.11.13
14:37
Вопрос вдогонку: Можно-ли безболезненно использовать два или три раза подряд инициализацию(метод InitEx)? Это корректно?
17 babayzver
 
14.11.13
21:22
(0) У нас похожая ситуация была... Тоже были проблемы, разные то со связью, то с выводом чека. Помогла установка оле менеджера другой версии, например замечено что прекрасно работает версия 3.0.0.22, а до этого была 24 или 25, как оказалось "сырая".
18 babayzver
 
14.11.13
21:24
(16) помоему ты просто запустишь таким образом 3 процесса M301... Но работать будет последний.
19 Lexis2001
 
15.11.13
14:07
(17) спасибо за идею, попробовал установить 3.0.0.22 и не помогло. Печатаем успешно чек, ждём полчаса. Полчаса проходит. Пробуем еще раз печатать чек. При инициализации аппарата печатается отчёт о передаче данных в интернет, висим, сообщение "Сервер занят" с кнопками "Переключиться" и "Повторить". Решение - завершить процесс 1С, завершить процесс M301Manager на компе с кассой и снова по новой зайти. И так каждые 20 минут.
20 J_B
 
15.11.13
14:18
А ком-порт "железный" или через преобразователь? Если usb - com то там может быть проблема. У меня таким же образом выделывался Мини-ФП6 пока не спаяли ком-портовый кабель (без модема работал год, через USB, без единого глюка).
21 Lexis2001
 
15.11.13
14:38
(20) COM-порт железный
22 Lexis2001
 
20.11.13
13:15
Всем спасибо за обсуждение.
Проблема решена. Для будущих поколений оставлю решение :-)

Помогла установка новой версии OLE Manager Plus Резонанс (версия  4.0.20131111) которая стоит 150 гривен. Работает без DCOM. Зависания прекратились. Печатается отчёт о передаче данных и следом за ним чек.

Таким образом тема закрыта.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший