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


У одного клиента,занимающегося розничной торговлей, появилась необходимость разделять продажи по типам оплаты в 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 Тогда

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

                Иначе

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

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

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

                КонецЕсли;

 

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

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


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

17 Comments

  1. mirajen

    Очень полезная статья!!! спасибо тебе!

    Reply
  2. CnupT

    Делал систему бонусов для Розницы 1.0, возникла аналогичная проблема: в чеке надо было печатать

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

    статья мне очень сильно помогла. Спасибо!

    Reply
  3. Yuris

    Спасибо большое. Статья существенно сократила время на решение проблемы.

    Reply
  4. oleg212

    Автору однозначно плюс за статью!

    Reply
  5. kolombo_eburg

    Небольшие усовершенствования:

    Если используется конфигурация «Розница 8. Магазин одежды и обуви, редакция 1.» или другая отраслевая розница, то процедура закрытия чека там вызывается из фронта, поэтому необходимо еще внести изменения в ОбщийМодуль.ФронтКассира в строку:

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

    добавить еще параметр по аналогии с описанием в статье.

    Также нужно обратить внимание на строку:

    СуммаБезнал = МИН(СуммаДокумента, ТаблицаПоОплатам.Итог(«Сумма»)-СуммаНаличные);

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

    Reply
  6. ecstazi

    а как реализовать данный механизм в рознице 2.1 с fprint 22k

    Reply
  7. ecstazi

    Есть типы оплат нал,безнал,сертификатом.

    Reply
  8. orehova123

    Мои бухи захотели, чтобы денежные документы возврата проводились в магазинах, да еще плюс отражались в Z-отчете. Да, это противоречит НК. У нас даже почти до драки дошло. Но вот лень им, и все тут!!!

    Поэтому пришлось еще учесть, что необходимо сделать доработки в документах РКО, ПКО (на всякий уж случай), Оплата платежной картой.

    Автору за статью спасибо, навел на правильный курс — не пришлось долго сидеть с отладчиком и пошагово проходить операцию за операцией. Третьим видом оплаты, кстати, используем подарочные сертификаты

    Reply
  9. ToJIuK

    В случае РОЗНИЦЫ 2.0 и Фискального регистратора АТОЛ . Проблема решается установкой обновления до версии 2.1.2.8 (Может и раньше появилось , но на это версии точно работает). В настройке Торг Оборудования , появиться пункт АТОЛ (Универсальный) кот через него работает нормально , Бензнал идет 2ым видом оплаты, Подарочные сертификаты — Четверным . Все Работает нормально

    Reply
  10. ivprovotorov

    (9) ToJIuK, Красавец!!! Настоящий программист , предложил решение без единой строчки кода. 😉

    Reply
  11. ToJIuK

    (10) ivprovotorov, А смысл изобретать колесо ?! Если давно есть и успешно работает велосипед.

    Reply
  12. Amirzhan

    Здравствуйте ! Блин интересная статья, но у немного по другому — никак не могу настроить ФР Aura с драйвером от Atol. Оплаты сертификатом садятся на без нал, в общем и так и так крутил — не смог настроить… версия 1.0.8.1 Розница для Казахстана. Не знаете куда копать ? Заранее спасибо ! Статей много, но везде все не то, что нужно .

    Reply
  13. Amirzhan
    Reply
  14. bio.ejiki

    (9) ToJIuK, но вот есть один минус который в универсальном драйвере не нашел как поменять. Нету настройки Таймаута у принтера.

    Reply
  15. Morisato

    Для Штрих-М все на много проще

    0 вид оплаты — Наличные

    1 вид оплаты — ПЛАТ. КАРТА

    2 вид оплаты — Подарочный серт

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

    ТаблицаОплат = Новый Массив();
    
    // Наличные
    СтрокаОплаты = Новый СписокЗначений();
    СтрокаОплаты.Добавить(0);
    СтрокаОплаты.Добавить(СуммаНаличнойОплаты());
    СтрокаОплаты.Добавить(«Наличная оплата»);
    СтрокаОплаты.Добавить(«»);
    ТаблицаОплат.Добавить(СтрокаОплаты);
    
    // Безналичные
    СтрокаОплаты = Новый СписокЗначений();
    СтрокаОплаты.Добавить(1);
    //СтрокаОплаты.Добавить(СуммаБезналичнойОплаты() + СуммаОплатыПодарочнымиСертификатами());
    СтрокаОплаты.Добавить(СуммаБезналичнойОплаты());
    СтрокаОплаты.Добавить(«Безналичная оплата»);
    СтрокаОплаты.Добавить(«»);
    ТаблицаОплат.Добавить(СтрокаОплаты);
    
    //{// Подарочный сертификат
    СтрокаОплаты = Новый СписокЗначений();
    СтрокаОплаты.Добавить(2);
    СтрокаОплаты.Добавить(СуммаОплатыПодарочнымиСертификатами());
    СтрокаОплаты.Добавить(«Подарочный сертификат»);
    СтрокаОплаты.Добавить(«»);
    ТаблицаОплат.Добавить(СтрокаОплаты);
    //}
    

    Показать

    Reply
  16. bajen

    (15) Morisato, Куда эту таблицу оплат подставлять не совсем понятно?

    Reply
  17. maksa2005

    Марат Ибрагимов СПАСИБО ОГРОМНОЕ.

    Reply

Leave a Comment

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