Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: условие для действия кассира  (Прочитано 12283 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fanat26
Интересующийся

ru
Offline Offline

« : 04-08-2011 02:06 » 

Здравствуйте уважаемые форумчане! в панорамировании пока новичок, возникла такая ситуация - есть рабочее место с 1с предприятие 7.7 Штрих-М кассир, все настроено все работает нормально, но нужно что бы кассир мог делать "СТОРНО" для товара до определенной цены (например товар с ценной до 100 руб. можно отменить - сторно)
Подскажите пожалуйста какие нибудь идеи.
модуль сторно могу выложить
Код:
Процедура Сторно()
        Если НовыйЧек=1 Тогда
            НовыйЧек();
        КонецЕсли;
       
        Если НачинатьСНуля=1 Тогда
            НачалоСНуля();
        КонецЕсли;
       
        Если ЧекОткрыт=0 Тогда
            Возврат;
        КонецЕсли;
       
        Если ВидЧека>3 Тогда
            Сигнал();
            Возврат;
        КонецЕсли;
        ВнешняяКомпонента.MaxKeyNum=-1;
        ВнешняяКомпонента.MinKeyNum=-1;
       
        Если Чек.КоличествоСтрок()>0 Тогда
            Если Чек.Флаг=2 Тогда
                ВнешняяКомпонента.MaxKeyNum=255;
                ВнешняяКомпонента.MinKeyNum=1;
                Возврат;
            КонецЕсли;
            Цифры=?(ДесТ=2,"0.00","0.");
            ПоложениеТочки=ДесТ;
            НажатаТочка=0;
            Кол=1;
            НажатПромИтог=0;
            ТекТовар=0;
            К=1;
           
            Если ПустоеЗначение(Чек.Товар)=0 Тогда
                ТекТовар=?(Чек.Товар.Вид()="Товары",Чек.Товар,Чек.Товар.Владелец);
               
                Если Чек.Товар.Вид()="Единицы" Тогда
                    К=?(Чек.Товар.Коэффициент=0,1,Чек.Товар.Коэффициент);
                КонецЕсли;
            КонецЕсли;
           
            Если ПроверкаПрав("Сторно")=0 Тогда
                СтрокаДляТовараКК(3,0,ТекТовар,Чек.Количество*К,Чек.Цена/К,Чек.Сумма,,Чек.НомерСтроки,2006,Чек.СуммаСкидки);
                ВнешняяКомпонента.MaxKeyNum=255;
                ВнешняяКомпонента.MinKeyNum=1;
                Возврат;
            КонецЕсли;
           
            Если (ИтогЧека("СуммаСоСкидкой")-СуммаСкидкиНаЧек-Чек.СуммаСоСкидкой<0) И (СкидкаНаЧек=0) И (ЕстьВозвратыВЧекеПродажи=0) Тогда
                ЗвуковойСигнал();
                ВывестиПредупреждение("Полученная сумма будет меньше нуля!","Сторно невозможно!");
                ВнешняяКомпонента.MaxKeyNum=255;
                ВнешняяКомпонента.MinKeyNum=1;
                Возврат;
            КонецЕсли;
           
            Если ВидЧека<>3 Тогда
                Если ПечататьКаждуюСтроку>0 Тогда
                    Если ПечатьРегистрации(Чек.Номер,Чек.Товар,Чек.Количество,Чек.Цена,Чек.Секция,Чек.Продавец,1)=0 Тогда
                        ВнешняяКомпонента.MaxKeyNum=255;
                        ВнешняяКомпонента.MinKeyNum=1;
                        Возврат;
                    КонецЕсли;
                   
                    Если Чек.СуммаСкидки<>0 Тогда
                        СтрокаДляПечати="";
                       
                        Если ПустоеЗначение(Чек.АвтоматическаяСкидка)=0 Тогда
                            СтрокаДляПечати=СокрЛП­(Чек.АвтоматическаяСкидка.ТекстДляЧека);
                        КонецЕсли;
                       
                        Если ПустоеЗначение(Чек.ФиксированнаяСкидка)=0 Тогда
                            СтрокаДляПечати=СокрЛП­(Чек.ФиксированнаяСкидка.ТекстДляЧека);
                        КонецЕсли;
                       
                        Если ПечатьСкидки(Чек.СуммаСкидки,Чек.Скидка,Чек.СуммаСоСкидкой,СтрокаДляПечати)=0 Тогда
                            ВнешняяКомпонента.MaxKeyNum=255;
                            ВнешняяКомпонента.MinKeyNum=1;
                            Возврат;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                Транз=СоздатьОбъект("Справочник.ВремТранзакции");
                Знак=?(ВидЧека=1,-1,1);
               
                Если Чек.Флаг=3 Тогда
                    Знак=1;
                КонецЕсли;
                Транз.Новый();
                Транз.Код=Формат(Число(Чек.ТранзакцияРегистрации)+7,"Ч(0)7");
                Транз.Наименование=?(ПустоеЗначение(Чек.Товар)=0,"Сторно","Секция");
                Транз.НомерККМ=Константа.НомерПОС;
                Транз.ДатаТранз=ТекущаяДата();
                Транз.ВремяТранз=ТекущееВремя();
                Транз.ТипТранзакции=?(ПустоеЗначение(Чек.Товар)=0,12,2);
                Транз.НомерЧека=НомерЧека;
                Транз.Секция=Чек.Секция;
                Транз.КодКассира=ТекущийПользователь.Код;
                Транз.КодТовара=?(ПустоеЗначение(Чек.Товар)=0,ТекТовар.Код,0);
                Транз.Цена=Чек.Цена/К;
                Транз.Количество=Знак*Чек.Количество*К;
                Транз.Сумма=Окр(Знак*Чек.СуммаСоСкидкой,ДесТ);
                Попытка   Транз.Записать();
                Исключение     ЗвуковойСигнал();
                    ВывестиПредупреждение("Ошибка работы с базой данных:"+РазделительСтрок+ОписаниеОшибки()+"!","Ошибка базы!");
                    ВнешняяКомпонента.MaxKeyNum=255;
                    ВнешняяКомпонента.MinKeyNum=1;
                    Возврат;
                КонецПопытки;
                Чек.Флаг=2;
                СтрокаДляТовараКК(0,0,ТекТовар,Чек.Количество*К,Чек.Цена/К,Чек.Сумма,,Чек.НомерСтроки,2006,Чек.СуммаСкидки);
                ПозЧ=РасчСкидкиНаПоз.НайтиЗначение(Чек.НомерСтроки);
               
                Если ПозЧ>0 Тогда
                    РасчСкидкиНаПоз.УдалитьЗначение(ПозЧ);
                КонецЕсли;
               
                Если СкидкаНаЧек<>0 Тогда
                    Если ПересчетСкидкиНаЧек()=0 Тогда
                        ВнешняяКомпонента.MaxKeyNum=255;
                        ВнешняяКомпонента.MinKeyNum=1;
                        Возврат;
                    КонецЕсли;
                КонецЕсли;
            Иначе   Чек.УдалитьСтроку();
            КонецЕсли;
        КонецЕсли;
       
        Если (Константа.РазрешитьАвтоматическиеСкидки>0) И (ВидЧека=1) Тогда
            РассчитатьАвтоматическуюСкидкуНаЧек();
        КонецЕсли;
       
        Если (Константа.РазрешитьНакопительныеСкидки>0)     И (ПустоеЗначение(ВыбраннаяДисконтнаяКарта)=0) Тогда
            Если (ПолучитьСкидкуПоДисконтнойКарте(ВыбраннаяДисконтнаяКарта)<>ДисконтнаяСкидкаНаЧек) ИЛИ (Константа.КонтрольСкидок>0) Тогда
                Скидка(0,1,,1,,ВыбраннаяДисконтнаяКарта,1);
                Скидка(0,0,,1,,ВыбраннаяДисконтнаяКарта,1);
            КонецЕсли;
        КонецЕсли;
       
        Если (ПустоеЗначение(ФиксированнаяСкидкаНаЧек)=0) И (Константа.КонтрольСкидок>0) Тогда
           
            Если ФиксированнаяСкидкаНаЧек.ВидСкидки=Перечисление.ВидыСкидок.Процентная Тогда
                Скидка(?(ФиксированнаяСкидкаНаЧек.ТипСкидки=Перечисление.ТипыСкидок.Скидка,0,2),1,,1,ФиксированнаяСкидкаНаЧек);
                Скидка(?(ФиксированнаяСкидкаНаЧек.ТипСкидки=Перечисление.ТипыСкидок.Скидка,0,2),,,1,ФиксированнаяСкидкаНаЧек);
            КонецЕсли;
        КонецЕсли;
        ПересчетСкидкиНаЧек();
       
        Если ВидЧека=1 Тогда
            Операция="Продажа";
        ИначеЕсли ВидЧека=2 Тогда
            Если ФлагВозврата=1 Тогда
                Операция="Возврат";
            Иначе   Операция="Аннул.";
            КонецЕсли;
        ИначеЕсли ВидЧека=3 Тогда
            Если ФлагВозврата=1 Тогда
                Операция="Возврат по №";
            Иначе   Операция="Аннул. по №";
            КонецЕсли;
        КонецЕсли;
       
        Если Константа.РаботаСДисплеем>0 Тогда
           
            Если Константа.РазделятьТриады=0 Тогда
                ФорматСумм="Ч."+ДесТ;
            Иначе   ФорматСумм="Ч."+ДесТ+".'";
            КонецЕсли;
           
            Если Константа.ВыводитьПромИтогНаДисплей>0 Тогда
                ВывестиСтрокуНаДисплей("Сторно "+ФормС(Чек.СуммаСоСкидкой,ФорматСумм),1);
                ВывестиСтрокуНаДисплей("Пром.итог "+ФормС(ИтогЧека("СуммаСоСкидкой")-СуммаСкидкиНаЧек,ФорматСумм),2);
            Иначе   ВывестиСтрокуНаДисплей("Сторно",1);
                ВывестиСтрокуНаДисплей(ФормС(Чек.СуммаСоСкидкой,ФорматСумм),2);
            КонецЕсли;
        КонецЕсли;
        ОбновитьНомераСтрок();
        ВнешняяКомпонента.MaxKeyNum=255;
        ВнешняяКомпонента.MinKeyNum=1;
    КонецПроцедуры
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-08-2011 06:21 » 

Сразу как новичку дам совет: не пиши никогда такие процедуры!
1. Читаемая процедура/функция должна быть порядка 20 строк, если больше - бей на отдельные блоки
2. Комментарии в коде, но там, где они нужны. Например строка
Код: (Text)
Если ПроверкаПрав("Сторно")=0 Тогда
понятна и в комментировании не нуждается, а вот следующее условие
Код: (Text)
Если (ИтогЧека("СуммаСоСкидкой")-СуммаСкидкиНаЧек-Чек.СуммаСоСкидкой<0) И (СкидкаНаЧек=0) И (ЕстьВозвратыВЧекеПродажи=0) Тогда
уже стоило бы пояснить

Что касается вопроса:
После условия
Код: (Text)
Если ПроверкаПрав("Сторно")=0 Тогда ... КонецЕсли
нужно вставить цикл проверки по строкам и для каждой строки проверить выполнятется твое условие или нет. Если нет - тогда
 
Код: (Text)
                ЗвуковойСигнал();
                ВывестиПредупреждение("Нельзя продать товар дороже 100!","Сторно невозможно!");
                ВнешняяКомпонента.MaxKeyNum=255;
                ВнешняяКомпонента.MinKeyNum=1;
                Возврат;
Записан
Fanat26
Интересующийся

ru
Offline Offline

« Ответ #2 : 04-08-2011 07:53 » 

Спасибо большое за советы!
С циклом пока сложно, а если Если ПроверкаПрав("Сторно")=0 и "Если Чек.Цена<=100" Тогда
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 04-08-2011 11:39 » 

Без понятия.
Я пока из кода не понял Товар это реквизит шапки документа или табличной части. Или сторно делается по конкретной строке?
Если мы говорим об одной строке и на ней уже спозиционированы когда зашли в эту процедуру - тогда то, что ты предлагаешь, вполне реальное решение, только без кавычек и условие наоборот:
Код: (Text)
Если (ПроверкаПрав("Сторно")=0) ИЛИ (Чек.Цена>100) Тогда
    ...
Записан
Fanat26
Интересующийся

ru
Offline Offline

« Ответ #4 : 08-08-2011 09:29 » 

дописал эту строку

Добавлено через 10 минут:
Дописал эту строку в модуле,
Код:
Если (ПроверкаПрав("Сторно")=0) ИЛИ (Чек.Цена>100) Тогда
условие стало выполняться, товар до 100 рублей кассир может делать сторно, НО товар >100 когда нажимаешь сторно ничего не реагирует! =(
До этого когда не было условия, был просто запрет сторно для кассиров, т.е. когда она нажимала сторно выходило окно для ввода имени и пароля персоналу которому разршено сторно (старший кассир старший смены)
Подскажите что нужно дописать??? А черт его знает...
« Последнее редактирование: 08-08-2011 09:39 от Fanat26 » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 09-08-2011 05:55 » 

Значит я неверно понял задачу - нужно не запрещать более 100, а разрешить менее, но в коде этого не видно. Возможно - это кроется в ПроверкаПрав("Сторно")
Только не нужно публиковать весь код! Поищи по тексту кода строку из "окна для ввода имени и пароля персоналу..." и определи где оно вызывается - вот там и нужно ставить условие
Записан
Fanat26
Интересующийся

ru
Offline Offline

« Ответ #6 : 10-08-2011 04:53 » 

получается сейчас надо запретить сторно - товара по цене выше 100р.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-08-2011 06:28 » 

получается сейчас надо запретить сторно - товара по цене выше 100р.
Наоборот - запретить мы уже запретили.
Нужно найти место в коде, где задается запрос на ввод пароля старшего кассира, и в этом месте анализровать: если товар меньше 100 р - то результат подтверждения "Ок", ели нет -тогда выдавать окошко с именем и паролем.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines