Имя: Пароль:
1C
1С v8
Частичная оплата через драйвер АТОЛ
0 igel1969
 
28.06.20
17:44
Здравствуйте!
Печатаю чеки напрямую через драйвер.
С полной оплатой все понятно.
Допустим мне надо оформить частичную оплату.
В каком месте мне надо посылать на драйвер сумму частичной оплаты?

Вот пример кода полной оплаты.
Обратите внимание, там окончательная сумма нигде не указывается, а указываются суммы для каждой из строк товара.
А если клиент внес только часть, где мне указать эту сумму? Размазать по строкам? Мне кажется это неправильно.

        ECR.DeviceEnabled = 1;
    Если ECR.ResultCode <> 0 тогда
        Предупреждение("ККМ не подключена!");
        Возврат;
    КонецЕсли;
    ECR.Password = "1";
    
    // входим в режим регистрации
    ECR.Mode = 1;
    Если ECR.SetMode() <> 0 тогда
        Предупреждение("Касса не смогла войти в режим регистрации чеков!");
        Возврат;
    КонецЕсли;
    
    ECR.AttrNumber = 1021;
    ECR.AttrValue = ФИОКассира;
    ECR.WriteAttribute();
    
    

    ECR.CheckType = 1; // приход денег
    ECR.CheckMode = 1; // печатать на ленте
    ECR.OpenCheck();
    
    Если Найти(СокрЛП(ДокументРеализация.Контрагент), "Розничный") <= 0 тогда
        ECR.AttrNumber = 1227;
        ECR.AttrValue = СокрЛП(ДокументРеализация.Контрагент);
        ECR.WriteAttribute();
        
        ECR.AttrNumber = 1228;
        ECR.AttrValue = СокрЛП(ДокументРеализация.Контрагент.ИНН); // тут еще надо слева добавить пробелы до 12 знаков
        ECR.WriteAttribute();
    КонецЕсли;
    
    Если ТипЗнч(ДокументРеализация) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
        Для каждого Стр из КассовыйЧек Цикл  
            ECR.BeginItem();
            ECR.StreamFormat = 5;
            Если (Стр.Марка <> Неопределено) и (СокрЛП(Стр.Марка) <> "") Тогда
                ECR.AttrNumber = 1162;
                ECR.AttrValue = Стр.Марка;
                ECR.WriteAttribute();
                Блок = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("бл", Истина, , Стр.Номенклатура);
                Упак = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("уп", Истина, , Стр.Номенклатура);
                Если Блок <> Справочники.ЕдиницыИзмерения.ПустаяСсылка() Тогда
                    КоэфБл = Блок.Коэффициент;
                Иначе
                    КоэфБл = 10;
                КонецЕсли;
                
                Если Упак <> Справочники.ЕдиницыИзмерения.ПустаяСсылка() Тогда
                    КоэфУп = Блок.Коэффициент;
                Иначе
                    КоэфУп = 500;
                КонецЕсли;
                
                Если Стр.Количество = КоэфБл Тогда
                    ECR.Name = Стр.Номенклатура.Наименование + " ("+ СокрЛП(Стр.ХарактеристикаНоменклатуры) + ") бл [М]";
                    ECR.Price = Стр.Цена * Стр.Количество;
                    ECR.Quantity = 1;
                    ECR.Summ = Стр.Цена * Стр.Количество;
                ИначеЕсли Стр.Количество = КоэфУп Тогда
                    ECR.Name = Стр.Номенклатура.Наименование + " ("+ СокрЛП(Стр.ХарактеристикаНоменклатуры) + ") уп [М]";
                    ECR.Price = Стр.Цена * Стр.Количество;
                    ECR.Quantity = 1;
                    ECR.Summ = Стр.Цена * Стр.Количество;
                Иначе
                    ECR.Name = Стр.Номенклатура.Наименование + " ("+ СокрЛП(Стр.ХарактеристикаНоменклатуры) + ") шт [М]";
                    ECR.Price = Стр.Цена;
                    ECR.Quantity = Стр.Количество;
                    ECR.Summ = Стр.Цена * Стр.Количество;
                КонецЕсли;
                
            Иначе
                Если Стр.Номенклатура.ВестиУчетПоХарактеристикам тогда
                    ECR.Name = Стр.Номенклатура.Наименование + " ("+ СокрЛП(Стр.ХарактеристикаНоменклатуры) + ") шт";
                Иначе
                    ECR.Name = Стр.Номенклатура.Наименование + " шт";
                КонецЕсли;
                ECR.Price = Стр.Цена;
                ECR.Quantity = Стр.Количество;
                ECR.Summ = Стр.Цена * Стр.Количество;
            КонецЕсли;
            
            ECR.ItemType = 1;   // товар за исключением подакцизного
            Если Стр.Номенклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 тогда
                ECR.TaxTypeNumber = 0;
                ECR.Tax = 0;
            ИначеЕсли Стр.Номенклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС10 тогда
                ECR.TaxTypeNumber = 2;
                ECR.Tax = 2;
            ИначеЕсли Стр.Номенклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 тогда
                ECR.TaxTypeNumber = 3;
                ECR.Tax = 3;
            ИначеЕсли Стр.Номенклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС тогда
                ECR.TaxTypeNumber = 4;
                ECR.Tax = 4;
            Иначе
                ECR.TaxTypeNumber = 4;
                ECR.Tax = 0;
            КонецЕсли;
            
            ECR.PaymentMode = 4;  //4 - Полная оплата   // 5 - частичная оплата в момент получения товара
            ECR.EndItem();
        КонецЦикла;
    КонецЕсли;
    
    ECR.TypeClose = 0;
    ECR.CloseCheck();
1 Mamul
 
28.06.20
19:39
А как у 1с в конфигах реализована сложная оплата, не смотрели? У Атол integration.atol.ru с примерами запросов смотрели ?
2 Креатив
 
28.06.20
23:32
(0)Частичной оплаты в рознице нет!(с)
3 igel1969
 
29.06.20
06:24
(1) В 1С не смотрел, но там по-любому через драйвер 1С реализовано, а я через API посылаю.
У АТОЛ на сайте есть описание только 10 драйвера, а у меня 8
4 igel1969
 
29.06.20
06:24
(2) где тут про розницу?
5 Garykom
 
гуру
29.06.20
07:11
(4) забей в рознице тоже есть "частичная оплата"

(0) ECR.PaymentMode = 4;  //4 - Полная оплата   // 5 - частичная оплата в момент получения товара
6 Garykom
 
гуру
29.06.20
07:12
но имхо переходи с 8-го драйвера на 10-й уже и делай по мануалу из (1)
7 Garykom
 
гуру
29.06.20
07:15
читать вот такую штуку https://www.atol.ru/upload/iblock/792/Drivers8_FprnM_PM.pdf только более свежую в комплекте с дровами
8 igel1969
 
29.06.20
14:44
(5) (0) ECR.PaymentMode = 4;  //4 - Полная оплата   // 5 - частичная оплата в момент получения товара
Это я сам нашел и написал.
Куда сумму то посылать?
Я посылаю суммы только по строкам, а в конце каким-то чудесным образом касса сама выводит итоговую сумму.
А если сумма, которую заплатил контрагент меньше итога по строкам? Это и есть частичная оплата.
Я не знаю как называется поле суммы внесенных денег.
9 Mamul
 
29.06.20
16:01
(6) да, однозначно давно пора на 10-ку переходить.
10 Garykom
 
гуру
29.06.20
16:33
(8) открой уже мануал от драйвера, он в комплекте при установке
11 igel1969
 
29.06.20
16:51
Я разобрался.
У кассы есть еще такая команда Payment().
Если ее не использовать, то чек закрывается полностью и без сдачи.
Я пытался ее использовать с указанием суммы оплаты, но тогда не закрывался чек, просто зависал при команде CloseCheck().
В итоге экспериментальным путем до меня дошло - Payment надо вызывать столько раз, сколько нужно, чтобы набралась полная сумма чека.
Допустим для примера, что общая сумма товара в чеке 1333руб, а клиент оплатил только 1000руб.
тогда код закрытия чека должен выглядеть так (грубо, без всяких тонкостей и проверок):

        ECR.TypeClose = 0;
    ECR.PointPosition = 2;
    ECR.Summ = 1000;
    ECR.Payment();
    
    ECR.TypeClose = 3;
    ECR.PointPosition = 2;
    ECR.Summ = 333;
    ECR.Payment();
    
    ECR.CloseCheck();

А я изначально посылал только 1000, а остаток не допосылал.
12 igel1969
 
29.06.20
16:52
(10) да, та ссылка на мануал из (7) мне больше всего помогла разобраться, спасибо