Имя: Пароль:
1C
1С v8
1с Розница, ошибка печати чека
0 TrudnyiRebenok
 
29.10.18
05:53
Есть в 1с рознице один, на мой взгляд, глупый (но скорее косячный) алгоритм.
По-порядку: продается бутылка крепкого алкоголя (простейший случай оплаты - наличкой) -
1. Фиксация в ЕГАИС через УТМ - печать чека ЕГАИС.
2. Фиксация в Налоговой через ОФД - печать чека.

Так вот эта самая функция "печать чека", очень сильно влияет на продолжение фискализации.
Если после фиксации в ЕГАИС происходит внезапное окончание кассовой ленты, то УТМ тут же отправляет возврат ЕГАИС. Но если это был этап фиксации в ОФД, почему-то фискальник не отменяет продажу и в ОФД она оказывается зафиксированной.
Я пробовал закомментировать процедуру обработки ошибки печати чека, но тогда происходит обратное - В ЕГАИС возврат не оформляется, а в ОФД вообще ничего не долетает.
С одной стороны принцип (в общем) верный, но алгоритм и код в 1с явно косячный и непродуманный.

Отсюда вопрос:
Как можно вообще отключить реакцию 1с Розницы (2.2.7 конкретно) на окончание кассовой ленты. Меня бы устроило, если бы С-ка это "важное" событие вообще игнорировало, потому как кассиры часто не следят за лентой, а иногда и фискальники бывает глючат (т.е. выдают ответ "нет бумаги", когда она на самом деле есть).
Вполне возможно есть какая-то настройка в рознице (маловероятно конечно). Но меня устроит, если кто знает, где этот код отрабатывается, в каком модуле и в каком виде?
1 Михаил Иванович
 
29.10.18
06:01
(0) Так нравятся "специалисты", которые даже место нужное в коде найти не могут, но  рассуждать о косячности кода в !С это пожалуйста...
Может косяк в голове у вас?
2 Мимохожий Однако
 
29.10.18
06:29
(0) Тут нужен мозг, документация и отладчик.
3 Масянька
 
29.10.18
08:33
"С одной стороны принцип (в общем) верный, но алгоритм и код в 1с явно косячный и непродуманный. "
Если Вы сумели понять верный принцип из косячного и непродуманного кода  и алгоритма - вопрос: кто косячит?
4 TrudnyiRebenok
 
29.10.18
16:25
Ой спасибо всем вам за помощь.
Что бы я делал без вас дорогие наиумнейшие специалисты.
Вы мне так помогли, что мне от вас, вышеотписавшихся помощи больше не нужно.
Как отлаживать, если тестовая машина работает в тестовом режиме?
Михаил Иванович - лично отвечаю на ваш выпад
Работает кассир, у него заканчивается кассовая лента, при этом код 1с работает мной вышеописанным способом. Т.е. фиксация в ЕГАИС прошла, а в ОФД нет, потому что у него лента закончилась. А у него стоит очередь - продуманный код?
Запускаю я отладку на тестовой машине, а она ведёт по ветке, которая с оборудованием не связана никак и в ответных массивах и структурах нет и намёка на ситуацию, мной описанную. Как её понять?
Все вы здесь вумные, а мы вот, пыимаишь, пальцем деланные!

Сказал бы лучше честно, что сам нифига не знаешь, а то раздулся тут...

Ладно, не надо ничего, сам найду, не впервой. А вы раздувайтесь от гордости за себя. Смотрите не полопайтесь!..
5 Ёпрст
 
29.10.18
16:34
ну дак смотри в обработке печати чека, если драйвер вернул ошибку "закончилась лента", чтоб он в офд данные не посылал вообще и чек не фискализировал
6 Масянька
 
29.10.18
16:38
(5) А место в коде показать? :(
7 dezss
 
29.10.18
16:43
(5) он и не посылает их в ОФД...если закончилась лента, то чек не пробит и баста, он анулирован, а ТС врет...либо юзает всякие альтернативно-одаренные ККТ с не менее одаренными прошивками...

ИМХО, ему нужно, чтобы при ошибке пробития чека ККТ был возврат по ЕГАИС
8 lenochka-semicova
 
29.10.18
17:05
(7) Суть проблемы такова, что печать квитанции с QR-кодом ЕГАИС - это доп. квитанция - т.е. нефискальный документ. С точки зрения ККТ чек документ успешно фискализирован и данные в ОФД отправлены, далее печатается квитанция и на ней что-то происходит - например, заканчивается бумага. Драйвер возвращает ошибку.

Так вот в 1С начало фискализации чека и печать доп.квитанции ЕГАИС считается одной операцией, и 1С, видя, что драйвер вернул ошибку, как раз (в РМК, в частности) и вызывает
Процедура ПечатьЧека_ПослеОшибкиПечатиЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
которая, если .ЕстьАлкогольнаяПродукцияЕГАИС
вызывает отмену операции

У нас даже ответ есть от v8 еще по релизу 2.2.6 от сентября 2017 года, что такая ошибка зарегистрирована ранее. Код ошибки не сказали. Но уже сколько релизов прошло, а все не исправлено.
9 lenochka-semicova
 
29.10.18
17:10
(6) И даже место в коде могу показать, но толку-то

Т.е. результат работы, который возвращается в РМК (чек) уже не содержит того, что чек был успешно пробит, а свалилась именно печать доп. документов. А чтобы это править надо править код, который после фискализации результат куда-то записывает, потом передает все эти данные следующей операции, которая вызывает другую команду драйвера, та должна этот результат сохранить и передать в РМК, что чек фискализирован успешно, но вот остальные документы не допечатаны. И там "наскоряк" поправить уже не получится.
10 lenochka-semicova
 
29.10.18
17:13
(4) Ищите и обрящете
11 dezss
 
29.10.18
17:13
(9) покажи этот код
12 Масянька
 
29.10.18
17:23
(9) Я тебе верю. Абсолютно.
13 lenochka-semicova
 
29.10.18
17:32
(11) Легко
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ФискализацияЧека
ДанныеЧека = МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляФискализацияЧека
Результат = ОбъектДрайвера.СформироватьЧек

После этого Результат равен Истина чек фискализирован и поставлен ККТ в очередь на отправку

Потом система идет в
МенеджерОборудованияКлиент.НачатьВыполнениеКомандыПечатиЧека_ЗавершениеПечати

и там делает вот это нехорошее дело
ВремВходныеПараметры.Добавить(СформироватьШаблонИнфоКвитанции(ДополнительныеПараметры, ШиринаСтроки));

и потом
Результат = ОбработчикДрайвераМодуль.ВыполнитьКоманду("PrintText", ВремВходныеПараметры... бла-бла

И вот если система падает на методе PrintText, то вроде бы как у ККТ все фискализировано, а в 1С  вроде бы как результат = Ложь;

Есть желание отладкой опровергнуть?
14 lenochka-semicova
 
29.10.18
17:32
(13) Вот СформироватьШаблонИнфоКвитанции - это и есть процедура формирования текстовой квитанции ЕГАИС для печати
15 lenochka-semicova
 
29.10.18
17:34
Собственно, тут и можно ставить первую заглушку.
Но есть один нюанс: это не единственное место - есть еще несколько - но их уже ищите сами.
16 lenochka-semicova
 
29.10.18
17:35
(15) Т.е. для ЕГАИС - это самое то место, а для других шаблонов и нефискальных документов - места вызова другие, но они могут дать такой же эффект и без ЕГАИС.
17 lenochka-semicova
 
29.10.18
17:36
И вообще - на этом форуме люди часто ведут себя некрасиво, агрессивно и не помогают друг-другу. Всем добра.
18 Масянька
 
29.10.18
17:40
(17) Про себя скажу: прежде чем выступать о "глупый (но скорее косячный) алгоритм" стоит разобраться (ну, хотя бы попытаться) в коде. Ну, а когда "и тут я - весь в белом" - ответка летит быстрее космических кораблей.
19 zippygrill
 
29.10.18
18:48
автор по делу говорит. Есть узкие места в РТ.
20 Звездец
 
29.10.18
23:34
а причем тут РТ?
1. Многие ФР не отслеживают окончание ленты.
2. Печать происходит после фискализации в ФН и подготовки к отправке ОФД. И что вы тут отменять собрались?
3. ЕГАИС чек - это нефискальный документ, значит и делать с ним можно все что угодно.

После окончания ленты подавляющее большинство фр остается висеть с открытым чеком. И после замены ленты или закрывает его распечатав или же ждет команду продолжения печати. Вот подачу команды продолжения печати конечно в розницу можно было бы и добавить, но и тут есть одно но, далеко не все ФР возвращают отдельный код для ленты, как правило там некая общая ошибка.


пс. Что бы не нести полную чушь, сначала лучше разобраться как работает ФР
21 dezss
 
30.10.18
09:28
(18) +100500
(13) Это реальный косяк разрабов из 1С, ИМХО. Считать чек непробитым из-за того, что не распечатался текст - бред. Тогда уж надо было сперва этот текст печатать, а потом уже фискализировать чек.
Кстати, ТС писал о другом порядке:
"1. Фиксация в ЕГАИС через УТМ - печать чека ЕГАИС.
2. Фиксация в Налоговой через ОФД - печать чека."

(20) тут зависит от того, с какой компонентой работаешь, ИМХО. Если с той, что работает с xml, то никакого продолжения и открытого чека быть не может. Вернее, можно было бы так сделать, но тогда 1с-ка либо бы висела, ожидая ответа от ККТ, либо тупо рвала соединение, с соответствующим результатом. Так что аннулирование таких чеков выглядит логично.
22 lenochka-semicova
 
30.10.18
11:27
(21) Никто и не отрицает, что это реальный косяк:
ибо я еще в (8) написала
>>У нас даже ответ есть от v8 еще по релизу 2.2.6 от сентября 2017 года, что такая ошибка зарегистрирована ранее.

ответ от v8 - это ответ от [email protected]

--
Что касается порядка у автора
Порядок всегда такой:
- 1С говорит - НачатьФискализациюЧека
- драйвер ККТ на это возвращает номер последнего фискального документа и номер текущей смены.
- 1С передает в ЕГАИС Номер+1 и НомерСмены и текущую дату (условно) при переходе 23:59 будет не текущая, но не суть, т.к. обычно после 23 никто алкоголь не продает.
- ЕГАИС возвращает подпись чека по этим трем параметрам
- 1С запихивает подпись в доп. параметры и говорит ФискализироватьЧек
- драйвер ККТ возвращает результат фискализации и далее как я написала (13) - ну иногда еще другие доп.квитанции печатает. Поэтому проблема с тем, что чек ушел в ОФД, а в 1С отмечен, как непробитый в данном случае связана именно с этим.

--
По поводу -
>> с какой компонентой работаешь
- у нас также есть официальный ответ от 1С, что драйвера ФР оставлены для обратной совместимости и будут удалены в одном из последующих релизов. в общем случае их использовать нельзя. Но даже при работе с ФР алгоритм примерно тот же самый, и ошибка с лентой может проявиться и на ФР по той же самой причине - только методы там некоторые будут вызываться другие.
23 dezss
 
30.10.18
11:34
(22) >> только методы там некоторые будут вызываться другие.
Так там принцип другой. Там нет начала фискализации. Там ты отправляешь сразу целую xml, и она либо пробилась, либо нет.

Тут, насколько я понимаю, фишка в том, что если прошла отмена чека, то и в ЕГАИС надо тоже отменять последнюю операцию?
24 ColonelAp4u
 
30.10.18
11:44
(0) Одна из обязанностей кассира, это следить за тем что бы чековая лента не заканчивалась, а процесс фискализации чека не зависит от 1С, ККТ сама возвращает ошибку пробития чека, когда закончилась лента, и если Вам это прям так не нравится то пишите свою прошивку под кассу, и не забывайте, не напечатали чек и не отдали его покупателю = нарушение, как то так!
25 lenochka-semicova
 
30.10.18
12:28
(23) Мда. В (8) написано, что
Процедура ПечатьЧека_ПослеОшибкиПечатиЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
которая, если .ЕстьАлкогольнаяПродукцияЕГАИС
вызывает отмену операции

Коллега, Ваши рассказы про
>> Так там принцип другой. Там нет начала фискализации
>> Там ты отправляешь сразу целую xml
говорят о некоторой неосведомленности в этом вопросе.
26 dezss
 
30.10.18
14:51
(25) не говорят)
Нюансов с ЕГАИС не знаю, но про то, как чек печатается, знаю...
И когда на ККТ отправил xml-ку с чеком прихода для фискализации и с ней все хорошо, вернуть все в зад просто нельзя...можно только сделать чек возврата прихода...
И там действительно нет никакого начала фискализации, вернее это все есть на уровне драйвера ККТ, но нет на уровне работы с ККТ через компоненту.

>>вызывает отмену операции
Тогда покажи, как там делается отмена операции, если говоришь, что она там действительно есть.
27 lenochka-semicova
 
30.10.18
18:37
(26)
1. вызывает отмену операции...в ЕГАИС. в ЕГАИС, Карл!

2. в розничке. в РМК есть Процедура ПробитьЧекККМ
в ней есть
МенеджерОборудованияКлиент.НачатьФискализациюЧекаНаФискальномУстройстве

которая выполняет кучу всего, потом говорит
НачатьВыполнениеКоманды_ПодключениеЗавершение
оттуда вызывается НачатьВыполнениеКомандыПечатиЧека

там есть раздел
ИначеЕсли ПодключенноеУстройство.ТипОборудованияИмя = "ККТ" Тогда
РезультатКоманды = ОбработчикДрайвераМодуль.ВыполнитьКоманду("GetCurrentStatus", ВходныеПараметры, ВыходныеПараметры,
                        ОбъектДрайвера, ПодключенноеУстройство.Параметры, ПодключенноеУстройство.ПараметрыПодключения);

там даже коммент есть после этого вызова
// Увеличиваем инкремент номера последнего чека.

потом идут еще подготовительные процедуры
а вот потом вызывается
ПечатьЧека_ПослеОткрытияЧека
в которой есть
Если ДополнительныеПараметры.ЕстьАлкогольнаяПродукцияЕГАИС Тогда
ИнтеграцияЕГАИСКлиент.ПередатьНемедленно

иначе
система уходит сразу

НачатьВыполнениеКомандыПечатиЧека_ЗавершениеПечати

и только там она говорит
Результат = ОбработчикДрайвераМодуль.ВыполнитьКоманду(ПараметрыВыполнения.Команда


откуда идет в подключаемое оборудование и вызывает ФискализацияЧека
в которой она находит условие
ИначеЕсли ПараметрыПодключения.ТипОборудования = "ККТ" Тогда
ДанныеЧека = МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляФискализацияЧека

и вот только эта xml-ка едина и неделимая

но после этого выполняется еще куча процедур, по печати квитанций ЕГАИС и даже без ЕГАИС дополнительных квитанций по шаблонам которые передаются драйверу отдельными и уже другими xml-ками


И вот для РМК это все одна процедура печати чека с одним итоговым результатом. который при неуспешном выполнении на любом участке возвращается в РМК в процедуру ПечатьЧека_ПослеОшибкиПечатиЧека
которая и вызывает отмену операции в ЕГАИС, Карл. Если есть ЕГАИС
28 lenochka-semicova
 
30.10.18
18:37
И именно об этом говорил автор, что у него чек в ОФД ушел, а в ЕГАИС отменен.
29 Сияющий в темноте
 
30.10.18
18:47
Если лента кончается на фискальном документе,то фр выдает ошибку и ждет команды продолжить печать после заправки бумаги.
если документ нефискальный,то для большинства фр это набор строк и прерывание на какой то строке это просто возврат кода ошибки.

в коде можно поставить цикл ожидания окончания печати,и,если оная не произошла,то выдавать пользователю сообщение о том,что бумага закончилась,а потом продолжать печать.

есть и другие программы,но там иногда вообще на слип пофиг,не напечатался-сделаем вид,что не очень то и хотели.

лучше в сторону печати слипа банка посмотреть,там тоже проблем хватает.
30 dezss
 
31.10.18
11:48
(27) наконец-то появилось это слово (ЕГАИС), в оригинале же (25) было: "вызывает отмену операции", ни про какой ЕГАИС там сказано не было.

И я имел ввиду, что при работе с ККТ через xml нет никакого начала фискализации чека!!! А то, что приведено, это просто название функции в 1С, к самой фискализации она имеет такое же отношение, как к балету. А через компоненту просто получают текущее состояние ККТ, что тоже не имеет отношения к фискализации.
31 lenochka-semicova
 
31.10.18
12:12
(30) Это было и в (8) и слово ЕГАИС не упоминалось лишний раз, потому что оно и так там везде в тексте было.
Прошу прощения, что ввела в заблуждение.


>> к самой фискализации она имеет такое же отношение, как к балету
ровно так же, как и весь 1С-ский механизм передачи xml-ки.

т.е. если взять драйвер Атол 9.х, например, и посмотреть его методы (достаточно запустить даже тест драйверов устройств), то можно увидеть, что там есть и команда открыть чек, и закрыть чек и т.д.
И если в 1С создать объект драйвера Атол-а мимо интеграционной компоненты и использовать его методы - то там ни о какой единой xml-ке вообще речи не пойдет.

Если же мы рассматриваем именно в контексте того, как это все реализовано в 1С - то названия функции в 1С можно считать именно тем, что сама 1С в это название функции вкладывает. В данном примере - начинает фискализацию чека. А что в процессе выполнения идут разные операции с объектом драйвера - это в таком контексте детали и семантика.
32 lenochka-semicova
 
31.10.18
12:18
Просто в (7) Вы дословно указали
>> а ТС врет...либо юзает всякие альтернативно-одаренные ККТ с не менее одаренными прошивками...

Что является не совсем верным.
т.к. именно такую же проблему с типовыми механизмами я описала Вам подробно с примерами кода, когда возникает, и почему появляется.
А Вы, коллега, придираетесь к формулировкам и пытаетесь меня пристыдить, что я употребляю не те термины.
При этом совершенно безосновательно обвиняете ТС-а во вранье.
33 dezss
 
31.10.18
12:58
(31) >>т.е. если взять драйвер Атол 9.х, например, и посмотреть его методы
Об этом я писал в (26)
1С не можешь начинать фискализацию, это делает исключительно сама ККТ. Можно говорить о начале фискализации в случае открытия чека, но при работе с xml об этом можно говорить только в контексте команды непосредственно создания чека.

(32) ТС действительно врал...осознанно или нет, не важно...
Он даже не разобрался в механизме, а уже начал выносить суждения о коде в 1С.
(0) и (4) у него вообще никак не соотносятся...

Проблема с типовым механизмом есть, не спорю, но и решить ее не так просто. Если в ЕГАИС есть возможность просто отменить последнюю операцию или вернуть товар назад, то в ККТ это невозможно. Так что кассиру просто стоит следить за лентой...не зря же их красят в начале и конце
34 lenochka-semicova
 
31.10.18
13:53
(33) Жаль, что дискуссия зашла в никуда.
35 TrudnyiRebenok
 
07.11.18
05:55
Продолжаем разговор?!..

для атолов, поскольку у нас вся сеть на атолах

так вот, именно для атолов есть общий модуль: ПодключаемоеОборудованиеАтолФискальныеРегистраторыКлиент

Функция ВыполнитьКоманду в этом модуле имеет алгоритм
// Печать слип чека
    ИначеЕсли Команда = "PrintText" ИЛИ Команда = "ПечатьТекста"  Тогда
        СтрокаТекста   = ВходныеПараметры[0];
        Результат = ПечатьТекста(ОбъектДрайвера, Параметры, ПараметрыПодключения,
                                 СтрокаТекста, ВыходныеПараметры);

в котором Результат = ПечатьТекста

Функция эта выходит на другую функцию Результат = ЗакрытьЧек(

которая выводит результат.

И всё бы ничего, если бы точно быть уверенным, что данное действие касается только печати чека, а не идёт совместно с фискализацией.

Проблема в том, что в нашей сети все магазины имеют по одной кассе и занять любую из них в рабочее время для отладки - значит лишится прибыли.

В этой теме я хотел всего лишь, чтобы мэтры подсказали,

Функция ЗакрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТаблицаОплат, ВыходныеПараметры) Экспорт

    Результат = Истина;

    СуммаНаличнойОплаты    = 0;
    СуммаБезналичнойОплаты = 0;

    Для ИндексОплаты = 0 По ТаблицаОплат.Количество() - 1 Цикл
        Если ТаблицаОплат[ИндексОплаты][0].Значение = 0 Тогда
            СуммаНаличнойОплаты = СуммаНаличнойОплаты + ТаблицаОплат[ИндексОплаты][1].Значение;
        Иначе
            СуммаБезналичнойОплаты = СуммаБезналичнойОплаты + ТаблицаОплат[ИндексОплаты][1].Значение;
        КонецЕсли;
    КонецЦикла;

    Результат = ОбъектДрайвера.ЗакрытьЧек(ПараметрыПодключения.ИДУстройства,
                                          СуммаНаличнойОплаты, СуммаБезналичнойОплаты);
    Если НЕ Результат Тогда
        ВыходныеПараметры.Очистить();
        ВыходныеПараметры.Добавить(999);
        ВыходныеПараметры.Добавить("");
        ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

        ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
    КонецЕсли;

    Возврат Результат;

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

отменяет фискализацию или нет

Что зашито в эту функцию Результат = ОбъектДрайвера.ЗакрытьЧек( - что она делает???

И пока что ответа у меня нет и возможности посмотреть в отладке - тоже, к сожалению, нет...
36 Мимохожий Однако
 
07.11.18
06:37
Посмотри, что идёт в функции ОтменитьЧек()
37 TrudnyiRebenok
 
07.11.18
07:49
Функция ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры) Экспорт

    Результат = Истина;

    ОбъектДрайвера.ОтменитьЧек(ПараметрыПодключения.ИДУстройства);

    Возврат Результат;

КонецФункции
38 piter3
 
07.11.18
07:59
а открыть доку атола и итс низзя?
39 lenochka-semicova
 
07.11.18
23:00
В общем случае - ПодключаемоеОборудованиеАтолФискальныеРегистраторыКлиент уже года 3 (если не больше) как снят с поддержки в актуальных типовых конфах 1С и оставлен для обратной совместимости. Вся работа со всеми ККТ и большинством ФР-ов (еще до появления ККТ) идет (и шла) в ПодключаемоеОборудованиеУниверсальныйДрайверКлиент

Исключение составляют случаи, указанные в (5)
а именно
>> ибо юзает всякие альтернативно-одаренные ККТ с не менее одаренными прошивками...
40 lenochka-semicova
 
07.11.18
23:02
(39) Если же дрова и прошивки типовые и актуальные, то АтолФискальныеРегистраторыКлиент смотреть нет смысла
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой