|
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. Зависания прекратились. Печатается отчёт о передаче данных и следом за ним чек. Таким образом тема закрыта. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |