28.01.2019 14:03
AndreyZh
 
Поглядел, что обсуждение проблемы популярно, да и ооочень редко возникает в реале ситуация сканирование не той бутылки и отправка чека с ценой ниже МРЦ... правда всегда ЕГАИС это ловил, но "не порядок", что в этой мощной утилите для ЕГАИС не реализована эта возможность... Исправляюсь - работа начата:

Изучив подходы, в частности здесь: https://olegon.ru/showthread.php?t=29675&page=5 с сообщения 45... Мне не понравились все! А посему сделал свой "лисапед":

1. Схема МОЦ (минимальная оптовая цена - рознице нужна при возврате поставщикам) и МРЦ (минимальная розничная цена - рознице нужна при контроле продаж по чекам и списаниям в общепите с причиной реализация) описывается в текстовом файле Schema.mc каталога программы. В нём, в свободном формате описываются цены из постановлений.

МРЦ и МОЦ с 1 января 2019:
Код:
Схема - Все поля обязательны, цена определяется за 0.5 литра: 
Список КВАП; грудус от не включая, до включая; МРЦ, МОЦ

Шампанское и игристые вина не зависят от градуса
440,441,442,443,450,451,452,453;-100,999;109.33,88.67

Коньяки
229,230,231,233,234,235;-100,999;388.00,338.00

Бренди, кальвадос и другая шняга
232,237,239,242,251,252;-100,999;307,250

На ликероводочную и другую алкогольную продукцию крепостью свыше 28 процентов
212,236,280;28,29;168,146
212,236,280;29,30;172,150
212,236,280;30,31;176,153
212,236,280;31,32;180,157
212,236,280;32,33;184,160
212,236,280;33,34;189,164
212,236,280;34,35;193,168
212,236,280;35,36;197,172
212,236,280;36,37;201,175
212,236,280;37,38;205,179
212,236,280;38,39;210,182
212,236,280;39,40;215,186
212,236,280;40,41;219,190
212,236,280;41,42;223,194
212,236,280;42,43;227,197
212,236,280;43,44;231,201
212,236,280;44,45;236,205
212,236,280;45,46;240,208
212,236,280;46,47;244,213
212,236,280;47,48;248,216
212,236,280;48,49;252,220
212,236,280;49,50;256,223
212,236,280;50,51;261,227
212,236,280;51,52;265,230
212,236,280;52,53;269,234
212,236,280;53,54;273,238
212,236,280;54,55;278,242
212,236,280;55,56;283,245
212,236,280;56,57;287,249
212,236,280;57,58;291,253
212,236,280;58,59;295,256
212,236,280;59,60;299,261
212,236,280;60,61;303,263
212,236,280;61,999;308,268

Так же здесь описываем водку, которая может быть от 37 до 56 градусов и не совсем совпадает
с ликеро-водочными изделиями. Высчитываю отдельно
200;37,38;215,186
200;38,39;215,186
200;39,40;215,186
200;40,41;219,190
200;41,42;223,194
200;42,43;227,197
200;43,44;231,201
200;44,45;236,205
200;45,46;240,208
200;46,47;244,213
200;47,48;248,216
200;48,49;252,220
200;49,50;256,223
200;50,51;261,227
200;51,52;265,230
200;52,53;269,234
200;53,54;273,238
200;54,55;278,242
200;55,56;283,245


2. При запуске программы данный файл для скорости обработки перекачивается в массив памяти, игнорируя "мусорные" строки

3. Добавил функцию расчета МРЦ и МОЦ по переданным параметрам. Логика понятна из её исходника:

Исходник:
Код:
* --------------------------------------------------------------------------------------------------
*   Возврат минимальной оптовой или розничной цены, в зависимости от переданного параметра
*   Параметры:
*   lOpt    Истина, если опт
*   cAlc    Код КВАП
*   nLitr   Литраж единицы - емкость
*   nDeg    Градусность алкопродукции
*   Возращает нужную минимальную цену или 0 при невозможности её определить, или если не задаётся
FUNC ngMinPrice(lOpt,cAlc,nLitr,nDeg)
    LOCA nPrice:=0, nI:=0, nLen:=Len(agSchMC)
    IF nLen <= 0 THEN RETU nPrice                   //  Нет файла схемы цен
    IF Empty(cAlc:=Alltrim(cAlc)) THEN RETU nPrice  //  Ошибочный параметр
    IF nLitr <= 0 THEN RETU nPrice                  //  Ошибочный параметр
    
    //***   Дробный градус алкопродукции округляется до целого значения по математическому округлению - изыскания Декларант
    nDeg    := Round(nDeg,0)
    
    //  Сканируем массив для поиска необходимой цены
    FOR nI := 1 TO nLen
        IF At(cAlc,agSchMC[nI,1]) > 0                                   //  Входит в список КВАП для МЦ
            IF (nDeg > agSchMC[nI,2]) .AND. (nDeg <= agSchMC[nI,3])     //  Попадаем в интервал по градусам
            
                //  Расчет МЦ в зависимости от литража и типа цены. Выход из цикла
                nPrice  := Round(nLitr*2*IF(lOpt,agSchMC[nI,5],agSchMC[nI,4]),2)
                EXIT
            ENDI
        ENDI
    NEXT nI
    RETU nPrice



4. Пока сделано для реального использования

а. Просмотр цен и поиск цен ниже МРЦ и/или МОЦ, зависящий от регистра:





б. При отправке отгрузочной ТТН на возврат поставщика анализ МОЦ и требования действия пользователя:






продолжение, по мере создания новых возможностей следует....