Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Помогите разобраться ККМ + кассовый чек

v7: Помогите разобраться ККМ + кассовый чек
Я
   sanekdark
 
14.08.18 - 07:40
Переделал Кассовый чек под ККМ. при проведние документа кассового чека , например продали  товар  за наличку . он попадает и в кассу  и попадает на клиента в задолжность . не могу понять где что не так сделал.
 вот код кода касового чека 
Перем Валюта_Прежн;
Перем Курс_Прежн;
Перем Режим; 
Перем ТипЦен Экспорт; 
Перем СпрККМ,СпрКомпьютеры; 
Перем СтараяСумма, СтараяПолучено;
//******************************************************************************

///////////////////////////////////////////////////////////////////////////////

// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
// 


//*****************************************************************************

// ПриВыбореВариантаОплаты()
//

// Параметры: 
//  Нет

//
// Возвращаемое значение: 

//  Название операции
//

// Описание:
//     Формирует название операции и заголовок формы диалога

//
Функция ПриИзмененииВариантаОплаты() 
    
    Если ВариантОплаты = Перечисление.ТипыОплатЧекаККМ.ПлатежнаяКарта Тогда
        Получено = Итог("Сумма");
    КонецЕсли;
    
КонецФункции// ПриИзмененииВариантаОплаты        



//*****************************************************************************

// ЗаголовокФормы()
//

// Параметры: 
//  Нет

//
// Возвращаемое значение: 

//  Название операции
//

// Описание:
//     Формирует название операции и заголовок формы диалога

//
Функция ЗаголовокФормы() 
    
    Перем Заголовок, Название;
    
    Заголовок     =  Строка(ВидОперации);
    Название     = Заголовок+" №";                          
    
    Если Выбран() = 1 Тогда  
        Если Проведен() = 1 Тогда
            Заголовок = Заголовок + ". Проведен";
        Иначе
            Заголовок = Заголовок + ". Не проведен";
        КонецЕсли;
    Иначе
        Заголовок = Заголовок + ". Новый";
    КонецЕсли;
    Форма.Заголовок(Заголовок);               
    Возврат Название;
    
КонецФункции// ЗаголовокФормы        



//******************************************************************************

// РасчетСдачи()
//

// Параметры:
//  Нет

//
// Возвращаемое значение:

//  Сумма сдачи
//

// Вызывается из формул элементов диалога:
//  Надпись "Сдача".

//
// Описание:

//  Вычисляет сумму сдачи.
//

Функция РасчетСдачи()
    ВремСумма = Итог("Сумма");
    ВремСдача = Макс(Получено - ВремСумма, 0);
    
    Если (СтараяСумма <> ВремСумма) ИЛИ (СтараяПолучено <> Получено) Тогда
        СтараяСумма    = ВремСумма;
        СтараяПолучено = Получено;
    КонецЕсли;
    
    Возврат (глФРМ(ВремСдача));    
КонецФункции// РасчетСдачи()



//******************************************************************************

// ПечатьЧека()
//

// Параметры:
//    Нет

//
// Возвращаемое значение:

//  Нет
//

// Описание:
//    Печатает чек на фискальном регистраторе

//
Процедура ПробитьЧекККМ()     
    
    Перем НомерЧека;
    
    Если Получено < Итог("Сумма") Тогда
        Предупреждение("Не хватает средств для оплаты!");
        Возврат;
    КонецЕсли;
    
    Если НомерЧекаККМ <> 0 Тогда
        Предупреждение("Чек уже пробит на фискальном регистраторе!",60);
        Возврат;
    ИначеЕсли глФРВкл=0 Тогда
        Предупреждение("Фискальный регистратор не подключен!",60);
        Возврат;
    ИначеЕсли ПометкаУдаления()=1 Тогда
        Предупреждение("Документ помечен на удаление, поэтому" + РазделительСтрок +
        "нельзя пробить чек на фискальном регистраторе!",60);
        Возврат;
    ИначеЕсли Проведен()=0 Тогда
        Если Вопрос("Провести документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
            Возврат;
        КонецЕсли;
        Попытка
            Записать();
            Провести();
        Исключение
            Возврат;
        КонецПопытки;
    ИначеЕсли Модифицированность()=1 Тогда
        Если Вопрос("Сохранить документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
            Возврат;
        КонецЕсли;
        Попытка
            Записать();
        Исключение
            Возврат;
        КонецПопытки;
    КонецЕсли;
    
    ЗначениеНДС = 6;//БЕЗ НДС

    ПУП = 8;//ЕНВД

    
    СписокТоваров = СоздатьОбъект("ТаблицаЗначений");
    СписокТоваров.НоваяКолонка("ТовНаим"   , "Строка");
    СписокТоваров.НоваяКолонка("Цена"      , "Число");
    СписокТоваров.НоваяКолонка("Количество", "Число");
    СписокТоваров.НоваяКолонка("Сумма"       , "Число");
    СписокТоваров.НоваяКолонка("СтавкаНДС" , "Число");
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        СписокТоваров.НоваяСтрока();
        СписокТоваров.ТовНаим    = Сред(СокрЛП(Товар.Код)+"/"+ СокрЛП(Товар.Наименование),1,65);
        СписокТоваров.Цена       = Цена;
        СписокТоваров.Количество = Количество; 
        СписокТоваров.Сумма         = Сумма;
    КонецЦикла;
    
    ПризнВозврата = ?(ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек, 1, 2);
    
    ПроцентСкидки     = ?(Число(ДисконтнаяКарта.Тип.Процент)=0,0,Число(ДисконтнаяКарта.Тип.Процент));
    
    Кассир = "";
    СпрККМ=СоздатьОбъект("Справочник.ККМ");
    Если СпрККМ.НайтиПоРеквизиту("Компьютер", Компьютер.ТекущийЭлемент(),1) = 1 Тогда
        ПУП = глОпределитьПУП(СпрККМ.ПУП);
        ЗначениеНДС = глОпределитьНДС(СпрККМ.СтавкаНДС);
        Если ПустоеЗначение(СпрККМ.КассирККМ.Получить(ДатаДок)) = 0 Тогда
            ВыбКассир = СпрККМ.КассирККМ.Получить(ДатаДок);
            Кассир = глФамилияИмяОтчество(ВыбКассир.Наименование);
        КонецЕсли; 
    Иначе
        Предупреждение("Не определены параметры учетной политики, чек не пробит!",60);
        Возврат;
    КонецЕсли;
    
    ТелПокупателя = "";
    ЭлПочтаПокупателя = "";
    
    Если СтрДлина(СокрЛП(КонтактПокупателя))>0 Тогда
        
        Если Найти(КонтактПокупателя,"@") = 0 Тогда//телефон

            ТелПокупателя = СокрЛП(КонтактПокупателя);    
        Иначе//почта

            ЭлПочтаПокупателя = СокрЛП(КонтактПокупателя);
        КонецЕсли;
        
    КонецЕсли;
    
    //ТипОплаты = ?(ВариантОплаты = Перечисление.ТипыОплатЧекаККМ.Наличные,0,1); //наличка - 0, карта - 1

    
    ТипОплаты = 0;//наличка - 0, карта - 1 

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


//******************************************************************************    

//******************************************************************************
Процедура Подбор()
    Режим="Каталог";
    //ОткрытьПодбор("Товары","ДляПодбора2");

    ОткрытьПодбор("Товары","ДляПодбора2"); 
    УстановитьЗначениеВПодборе("Склад",Склад);
КонецПроцедуры
//******************************************************************************          

Процедура РассчитатьСкидку()
    Пер=СоздатьОбъект("Периодический");
    Пер.ИспользоватьОбъект("Розн_цена",Товар);
    Цена=Пер.ЗначениеНаДату(ДатаДок);
    
    СЦ=Окр(Цена*ДисконтнаяКарта.Тип.Процент/100,2);
    
    Если (СЦ-цел(СЦ)=0)или(СЦ-цел(СЦ)=0.50) тогда
        СкидкаЦ=СЦ;
    КонецЕсли;    
    
    Если (СЦ-цел(СЦ)>0)и(СЦ-цел(СЦ)<0.50) тогда
        СкидкаЦ=цел(СЦ);
    КонецЕсли;    
    
    Если (СЦ-цел(СЦ)>0.50)и(СЦ-цел(СЦ)<1) тогда
        СкидкаЦ=цел(СЦ)+0.50;
    КонецЕсли;    
    
    Скидка=СкидкаЦ*Количество;
    Цена=Цена-СкидкаЦ;
    Сумма=Цена*Количество;
    
    
КонецПроцедуры    

Процедура УстСкидку()
    ВыбратьСтроки();
    
    Пока ПолучитьСтроку()=1 Цикл
        
        РассчитатьСкидку();
        
    КонецЦикла;    
    
КонецПроцедуры    
//******************************************************************************

//****************************************************************************** 

Процедура ОбработкаПодбора(Выб)
    Если КоличествоСтрок()>10 тогда
        Предупреждение("В кассовом чеке может быть не более 11 строк!!!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;    
    
    ЗапросКоличестваВПодборе(Контекст,Режим,Выб);
    УстанЦеныРасх(Контекст);
    Выч_суммы_накл(Контекст);
    
    РассчитатьСкидку();
    
    АктивизироватьСтроку();
КонецПроцедуры
//******************************************************************************  

Процедура ПечатьОрдер()
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Ордер");
    Таб.ВывестиСекцию("ОрдерГ");
    Таб.Опции(0,0,0,0,ПарСтрДок);
    Таб.Защита(Константа.ФлагЗащитыТаблиц);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Приходный кассовый ордер","");
КонецПроцедуры
//******************************************************************************

Процедура Печать(Печ=0)
    
    //Если Проведен()=0 тогда

    
    //    Предупреждение("Документ не проведен!");

    //    СтатусВозврата(0);

    
    //    Возврат;

    //КонецЕсли;    

    
    
    Фирма.ИспользоватьДату(ДатаДок);      
    Таб=СоздатьОбъект("Таблица");
    Таб.ВывестиСекцию("Шапка");
    ВыбратьСтроки();
    Ном=0;
    Пока ПолучитьСтроку() = 1 Цикл 
        Ном=Ном+1;
        Таб.ВывестиСекцию("Строка");
        Если Товар.ВидТовара=Перечисление.ВидыТоваров.Комплект Тогда
            Таб.ВывестиСекцию("ВСоставе");
            Кмп=СоздатьОбъект("Справочник.Комплектация");
            Кмп.ИспользоватьВладельца(Товар);
            Кмп.ВыбратьЭлементы();
            Пока Кмп.ПолучитьЭлемент()>0 Цикл 
                Таб.ВывестиСекцию("Состав");
            КонецЦикла;
            Кмп=0;
        КонецЕсли;
    КонецЦикла;
    Таб.ВывестиСекцию("Подвал");
    Таб.Защита(Константа.ФлагЗащитыТаблиц);
    Таб.Опции(0,0,0,0,"КопияЧека");
    Таб.ПараметрыСтраницы(1,100,0,10,10,0,0,0,0,0);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Печать накладной","");
    //    Предупреждение("Вставьте бумагу");

    Если Печ=1 тогда
        Таб.Напечатать(1);
    КонецЕсли;
    
КонецПроцедуры    
//******************************************************************************

Процедура Ок()
    Если Получено < Итог("Сумма") Тогда
        Предупреждение("Не хватает средств для оплаты!");
        Возврат;
    КонецЕсли;
    
    
    Записать();
    Провести();    
    
    ПробитьЧекККМ();
    
    //Если Вопрос("Печатать копию чека?",4)=6 тогда

    //    Печать(1);

    
    //Иначе

    Печать(0);
    //КонецЕсли;    

    //Здесь надо добавить запрос на необходимость печати копии чека

    Форма.Закрыть();    
    
КонецПроцедуры    

Процедура ПриВводеСтроки()
    
    Если КоличествоСтрок()>19 тогда
        Предупреждение("В кассовом чеке может быть не более 20 строк!!!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;    
    
КонецПроцедуры    


//****************************************************************************** 

//******************************************************************************
Процедура ПриОткрытии()
    ПроверкаРазрешенияРедактирования(Контекст);
    
    Если ЧекПробитККМ = 1 Тогда Форма.ТолькоПросмотр(1); КонецЕсли;
    Если НазваниеНабораПрав()="Администратор" тогда 
        Форма.КнСклад.Доступность(1);
        Форма.кнПровести.Доступность(1);
        Форма.кнЗаписать.Доступность(1); 
    Иначе
        Форма.КнСклад.Доступность(0); 
        Форма.кнПровести.Доступность(0);
        Форма.кнЗаписать.Доступность(0); 
    КонецЕсли;
    Если Форма.ТолькоПросмотр()=1 Тогда
        Форма.кнОКлиенте.Доступность(0);
        Форма.КонтактПокупателяХ.Доступность(0);
        Форма.ПодборПоКаталогу.Доступность(0);
        Форма.кнЗаполнитьПолученоПоИтогу.Доступность(0);

        Форма.ОК.Доступность(0);
    КонецЕсли;
    
КонецПроцедуры 
//****************************************

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

    
    СпрККМ = СоздатьОбъект("Справочник.ККМ");
    
    СпрКомпьютеры = СоздатьОбъект("Справочник.Компьютеры");
    Если СпрКомпьютеры.НайтиЭлемент(Пользователь.Компьютер.ТекущийЭлемент())<>1 тогда
        Предупреждение("Компьютер с именем " + Пользователь.Компьютер.ТекущийЭлемент() + " в базе не зарегистрирован!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;    
    
    Если СпрККМ.НайтиПоРеквизиту("Компьютер", СпрКомпьютеры.ТекущийЭлемент(),1)=1 тогда
        Склад = СпрККМ.СкладКомпании;
        //сообщить(Склад);

        Компьютер = СпрКомпьютеры.ТекущийЭлемент(); 
    Иначе
        Предупреждение("Создавать кассовые чеки можно только на компьютерах с ККМ!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;    
    
    Клиент = Константа.ОснПокупатель;
    Валюта_Прежн = Валюта;
    Курс_Прежн = Курс;
    ТипЦен = Перечисление.ТипыРасхЦен.Розничные;
    ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек;
    ВариантОплаты = Перечисление.ТипыОплатЧекаККМ.Наличные;
    
    
    Подбор();
КонецПроцедуры

//******************************************************************************

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

    
    Если ДокОснование.ВидОперации = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат Тогда
        Предупреждение("На основании документа ""Чек на возврат"" нельзя вводить документы !");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    
    Автор=Пользователь;  
    ВидТорговли=Перечисление.ВидыТорговли.ЗаНал;
    ТипНакладной=Перечисление.ТипыНакладных.Расходная;
    ПризнакНакладной=Перечисление.ПризнРасхНакл.Продажа;
    ДатаДок=РабочаяДата();
    Валюта=ДокОснование.Валюта;
    Дата_Курса=ДокОснование.Дата_Курса;
    Курс=ДокОснование.Курс;
    Валюта_Прежн=Валюта;
    Курс_Прежн=Курс;
    Фирма=ДокОснование.Фирма;
****************************************
    
    СпрККМ = СоздатьОбъект("Справочник.ККМ");
    
    СпрКомпьютеры = СоздатьОбъект("Справочник.Компьютеры");
    Если СпрКомпьютеры.НайтиЭлемент(Пользователь.Компьютер.ТекущийЭлемент())<>1 тогда
        Предупреждение("Компьютер с именем " + Пользователь.Компьютер.ТекущийЭлемент() + " в базе не зарегистрирован!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;    
    
    Если СпрККМ.НайтиПоРеквизиту("Компьютер", СпрКомпьютеры.ТекущийЭлемент(),1)=1 тогда
        Склад = СпрККМ.Склад;
        Компьютер = СпрКомпьютеры.ТекущийЭлемент(); 
    Иначе
        Предупреждение("Создавать кассовые чеки можно только на компьютерах с ККМ!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;    
    
    Клиент = ДокОснование.Клиент;
    Валюта_Прежн = Валюта;
    Курс_Прежн = Курс;
    ТипЦен = Перечисление.ТипыРасхЦен.Розничные;
    
    // чек вводится только на основании другого чека,

    // поэтому он всегда является "чеком на возврат"

    ВидОперации  = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат;
    ВариантОплаты = ДокОснование.ВариантОплаты;
    
    ДокОснование.ВыбратьСтроки();
    Пока ДокОснование.ПолучитьСтроку() = 1 Цикл
        НоваяСтрока();
        Товар        = ДокОснование.Товар;
        Цена        = ДокОснование.Цена;
        Единица     = ДокОснование.Единица;
        Коэффициент = ДокОснование.Коэффициент;
        Количество     = ДокОснование.Количество;
        НДС         = ДокОснование.НДС;
        Сумма         = ДокОснование.Сумма;
        //        Цена2        = ДокОснование.Цена2;

        //        Сумма2         = ДокОснование.Сумма2;

        
    КонецЦикла;
    
КонецПроцедуры// ВводНаОсновании() 


      //****************************************

// {
Функция ТекстБонуснойКарты()
    Если (БонуснаяКарта.Выбран() = 1) и (БонуснаяПрограмма.Выбран() = 1) Тогда
        РегБонусы = СоздатьОбъект("Регистр.Бонусы");
        Если Выбран()>0 Тогда// документ не новый, а существующий

            Если(СравнитьТА()<0)  Тогда
                // так делаем, что бы отделить новый Документ

                // если итоги актуальны, то смотрим итоги на ТА

                // если итоги не актуальны, то берем из временногно расчета Регистра

                РегБонусы.ВременныйРасчет();
                РегБонусы.УстановитьФильтр(БонуснаяКарта,БонуснаяПрограмма);
                РассчитатьРегистрыПо(ТекущийДокумент());
            КонецЕсли;
        Иначе// документ новый

            Дат=ПолучитьДатуТА();
            Если Дат>ДатаДок Тогда
                РегБонусы.ВременныйРасчет();
                РегБонусы.УстановитьФильтр(БонуснаяКарта,БонуснаяПрограмма);
                РассчитатьРегистрыНа(ДатаДок+1);
            КонецЕсли;
        КонецЕсли;
        РегБонусы.ВыбратьИтоги();
        Если РегБонусы.ПолучитьИтог()>0 Тогда
            ОстатокБонусовВсего = РегБонусы.Бонусы;
        Иначе
            ОстатокБонусовВсего = 0;
        КонецЕсли;
        
        Возврат "Карта: " + БонуснаяКарта.Держатель.Наименование + "
        |Остаток бонусов: " + Формат(ОстатокБонусовВсего, "Ч-15.2");
    КонецЕсли;
    
    Если Клиент.Выбран() = 0 Тогда
        Возврат "Не выбран клиент";
    КонецЕсли;
    
КонецФункции
//}


Функция НомерЧека()
    Если НомерЧекаККМ > 0 Тогда
        Возврат "Номер чека: "+СокрЛП(НомерЧекаККМ);
    Иначе
        Возврат "";
    КонецЕсли;
КонецФункции



//++

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные);
    Если Scaner.OldVersion<>0 Тогда
        Сообщить("Old Version <> 0");
        Сообщить("Источник: "+Строка( Источник ));
        Сообщить("Событие: "+Строка( Событие ));
        Сообщить(Строка("Данные от устройства: "+ Данные));
    Иначе
        //Контекст.Форма.Закрыть();

        Scaner.EventNumber=Число(Данные);
        ДанныеСканера = Scaner.ScanData;               
        //++ Беседин,ИС,26.10.2017

        //Если у нас длинный результат сканирования - то отсканировали номенклатуру и нам нужно добавить новую строку с ней

        Если СтрДлина(СОКРЛП(ДанныеСканера))>= 13 Тогда   
            ДанныеСканера = СОКРЛП(СтрЗаменить(ДанныеСканера,"+",""));
            СпрНом = СоздатьОбъект("Справочник.Товары");
            Если СпрНом.НайтиПоРеквизиту("Штрихкод",ДанныеСканера,1) = 1 Тогда
                УжеЕсть = 0;
                ВыбратьСтроки();
                Пока ПолучитьСтроку() = 1 Цикл
                    Если Товар = СпрНом.ТекущийЭлемент() Тогда
                        Количество = Количество+1;
                        Выч_суммы_накл(Контекст);
                        УжеЕсть = 1;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;   
                Если УжеЕсть = 0 Тогда
                    НоваяСтрока();
                    Товар = СпрНом.ТекущийЭлемент();
                    УстанЦеныРасх(Контекст);
                    Количество = 1;
                    Выч_суммы_накл(Контекст);                         
                КонецЕсли;
            Иначе
                Сообщить("Не найден товар по данному штрихкоду!","!!!");
            КонецЕсли;
        ИначеЕсли СтрДлина(СОКРЛП(ДанныеСканера))= 8 Тогда
            ДанныеСканера = Сред(ДанныеСканера,4,5);
            СпрДК = СоздатьОбъект("Справочник.БонусныеКарты");
            Если СпрДК.НайтиПоРеквизиту("НомерКарты",ДанныеСканера,1)= 1 Тогда
                БонуснаяКарта = СпрДК.ТекущийЭлемент();
                Если БонуснаяПрограмма.Выбран() = 0 Тогда
                    БонуснаяПрограмма = Константа.ТекущаяБонуснаяПрограмма.Получить(ДатаДок); 
                КонецЕсли;
            Иначе
                Сообщить("Не найдена Бонусная карта! "+ДанныеСканера);
            КонецЕсли;
            ТекстБонуснойКарты();
        Иначе 
            Если Сред(ДанныеСканера,3,1) = "+" Тогда
                ДанныеСканера = Сред(ДанныеСканера,4,4);
            Иначе
                ДанныеСканера = Сред(ДанныеСканера,3,4);
            КОнецЕсли;
            //НомерКарты = ДанныеСканера;

            СпрДК = СоздатьОбъект("Справочник.ДисконтныеКарты");
            Если СпрДК.НайтиПоРеквизиту("НомерКарты",ДанныеСканера,1)= 1 Тогда
                Если Константа.ДисконтПоДокументуВЦелом =1 Тогда
                    ВыбратьСтроки();
                    Пока ПолучитьСтроку()=1 Цикл
                        ДисконтнаяКарта = СпрДК.ТекущийЭлемент();
                        //    ДискКарта();

                        УстСкидку ();
                    КонецЦикла;
                Иначе
                    ДисконтнаяКарта = СпрДК.ТекущийЭлемент();
                    //    Дисконт = СпрДК.ТекущийЭлемент();

                    //    ДискКарта(); 

                    УстСкидку ();
                КонецЕсли;
                //             Сообщить("Найдено! "+ДанныеСканера);

            Иначе
                Сообщить("Не найдена дисконтная карта! "+ДанныеСканера);
            КонецЕсли;
        КонецЕсли;
        //-- Беседин,ИС,26.10.2017

        
        Scaner.DeleteEvent();
    КонецЕсли;
    Scaner.DataEventEnabled = 1;
КонецПроцедуры
//************************************************************************   

//--
//************************************************************************  

Процедура ПоискШтрихКода() 
    СпрНом = СоздатьОбъект("Справочник.Товары");
    Если СпрНом.НайтиПоРеквизиту("Штрихкод",пШтрихКод,1) = 1 Тогда
        УжеЕсть = 0;
        ВыбратьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
            Если Товар = СпрНом.ТекущийЭлемент() Тогда
                Количество = Количество+1;
                Выч_суммы_накл(Контекст);
                УжеЕсть = 1;
                Прервать;
            КонецЕсли;
        КонецЦикла;   
        Если УжеЕсть = 0 Тогда
            НоваяСтрока();
            Товар = СпрНом.ТекущийЭлемент();
            УстанЦеныРасх(Контекст);
            Количество = 1;
            Выч_суммы_накл(Контекст);                         
        КонецЕсли;
    Иначе
        Сообщить("Не найден товар по данному штрихкоду!","!!!");
    КонецЕсли;
КонецПроцедуры  

// {

Процедура БезСдачи()
    Получено = Итог("Сумма");
КонецПроцедуры  
//}


// {

Процедура Купюра()
    Перем Меню, ПунткМеню, Номинал;
    ПунктМеню = 0;
    Об = Форма.АктивныйЭлемент();
    Меню = СоздатьОбъект("СписокЗначений");
    Меню.ДобавитьЗначение("50");
    Меню.ДобавитьЗначение("100");
    Меню.ДобавитьЗначение("200");
    Меню.ДобавитьЗначение("500");
    Меню.ДобавитьЗначение("1000");
    Меню.ДобавитьЗначение("2000");
    Меню.ДобавитьЗначение("5000");
    Меню.ВыбратьЗначение(Номинал,,ПунктМеню,,1);
    Получено = Получено + Номинал;
КонецПроцедуры  
//}


//  {

Процедура ВыбратьБонуснуюКарту()
    Перем Карта;
    
    Если ВвестиЗначение(Карта, "Выберите бонусную карту", "Справочник.БонусныеКарты") = 1 Тогда
        БонуснаяКарта = Карта;
        Если БонуснаяПрограмма.Выбран() = 0 Тогда
            БонуснаяПрограмма = Константа.ТекущаяБонуснаяПрограмма.Получить(ДатаДок);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
//}


// {

Процедура ВыбратьБонуснуюПрограмму()
    Перем Программа;
    
    Если ВвестиЗначение(Программа, "Выберите бонусную программу", "Справочник.БонусныеПрограммы") = 1 Тогда
        БонуснаяПрограмма = Программа;
    КонецЕсли;
    
КонецПроцедуры
//}

//******************************************************************************
//

// Переменные модуля

СтараяСумма = -1; СтараяПолучено = -1;   

//                    

// При входе в Форму запомним промежуточные переменные
Валюта_Прежн=Валюта;
Курс_Прежн=Курс;
ТипЦен=Перечисление.ТипыРасхЦен.Розничные;



Если НазваниеНабораПрав()="Администратор" тогда
    Форма.ДатаДок.Доступность(1);
Иначе
    Форма.ДатаДок.Доступность(0);
КонецЕсли;
 
 
   sanekdark
 
1 - 14.08.18 - 07:47
мне нужно чтоб попадал тока в кассу, и при выборе опалата картой чтоб попадал тока в банк )в банк попадает  но и в задолжность на клиента тоже также идет
   HawkEye
 
2 - 14.08.18 - 08:05
(0) а где ОбработкаПроведения()?
   sanekdark
 
3 - 14.08.18 - 08:13
обработка в модуле документа 


//***************Модуль конвертирован с версии 7.0**************


//--------------------------------------------

Процедура ОбработкаПроведения();
    
    
    Если Склад.Выбран() = 0 Тогда НеПроводить(ТекущийДокумент(),"Не указан склад!"); Возврат; КонецЕсли;
    Если Клиент.Выбран() = 0 Тогда НеПроводить(Контекст,"Не задан клиент!"); Возврат; КонецЕсли;
    
    //ДвиженияРегистровНакладных(Контекст);

    
    //******************************************************************************

    Если ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек Тогда// продажа


        ВыбратьСтроки();
        Пока ПолучитьСтроку() > 0 Цикл
            Если Товар.Выбран() = 0 Тогда
                Сообщить("В документе " + Вид() + " № " + НомерДок + " от " + ДатаДок + "Не указан товар!");
                Продолжить;
            КонецЕсли; 
            
            Если Товар.ВидТовара = Перечисление.ВидыТоваров.Услуга Тогда// услуги здесь в этих регистрах не учитываем

                Продолжить;
            КонецЕсли;    
    
            Рег  = СоздатьОбъект("Регистр.ОстаткиТоваров");
            Рег1 = СоздатьОбъект("Регистр.РезервыТоваров");
            
            Если ИтогиАктуальны() = 0  Тогда
                Рег.ВременныйРасчет();
                Рег1.ВременныйРасчет();
                РассчитатьРегистрыНа(ТекущийДокумент());
            КонецЕсли;
    
            ОбщееКоличество = Количество*Коэффициент;
            Рег.Товар = Товар;
            Рег.Склад = Склад;
            Рег.ОстаткиПолучить();  
            
            Если (Рег.ОстатокТовара < ОбщееКоличество) И (НЕ(Константа.РазрешитьОтрицОстатки = Перечисление.Булево.Да)) Тогда
                Сообщить("На складе нет нужного количества товара " + Товар.Наименование);
                НеПроводить(ТекущийДокумент(),"На складе осталось " + Рег.ОстатокТовара + " " + Товар.БазоваяЕдиница);
                Рег=0; Рег1=0; Рег2=0;
                Возврат;
            КонецЕсли; 
            
            // проверяем резерв товара

            Если НЕ(Константа.РазрешитьПродаватьРезерв = Перечисление.Булево.Да) Тогда
                // Вычислим, сколько всего данного товара

                ПолныйОстаток = Рег.СводныйОстаток(Товар,,"ОстатокТовара");
                // Вычислим, сколько зарезервировано всего данного товара

                Резерв = Рег1.СводныйОстаток(Товар,,"РезервТовара");
                СвободныйРесурс = ПолныйОстаток - Резерв;
                Если СвободныйРесурс < 0  Тогда
                    // товара не хватает на все зарезервированные Счета

                    СвободныйРесурс = 0;
                КонецЕсли;
                        
                Если СвободныйРесурс < ОбщееКоличество Тогда
                    Сообщить("Нет нужного свободного количества товара " + Товар.Наименование);
                    Сообщить("Всего осталось " + Строка(ПолныйОстаток) + " " + Товар.БазоваяЕдиница);
                    Сообщить("Зарезервировано по выписанным Счетам " + Строка(Резерв) + " " + Товар.БазоваяЕдиница);
                    НеПроводить(ТекущийДокумент(),"Требуемое количество " + Строка(ОбщееКоличество) + " " + Товар.БазоваяЕдиница);
                    Рег=0; Рег1=0; Рег2=0;
                    Возврат;
                КонецЕсли;
    
                Если Рег.ОстатокТовара > 0 Тогда
                    Если Рег.ОстатокТовара < ОбщееКоличество Тогда
                    // Если у нас отоладочный режим эксплуатации и разрешено продавать больше,

                    // чем есть на складе, то стоимость в этом случае после проведения накладной

                    // должна обнулиться!!!

                        Регистр.ОстаткиТоваров.БазоваяСтоимость = Рег.БазоваяСтоимость;
                        Регистр.ОстаткиТоваров.ВалютнаяСтоимость = Рег.ВалютнаяСтоимость;
                    Иначе
                        Регистр.ОстаткиТоваров.БазоваяСтоимость = Рег.БазоваяСтоимость * ОбщееКоличество / Рег.ОстатокТовара;
                        Регистр.ОстаткиТоваров.ВалютнаяСтоимость= Рег.ВалютнаяСтоимость* ОбщееКоличество / Рег.ОстатокТовара;
                    КонецЕсли;
                Иначе
                // Если у нас режим отладочной эксплуатации и текущий остаток товара на складе <0

                // то стоимости товаров не учитываем, делаем их =0!!!     

                    Регистр.ОстаткиТоваров.БазоваяСтоимость = 0;
                    Регистр.ОстаткиТоваров.ВалютнаяСтоимость = 0;
                КонецЕсли; 
            КонецЕсли;
        
            Регистр.ОстаткиТоваров.ОстатокТовара = ОбщееКоличество;                         
            Регистр.ОстаткиТоваров.Склад = Склад;
            Регистр.ОстаткиТоваров.Товар = Товар;
            Регистр.ОстаткиТоваров.ФлагУчета = 2;
            Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
            
        КонецЦикла; 
        
        Рег=0; Рег1=0; Рег2=0; 
        
    Иначе// чек на возврат 


        ВыбратьСтроки();
        Пока ПолучитьСтроку() > 0 Цикл
            Если Товар.Выбран() = 0 Тогда
                Сообщить("В документе " + Вид() + " № " + НомерДок + " от " + ДатаДок + "Не указан товар!");
                Продолжить;
            КонецЕсли; 
            
            Если Товар.ВидТовара = Перечисление.ВидыТоваров.Услуга Тогда// услуги здесь в этих регистрах не учитываем

                Продолжить;
            КонецЕсли;    
    
            Рег  = СоздатьОбъект("Регистр.ОстаткиТоваров");
            Рег1 = СоздатьОбъект("Регистр.РезервыТоваров");
            
            Если ИтогиАктуальны() = 0  Тогда
                Рег.ВременныйРасчет();
                Рег1.ВременныйРасчет();
                РассчитатьРегистрыНа(ТекущийДокумент());
            КонецЕсли;
    
            ОбщееКоличество = Количество*Коэффициент;
            Рег.Товар = Товар;
            Рег.Склад = Склад;
            Рег.ОстаткиПолучить();  

            ВалютаТовара = Товар.ВалютаУчета;
            // При возврате товара от Покупателя возвращаем на склад ту стоимость, которая сейчас

            // есть по этому товару, 

            // если товара нет на складе, то стоимость устанавливаем по ПриходнойЦене

            // из карточки товара, но при этом предупреждаем пользователя

            Если  Рег.ОстатокТовара <= 0 Тогда
                // Если у нас отоладочный режим эксплуатации или просто

                // такого товара нет или его уже весь продали, то себестоимость

                // его нам неизвестна, значит стоимость устанавливаем по ПриходнойЦене

                // из карточки товара, но при этом предупреждаем пользователя

                ВалютаЗакупки = Товар.ВалютаЗакуп;
                Сообщить("Для возвращаемого товара " + СокрП(Товар.Наименование) + " неизвестна себестоимость!");
                Сообщить("оприходовано по себестоимости "+ Товар.Прих_Цена + " " + ВалютаЗакупки.Сокр_назв);
                СуммаВал = ОбщееКоличество * Пересчет(Товар.Прих_Цена,ВалютаЗакупки,ДатаДок,ВалютаТовара,ДатаДок);
                СуммаРуб = ОбщееКоличество * Пересчет(Товар.Прих_Цена,ВалютаЗакупки,ДатаДок,Рубли,1); 
            Иначе
                СуммаВал = Рег.ВалютнаяСтоимость * ОбщееКоличество / Рег.ОстатокТовара;
                СуммаРуб = Рег.БазоваяСтоимость * ОбщееКоличество / Рег.ОстатокТовара; 
            КонецЕсли;

            // Учтем возможность отрицательных остатков товара

            Если  Рег.ОстатокТовара<0 Тогда
            // если у нас режим отладочной эксплуатации и текущий остаток товара на складе <0

                Если (-Рег.ОстатокТовара) < ОбщееКоличество Тогда
                // если у нас отоладочный режим эксплуатации, то при переходе через ноль в плюс,

                // добавляем стоимость только положительной части товара

                // (учтем, что у нас здесь Рег.ОстатокТовара<0 )

                    СуммаВал = СуммаВал * (ОбщееКоличество + Рег.ОстатокТовара) / ОбщееКоличество;
                    СуммаРуб = СуммаРуб * (ОбщееКоличество + Рег.ОстатокТовара) / ОбщееКоличество; 
                Иначе
                // если у нас отоладочный режим эксплуатации, то в отрицательной области

                // количества товаров мы стоимости не ведем !!!

                    СуммаВал=0;
                    СуммаРуб=0; 
                КонецЕсли;
            КонецЕсли;
        
            Регистр.ОстаткиТоваров.Склад = Склад; 
            Регистр.ОстаткиТоваров.ОстатокТовара = ОбщееКоличество;
            Регистр.ОстаткиТоваров.Товар = Товар;
            Регистр.ОстаткиТоваров.БазоваяСтоимость = СуммаРуб;
            Регистр.ОстаткиТоваров.ВалютнаяСтоимость = СуммаВал;
            Регистр.ОстаткиТоваров.ФлагУчета = 2; 
            Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();

        КонецЦикла;
        Рег=0; Рег1=0; Рег2=0;
        
    КонецЕсли;
    
    // оприходуем деньги в кассу

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


    Если ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек Тогда// продажа

        
        Регистр.Касса.ДвижениеПриходВыполнить();   
        
    Иначе
        //надо проверить наличие денег в кассе

        Рег = СоздатьОбъект("Регистр.Касса");
        Если ИтогиАктуальны() = 0 Тогда
            Рег.ВременныйРасчет();
            РассчитатьРегистрыНа(ТекущийДокумент());
        КонецЕсли; 
        
        Если (НЕ(Константа.РазрешитьОтрицОстатки=Перечисление.Булево.Да)) Тогда
            Если Итог("Сумма") > Рег.Остаток(Валюта,,"Наличность") Тогда
                Сообщить("Нет нужной суммы в валюты.");
                НеПроводить(ТекущийДокумент(),"В кассе осталось " + Рег.Остаток(Валюта,"Наличность") + Валюта.Наименование);
                Рег=0;
                Возврат;
            КонецЕсли;
        КонецЕсли;

        Регистр.Касса.ДвижениеРасходВыполнить(); 
        
    КонецЕсли;
    //******************************************************************************

 
//старая--------------------------------------------

//Процедура ОбработкаПроведения();
//    Если Клиент.Выбран()=0 Тогда

//        НеПроводить(Контекст,"Не задан клиент!");
//        Возврат;

//    КонецЕсли;
//    

    
    
    ДвиженияРегистровНакладных(Контекст);
    
    
    
    //Движения по дисконтным картам

    Если ДисконтнаяКарта<>Константа.ОснДисконтнаяКарта тогда
    Если ВыбратьСтроки()=1 тогда
        Пока ПолучитьСтроку()=1 Цикл
            Регистр.ДисконтныеКарты.Карта=ДисконтнаяКарта;
            Регистр.ДисконтныеКарты.Товар=Товар;
            Регистр.ДисконтныеКарты.Количество=Количество;
            Регистр.ДисконтныеКарты.Сумма=Сумма-Скидка;
            Регистр.ДисконтныеКарты.Сумма2=Сумма;
            Регистр.ДисконтныеКарты.ДвижениеПриходВыполнить();
            
            
        КонецЦикла;    
            
    КонецЕсли;
    КонецЕсли;
    
    
    
КонецПроцедуры 
//--------------------------------------------
   HawkEye
 
4 - 14.08.18 - 08:18
(1) попробуй прожевать и еще раз внятно сказать кто там у тебя куда попадает и не попадает....
   Масянька
 
5 - 14.08.18 - 08:29
(4) ТС не так уж виноват (виноват, конечно, но не на 100%).
Весь бардак из-за дебилизма, который называется "онлайн кассы".
   sanekdark
 
6 - 14.08.18 - 08:30
HawkEye

когда продажа идет   то деньги должны попасть в кассу . они попадают все ок . но приэтом  когда формирую задолжности выводит еще и задолжность на этого клиента. например стоит "частный клиент"  продали ему  чайник  сума 300р ,  попадает в кассу сразу , делаю задолжности и там "Частный Клиент " должен нам 300р.   он должен попадать тока в кассу
   sanekdark
 
7 - 14.08.18 - 08:31
Масянька ага ппц еще надо реализовать както ну потом сразу с двумя налого облажениями чтоб было например  акцизный товар и простой чтоб печатал ну это потом буду думать) пока это над разобраться
   Время
 
8 - 14.08.18 - 08:36
(6) Потому что читай про розничные продажи.
Ты продал "частному клиенту" (пробил чек), а в конце дня должен приход выручки.
Короче, читай.
   sanekdark
 
9 - 14.08.18 - 08:37
Время так а почему когда я по карте делаю оплату они тоже попадают и в банк и туда
   HawkEye
 
10 - 14.08.18 - 08:39
(5) т.е. ты считаешь что не знание русского языка у автора как то связано с онлайн-кассами? хм......
ну и собственно что там такого прямо уж бардачного, обычные издержки при внедрении.....

(6) ну не двигай взаиморасчеты - не будет попадать...  или закрывай эти взаиморасчеты.....

(7) )))))
 
 Рекламное место пустует
   HawkEye
 
11 - 14.08.18 - 08:39
(9) как написано, так и попадают )
   sanekdark
 
12 - 14.08.18 - 08:40
HawkEye в каком месте убрать не могу понять)
   HawkEye
 
13 - 14.08.18 - 08:44
(12) кто-же знает в твоей поделке что у тебя там в каком месте.... в типовой ТиС нет справочника "Компьютеры"...

что такое: "делаю задолжности"?? отчет? как он строится?
откуда вообще в чеке контрагент? и зачем он там?
   Время
 
14 - 14.08.18 - 08:45
+(13) В стандарте в регистре Касса нет банка.
ТС замутил...
   sanekdark
 
15 - 14.08.18 - 08:46
тоесть нужно посмотреть отчет задолженности откуда там берется что ?
   Время
 
16 - 14.08.18 - 08:48
(15) А на фига в Кассе Банк?
   sanekdark
 
17 - 14.08.18 - 08:52
время
чтоб видеть сколько по безналу прошло по картам банковским отдельно  чтоб не путаться наличные  с банком
   Время
 
18 - 14.08.18 - 08:54
(17) Ну, теперь подумай, как закрывать нал, а как банк?
   sanekdark
 
19 - 14.08.18 - 08:58
не знаю мысли пока не каких нет я ток изучаю 1с вникаю)) по этому строго не судите))
   Время
 
20 - 14.08.18 - 09:00
(19) Ты переделывал стандарт (написано в (0)).
Открой стандарт (не переделанный) и посмотри, как и что сделано.
   sanekdark
 
21 - 14.08.18 - 10:04
Время ок попробую разобраться


Список тем форума
Рекламное место пустует  Рекламное место пустует
Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует