gifts2017

Расширение типового функционала работы с ККМ в 1с Розница 1.0 (добавление произвольного количества типов оплаты)

Опубликовал Марат Ибрагимов (ranger) в раздел Оборудование - ККМ

У одного клиента,занимающегося розничной торговлей, появилась необходимость разделять продажи по типам оплаты в Z-отчете с бОльшим разнообразием,чем позволяет типовой функционал работы с ТО.
Т.е. стандартную разбивку на наличную и безналичную оплату расширить до нал,оплата по платежным картам(безнал),банковским кредитам.В то же время исключить  кредит из секции «оплата по безналу».
Почему возникла такая потребность?Все просто,в бэк-офисе так проще сверять Отчет о розничных продажах с Z-отчетом.

Итак.Начну с того,что в качестве ККМ используется принтер чеков ЕНВД под управлением стандратного атоловского драйвера версии 6.17.1

В настройках этого драйвера можно указать произвольное количество типов оплаты(врамках разумного) см.рис. "Настройка ККМ"

Однако  выяснилось,что раньше для взаимодействия с ккм использовался стандартный интерфейс("AddIn.FPrnM45"),потом переделали на стандарт 1с с использованием "AddIn.ATOL_KKM_1C".Так вот,новый стандарт 1с сильно усечен и через новый объект вызовы Fprnm1C.dll с указанием типа оплаты использовать нельзя.В текущих обработках обслуживания ТО для закрытия чека используется функция вида:

Функция ЗакрытьЧек(Объект, СуммаНал, СуммаБезнал) Экспорт

    Результат = мНетОшибки;

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

        ОтменитьЧек(Объект);
    КонецЕсли;

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

КонецФункции // ЗакрытьЧек()

В ней передается на ККМ всего лишь 2 суммы по налу и безналу.

Решение проблемы:

- Документ.ЧекККМ.Модуль объекта

Изменена Функция ПечатьЧекаККМ(Идентификатор, НомерЧека, НомерСмены,

                      ОписаниеЧека, СуммаНал, СуммаБезнал, ПризнакВозврата)

//Марат

//Результат = ПолучитьСерверТО().ЗакрытьЧек(Идентификатор, СуммаНал, СуммаБезнал);

Результат = ПолучитьСерверТО().ЗакрытьЧек(Идентификатор, СуммаНал, СуммаБезнал,ПолучитьСуммуОплатыБанковскимКредитом());

 

- Обработка.ТОСервер.Модуль объекта

Изменена Функция ЗакрытьЧек(Идентификатор, СуммаНал, СуммаБезнал,СуммаКредит=0) Экспорт  //Марат добавлен параметр СуммаКредит=0

//марат

//Результат = Обработка.ЗакрытьЧек(Объект, СуммаНал, СуммаБезнал,СуммаБезнал,СуммаКредит);

Результат = Обработка.ЗакрытьЧек(Объект, СуммаНал, Макс(0,СуммаБезнал-СуммаКредит),СуммаКредит);

-Обновлена обработка обслуживания ТО ATOLFiscalPrinters_v2.epf

Заменена Функция ЗакрытьЧек(Объект, СуммаНал, СуммаБезнал,СуммаКредит=0) Экспорт

//марат+

                Попытка

                               ПрогИД = "AddIn.FPrnM45";

                               //ПодключитьВнешнююКомпоненту(ПрогИД);

                               Драйвер = Новый (ПрогИД);

                Исключение

                               Попытка

                                               ПодключитьВнешнююКомпоненту(ПрогИД);

                                               Драйвер = Новый (ПрогИД);

                               Исключение

                                               Результат = мОшибкаЗагрузкиДрайвера;

                                               ОписаниеОшибки = "Невозможно подключить внешнюю компоненту AddIn.FPrnM45.

                                               | Попытайтесь зарегистрировать драйвер ККМ FprnM1C.dll в системе

                                               | командой regsvr32.";

                                               Сообщить(ОписаниеОшибки);

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

                               КонецПопытки;

                КонецПопытки;

 

               

                Результат  = мНетОшибки;

                Ответ      = 0;

 

                Если СуммаНал > 0 Тогда

                               Драйвер.Summ       = СуммаНал;

                               Драйвер.TypeClose = 0;

                               Драйвер.Payment();

                               Ответ = Драйвер.Результат;

                КонецЕсли;

 

                Если Ответ = 0 Тогда

                               Если СуммаБезнал > 0 Тогда

                                               Драйвер.Summ       = СуммаБезнал;

                                               Драйвер.TypeClose = 1;

                                               Драйвер.Payment();

                                               Ответ = Драйвер.Результат;

                               КонецЕсли;

                КонецЕсли;

               

                Если Ответ = 0 Тогда

                               Если СуммаКредит > 0 Тогда

                                               Драйвер.Summ       = СуммаКредит;

                                               Драйвер.TypeClose = 2;

                                               Драйвер.Payment();

                                               Ответ = Драйвер.Результат;

                               КонецЕсли;

                КонецЕсли;

 

                Если Ответ = 0 Тогда

                               Драйвер.CloseCheck(); // Закрыть чек

                КонецЕсли;

 

                Если Ответ = 0 Тогда

                               //Объект.Удалить("ЭтоВозврат");

                Иначе

                               Результат = мОшибкаНеизвестно;

                               Объект.ОписаниеОшибки = Драйвер.ОписаниеРезультата;

                               ОтменитьЧек(Объект);

                КонецЕсли;

 

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

КонецФункции // ЗакрытьЧек()


Буду очень рад если кому то данная статья поможет.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Mirajen - (mirajen) 08.03.13 19:50
Очень полезная статья!!! спасибо тебе!
2. Алексей Масалыгин (CnupT) 17.07.13 09:21
Делал систему бонусов для Розницы 1.0, возникла аналогичная проблема: в чеке надо было печатать
не только наличные и безнал, но и оплату бонусами. Стандартная обработка этого не умела, и Ваша
статья мне очень сильно помогла. Спасибо!
3. Юрий Коваленко (Yuris) 13.12.13 17:12
Спасибо большое. Статья существенно сократила время на решение проблемы.
4. Татьяна Крестьянкина (oleg212) 03.01.14 00:26
Автору однозначно плюс за статью!
5. Николай Светличный (kolombo_eburg) 13.01.14 10:17
Небольшие усовершенствования:
Если используется конфигурация "Розница 8. Магазин одежды и обуви, редакция 1." или другая отраслевая розница, то процедура закрытия чека там вызывается из фронта, поэтому необходимо еще внести изменения в ОбщийМодуль.ФронтКассира в строку:
Результат = ПолучитьСерверТО().ЗакрытьЧек(Идентификатор, СуммаНаличные, СуммаБезнал);
добавить еще параметр по аналогии с описанием в статье.

Также нужно обратить внимание на строку:
СуммаБезнал = МИН(СуммаДокумента, ТаблицаПоОплатам.Итог("Сумма")-СуммаНаличные);


В моем случае таким образом разделяли по секциям Безнал от оплаты подарочными сертификатами, поскольку в стандартном механизме такая оплата проходит по секции безналичной оплаты.
6. ecstazi ecstazi (ecstazi) 26.02.14 15:59
а как реализовать данный механизм в рознице 2.1 с fprint 22k
7. ecstazi ecstazi (ecstazi) 26.02.14 16:00
Есть типы оплат нал,безнал,сертификатом.
8. Галина Орехова (orehova123) 21.03.14 20:43
Мои бухи захотели, чтобы денежные документы возврата проводились в магазинах, да еще плюс отражались в Z-отчете. Да, это противоречит НК. У нас даже почти до драки дошло. Но вот лень им, и все тут!!!
Поэтому пришлось еще учесть, что необходимо сделать доработки в документах РКО, ПКО (на всякий уж случай), Оплата платежной картой.
Автору за статью спасибо, навел на правильный курс - не пришлось долго сидеть с отладчиком и пошагово проходить операцию за операцией. Третьим видом оплаты, кстати, используем подарочные сертификаты
9. Григорьев Анатолий (ToJIuK) 08.12.14 13:55
В случае РОЗНИЦЫ 2.0 и Фискального регистратора АТОЛ . Проблема решается установкой обновления до версии 2.1.2.8 (Может и раньше появилось , но на это версии точно работает). В настройке Торг Оборудования , появиться пункт АТОЛ (Универсальный) кот через него работает нормально , Бензнал идет 2ым видом оплаты, Подарочные сертификаты - Четверным . Все Работает нормально
Yura77; ivprovotorov; +2 Ответить 2
10. Igor Provotorov (ivprovotorov) 21.12.14 23:34
(9) ToJIuK, Красавец!!! Настоящий программист , предложил решение без единой строчки кода. ;-)

11. Григорьев Анатолий (ToJIuK) 09.01.15 17:46
(10) ivprovotorov, А смысл изобретать колесо ?! Если давно есть и успешно работает велосипед.
12. Arshat Amirzhan (Amirzhan) 10.03.15 16:28
Здравствуйте ! Блин интересная статья, но у немного по другому - никак не могу настроить ФР Aura с драйвером от Atol. Оплаты сертификатом садятся на без нал, в общем и так и так крутил - не смог настроить... версия 1.0.8.1 Розница для Казахстана. Не знаете куда копать ? Заранее спасибо ! Статей много, но везде все не то, что нужно .
13. Arshat Amirzhan (Amirzhan) 13.03.15 20:41
Получилось. Все работает отлично. Но нужен дельный совет. В Рознице есть документ Оплата от покупателя платежной картой в момент проведения документа проблем нет, но в момент нажатия ЧЕК выходит ошибка в 1С что много фактических параметров, а на ФР чек пробивается и сразу аннулируется. В момент когда выходит ошибка, я прохожу в Конфигуратор и попадаю в документ Оплата от покупателя платежной картой модуль документа - дальше ошибка именно где то в этом коде Процедура ОсновныеДействияФормыЧек(Кнопка)

Перем ФР;

Если НомерЧекаККМ <> 0 Тогда
Предупреждение("Чек уже пробит на фискальном регистраторе!");
Возврат;
КонецЕсли;

Если Не Проведен Тогда
Предупреждение("Перед пробитием чека на фискальном регистраторе документ необходимо провести!");
Возврат;
КонецЕсли;

Если Не РаботаСДиалогами.ПроверитьМодифицированностьВФорме(ЭтотОбъект, ЭтаФорма) Тогда
Возврат;
КонецЕсли;

Если Не РаботаСТорговымОборудованием.ПолучитьПроверитьПараметрыДляПробитияЧека(ФР) Тогда
Возврат;
КонецЕсли;

Позиция = Неопределено;
НомерСмены = Неопределено;
ТаблицаПлатежей = Новый ТаблицаЗначений();
ТаблицаПлатежей.Колонки.Добавить("Заголовок");
ТаблицаПлатежей.Колонки.Добавить("Сумма");
ТаблицаПлатежей.Колонки.Добавить("НДС");

Для Каждого Позиция Из РасшифровкаПлатежа Цикл
СтрокаТаблицы = ТаблицаПлатежей.Добавить();
СтрокаТаблицы.Заголовок = "Принято от " + СокрЛП(Контрагент)
+ "
|Основание: " + СокрЛП(ЭтотОбъект);
СтрокаТаблицы.Сумма = Позиция.СуммаПлатежа;
СтрокаТаблицы.НДС = УчетНДСИАкциза.ПолучитьСтавкуНДС(Позиция.СтавкаНДС);
КонецЦикла;

Если ВидОперации = Перечисления.ВидыОперацийОплатаОтПокупателяПлатежнойКартой.ОплатаПокупателя Тогда
Результат = ПолучитьСерверТО().ПечатьЧекаПКО(ФР,
НомерЧекаККМ,
НомерСмены,
ТаблицаПлатежей,
0,
СуммаДокумента);
Иначе
Результат = ПолучитьСерверТО().ПечатьЧекаРКО(ФР,
НомерЧекаККМ,
НомерСмены,
ТаблицаПлатежей,
0,
СуммаДокумента);

КонецЕсли;

Если Не ЗначениеЗаполнено(Результат) Тогда
Оплачено = Истина;
Иначе
ТекстОшибки = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(Результат);
Предупреждение(ТекстОшибки);
КонецЕсли;

КонецПроцедуры

Буду рад если подскажите в чем проблема...
14. Игорь Баркалов (bio.ejiki) 27.11.15 11:18
(9) ToJIuK, но вот есть один минус который в универсальном драйвере не нашел как поменять. Нету настройки Таймаута у принтера.
15. Morisato (Morisato) 14.01.16 13:03
Для Штрих-М все на много проще
0 вид оплаты - Наличные
1 вид оплаты - ПЛАТ. КАРТА
2 вид оплаты - Подарочный серт

Плюс надо немного фискалку донастроить.

ТаблицаОплат = Новый Массив();
				
				// Наличные
				СтрокаОплаты = Новый СписокЗначений();
				СтрокаОплаты.Добавить(0);
				СтрокаОплаты.Добавить(СуммаНаличнойОплаты());
				СтрокаОплаты.Добавить("Наличная оплата");
				СтрокаОплаты.Добавить("");
				ТаблицаОплат.Добавить(СтрокаОплаты);
				
				// Безналичные
				СтрокаОплаты = Новый СписокЗначений();
				СтрокаОплаты.Добавить(1);
				//СтрокаОплаты.Добавить(СуммаБезналичнойОплаты() + СуммаОплатыПодарочнымиСертификатами());
				СтрокаОплаты.Добавить(СуммаБезналичнойОплаты()); 
				СтрокаОплаты.Добавить("Безналичная оплата");
				СтрокаОплаты.Добавить("");
				ТаблицаОплат.Добавить(СтрокаОплаты);
				
				//{// Подарочный сертификат
				СтрокаОплаты = Новый СписокЗначений();
				СтрокаОплаты.Добавить(2);
				СтрокаОплаты.Добавить(СуммаОплатыПодарочнымиСертификатами()); 
				СтрокаОплаты.Добавить("Подарочный сертификат");
				СтрокаОплаты.Добавить("");
				ТаблицаОплат.Добавить(СтрокаОплаты);
                //}
...Показать Скрыть
16. Евгений Черкашин (bajen) 20.10.16 12:56
(15) Morisato, Куда эту таблицу оплат подставлять не совсем понятно?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа