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

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

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

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

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