21.09.2016 13:01
AndreyZh
 
Наконец-то придумал!!!

Начав понедельника начал проникаться "засадой", которая грядет на голову пользователей ЕГАИС с 1 октября 2016... и не только Ваш "покорный слуга", но и похоже другие специалисты и пользователи реально "чухнули" только с середины сентября.

В принципе с середины августа (грел пузо на солнце) начались обсуждения об процедурах выведения ЕГАИСных остатков к фактическим, но это задача на период с 01.10 по 31.12

Так же обсуждалась методология списания с торгового зала (регистр 2) и допустимость ухода остатков в течении смены "в минус", что так озаботило и было решено, в частности с появлением в "УС Лэнд:ЕГАИС" техники работы от каждодневных минусовых остатков - см. выше...

Однако "писец" спрятался в другом месте!!! Всякие возможные варианты, следующие из примерного текста методологии "с 1 октября продавать (списывать по пиву и в общепите - это "мелочь") можно только товар, поставленный на баланс" В части ответов спецов РАР и ЦИ прозвучало, что при попытке продажи товаров не числящих в магазине будет блокироваться работа УТМ???

Как говорится "береженного бог бережет!... сказала монашка одевая презерватив на свечку -)" в "УСЕга" ввел ограничитель на продажи через встроенный кассовый аппарат, включенный с 1 октября - программа запрещает продажу алкогольной продукции, до этого не приходящую в "УСЕга" через ЕГАИС, а если БД не велась, то не имеющейся на остатках склада или в торговом зале! Выдаётся сообщение:



... и запрещается отпуск по данной акцизной марке, а точнее по коду АП в ЕГАИС, соответствующему данной марке. Вообще сейчас очень много ограничителей - "защиты от дурака" на "шаловливые ручки" продавцов. Весь их список можете узреть в прилагаемом исходном коде функций контроля ШК АМ:

Исходный код:
Код:
* ---------------------------------------------------------------------------
*   Проверка на валидность (считываемость) акцизной марки - правильности ШК
*   11.05 Контроль дубляжа ввода АМ при заполнении массива и по таблицы чеков
*   15.06 Работа с возвратами. Контроль, что есть ШК АМ в проданных ранее
*       алкогольных товаров, т.е. расходы-возвраты > 0
STAT FUNC lChPDF( cAm, aPdf )
    LOCA nOldSel:=Select(), nOrd:=S_CHECK->(zOrd()), nRec:=S_CHECK->(RecNo())
    LOCA nI:=0, nLen:=68, nL:=0, lBad:=FALSE
    cAm     := AllTrim(cAm)
    nL      := Len(cAm)
    IF nL = 69      //  Исправление копипаста из эксцелевской таблицы
        cAm := Left(cAm,68)
    ENDI
    IF Empty(cAm) THEN ErrMess("Запрещено пустое значение! Для перевода товара в неалкогольный нажмите клавишу Esc!",cError); RETU FALSE
    IF nL <> nLen THEN ErrMess("Длина марки должна быть точно "+Str(nLen,2)+" символов. У Вас "+Str(nL,2)+"!",cError); RETU FALSE

    //  Символы должны быть в верхнем регистре и входить в разрешенный набор знаков
    FOR nI := 1 TO nLen
        IF !( Subs(cAm,nI,1) $ _SIMB_AM )
            lBad    := TRUE
            EXIT
        ENDI
    NEXT nI
    IF lBad THEN Errmess("Акцизная марка содержит недопустимые символы! Возможно переключите Windows на английский язык!",cError); RETU FALSE

    //  Контроль на ввод дубляжа: отсутствие в массиве текущего чека и проданной позиции в базе чеков
    nI      := ascan(aPdf,{|x|x[2]==cAm})
    IF nI > 0
        Errmess("Вы уже ввели данный ШК акцизной марки в данной продаже (чеке)!",cError); RETU FALSE
    ENDI

    //  Проверка по таблице чеков, допуская возможность возврата товара по данной АМ
    nI  := 0
    SELE S_CHECK ORDE SC_CODIS SEEK cAm
    DO WHIL !Eof() .AND. codIs == cAm
        IF sales > 0;   ++nI    //  Продажа
        ELSE;           --nI    //  Возврат от покупателя
        ENDI
        DbSkip()
    ENDD

    //  Возврат состояния среды программы
    SELE S_CHECK ORDE (nOrd) REC (nRec)
    DbSelectArea(nOldSel)

    IF MEMV->lpVozvrat  //  Режим возврата товаров от покупателей
        IF nI <= 0      //  Нет ушедшего на продажу товара
            Errmess("По данному ШК акцизной марки вообще не было продаж или товар уже вернули!",cError); RETU FALSE
        ENDI
    ELSE
        IF nI > 0       //  Есть продажа, произведенная раннее - повторная продажа запрещена
            Errmess("По данному ШК акцизной марки уже когда-то была продажа. Есть товар в списке чеков - повторная продажа запрещена!",cError); RETU FALSE
        ENDI
    ENDI
    
    //  22.09.2016  Запрет товара, если он не проходил через ЕГАИС текущего ключа. Требование с 1 октября 2016
    IF !lMyRest(cAm) .AND. (Date() >= Ctod("01.10.2016"))
        ErrMess("Данная алкогольная продукции никогда не проходила через УТМ данного подразделения - нет следов в таблицах остатков. Продажа с 1 октября 2016 запрещена! Самое простое - поставьте АП на баланс в торговом зале!",cError)
        RETU FALSE
    ENDI
    
    RETU TRUE

* ---------------------------------------------------------------------------    
*   Контроль прохождения товара через ЕГАИС - следы в таблицах любых остатков
STAT FUNC lMyRest(cAm)
    LOCA lRetu:=FALSE, nOldSel:=Select(), nMy:=MY_RESTS->(zOrd()), nSh:=SHOPREST->(zOrd()), cIdEga:=""
    
    //  Акцизную марку преобразую к идентификатору продукции в ЕГАИС
    cIdEga  := cAlcCodAM( Alltrim(cAm) )
    
    //  Ищу следы... Пока остаток не важен, лишь были следы прохождения товара через программу
    SELE MY_RESTS ORDE MR_REGID SEEK cIdEga
    IF Eof()
        SELE SHOPREST ORDE SR_REGID SEEK cIdEga
        IF !Eof() THEN lRetu := TRUE
    ELSE
        lRetu   := TRUE
    ENDI
    
    //  Возврат состояния среды программы
    MY_RESTS->(zSet(nMy))
    SHOPREST->(zSet(nSh))
    DbSelectArea(nOldSel)
    RETU lRetu