Проблемы с кассой у клиента 77 при переходе на ДТО 10

У клиента заменили АТОЛ ДТО 8 на ДТО 10, потому что ДТО 8 уже не поддерживается. Пришлось перенастраивать оборудование.

Первая проблема — настройка обработки обслуживания

Скачал обработку обслуживания кассы frATOL54_comm.ert с Инфостарта: https://infostart.ru/1c/tools/1350696

Установил ее в 1С:

Также рекомендую статью: https://infostart.ru/1c/articles/991465

Пришлось немного адаптировать обработку, заменил код получения ставки НДС, благо клиент работал без НДС:

Отлаживать было сложно, после каждой ошибки нужно было закрывать 1С, т.к. 1С считала что чек открыт и выдавала ошибку о том, что не может начать новый чек.

При пробитии реализации выдавало предупреждение, не мешающее работе:

Не удалось записать в документ реквизиты чека ККМ: Объект заблокирован: Реализация  ТН00005538 (15.11.24)

Проблема озвучена на Мисте, но решили пока оставить так.

Вторая проблема — фамилия кассира.

Дополнительно возникла проблем с тем, что вместо ФИО кассира печатался «Системный администратор».

Все же пришлось поискать, откуда вызывается обработка обслуживания, искал по всем текстам по «Кассир»:

Можно поискать и по «печатать_чек», вызывается из глобальной процедуры глФРПечататьЧек:

Однако оказалось, что по кнопке печати чека вызывается дополнительная внешняя печатная форма FR54_ПечатьЧека.ERT, а у нее уже своя процедура глФРПечататьЧек:

Функция глФРПечататьЧек(СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ПУП, Кассир) Экспорт

В итоге сделал следующую доработку:

Код на 77:

//Осипов - доработка		 +++
ВыбКассир = "";
ВыбКасса = глЗначениеПоУмолчанию("ОсновнаяКасса");
Кассир = "";

Если ПустоеЗначение(ВыбКасса) = 0 Тогда
	ВыбКассир = ВыбКасса.КассирККМ.Получить(ТекущаяДата());
	//Если ПустоеЗначение(ВыбКассир) = 1 Тогда
	//ВыбКассир = Фирма.ЮрЛицо.Кассир.Получить(ДатаДок);
	//КонецЕсли;
	Кассир = глФамилияИмяОтчество(ВыбКассир);	
	Параметры.Установить("Кассир"           , Кассир);
КонецЕсли; 

//---

Можно было выводить и автора из документа, но это было бы немного объёмнее, клиента устроило так.

Третья проблема. Не печатается отчет без гашения

Для печати Х и Z-отчетов используется обрабокта fr54_настройки:

В обработке обслуживания просто не предусмотрена печать Х-отчета, это процесс «отчет_без_гашения»:

Добавляем в обработку обслуживания поддержку отчета без гашения, все работает:

ИначеЕсли Процесс = "отчет_без_гашения" Тогда
	Объект  = Парам.Получить("Объект");
	Кассир  = Парам.Получить("Кассир");
	ПарольАдминистратора = Парам.Получить("ПарольАдминистратора");  
	
	Объект.setParam(1021, СокрЛП(Кассир));
	//fptr.setParam(1203, '123456789047');
	Объект.operatorLogin();

	Объект.setParam(Объект.LIBFPTR_PARAM_REPORT_TYPE, Объект.LIBFPTR_RT_X);
	
	Объект.report();

	Объект.checkDocumentClosed();

Четвертая проблема. Безнал печатается как нал

Смотрим в fr54_ПечатьЧека.ert как реализована печать чека по безналу, используя поля СуммаЧека и Получено:

ЧекПробитККМ  = глФРПечататьЧек(Список, СуммаЧека, ?((Получено=0)и(ПризнакОплатыКартой=0),СуммаЧека,Получено), Скидка, ПризнВозврата, НомерСекции, НомерЧека); //тщи ?(Получено=0,Итог("Сумма"),Получено) -> ?((Получено=0)и(ПризнакОплатыКартой=0),Итог("Сумма"),Получено)   //если Получено < СуммаЧека, то значит оплата идет по банковской карте

Чтобы разобраться, какая сумма оплачена картой, можно подсмотреть в процедуре:

Или тут:

В обработке frATOL54_comm.ert разделение нал/безнал тоже есть:

Но в ней же не реализована поддержка оплаты безналом и возврат:

//Осипов
Если СуммаЧека>Получено Тогда   //??? предусмотреть чтение реквизитов ОплаченоНаличными, ОплаченоЭлектронными и т.д. (также в модулях доков)
	Картой = СуммаЧека-Получено;
	Налом = Получено;
	ОплатаКартой = 1;
Иначе
	Картой = 0;
	Налом = Получено;
	ОплатаКартой = 0;
КонецЕсли;


//Закрыть чек
//Если ПризнВозврата=0 Тогда  //Осипов, оплата и налом и безналом

Сообщить("Сумма чека: " + СуммаЧека + " Получено: " + Получено + " Налом: " + Налом + " Картой: " + Картой);
			
Если Налом <> 0 Тогда
	//Оплата налом
	Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_TYPE, Объект.LIBFPTR_PT_CASH);
	//Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, СуммаЧека);
	Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, Налом);
	Объект.payment();
КонецЕсли;

Если Картой <> 0 Тогда
	//Оплата картой
	Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_TYPE, Объект.LIBFPTR_PT_ELECTRONICALLY);
	//Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, СуммаЧека);
	Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, Картой);
	Объект.payment();
КонецЕсли;

И доделал еще для возврата:

//Осипов - всегда безнал в реализации
Если Докум.Вид() = "Реализация" Тогда
	Получено = 0; //Налом
	ПризнакОплатыКартой = 1; //Картой
КонецЕсли;           

//Осипов - всегда безнал в возврате
Если Докум.Вид() = "ВозвратОтПокупателя" Тогда
	Получено = 0; //Налом
	ПризнакОплатыКартой = 1; //Картой
КонецЕсли;           

Сообщить("Вид: " + Докум.Вид() + " Сумма чека: " + СуммаЧека + " Получено: " + Получено  + " ПризнакОплатыКартой: " + ПризнакОплатыКартой);

Пример информационных сообщений:

В итоге после череды ошибочных чеков у клиента все заработало!

Среда: ТиС 7.70.997 Объем: 1.5 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *