25.04.2019 14:37
AndreyZh
 
На прошлой неделе решил начать процесс проверок состояния регистра №3, используя автомат пакетного обновления пула марками регистра №3 по РФУ-2: https://olegon.ru/showpost.php?p=327754&postcount=1 и понял, что для пользователей "УС Лэнд:ЕГАИС" - это непригодное решение, по причине, что подготовку списка для автомата нужно производить вручную. Причем - это список будет всегда негоден "как есть" для использования, т.к. будет содержать очень много записей... и его всё равно в редакторе придётся обрезать. Так, как мне приходится настраивать и налаживать эту работу, в том числе у пользователей на удаленном сопровождении... пришлось сильно подумать... и создать новый:

X. Автомат фоновой подготовки данных для запроса марок регистра №3

Автомат вызывается: только через командную строку hle yzLRFU[B]x[/B, где параметры xyz определяют ограничители сканирования остатков склада (регистра №1).

Суть автомата - создание по списку остатка склада файла ListRFU2.txt], содержащего список РФУ-2 для последующего запроса остатков в каталоге программы для последующего его использования автоматом: https://olegon.ru/showpost.php?p=327754&postcount=1

Уточняющие параметры вызова автомата:

x - максимальное число РФУ-2, выбираемое из списка алкопродукции регистра №1. Программа изначально начиная с "первой" позиции выбирает x или менее, если их меньше справок. При следующем запуске выбор справок начинается со строки, на которой предыдущий запуск завершился. По достижению конца списка автомат начинает подбирать справки с его начала заново.

y - 0, то игнорировать записи (алкокод+РФУ-2) на которые нет ссылок в пуле марок, т.е. программа не знает об их принадлежности регистру №3... не принадлежащие регистру №3. Иначе запрос делает по всем РФУ-2 алкопродукции. Режим полезен для начального заполнения пула акцизных марок "УСЕга".

При любых признаках игнорируется пивная продукция.

z - 0, то брать РФУ-2, если имеются остатки на регистре №1, а иначе справки будут запрашиваться и по закончившемуся товару. Иногда, при сбоях ЕГАИС на рег №1 нет остатков, а марки на регистре №3 числятся.

Примеры вызова:

hle 00LRFU100 - список формируется по алкопродукции регистра №3, если есть остатки на регистре №1 и список не более 100 строк... Будет потом запрашиваться у ЕГАИСа около 17 часов.

Замечание: В силу ожидания между запросами в 10 минут и отсутствия "дергания" экрана, многопользовательской обработки данных - данные автоматы вполне можно запускать параллельно другой работе с ЕГАИС.

hle 50LRFU30 - начальное заполнение пула марок. Предполагаем, что "УСЕга" до этого не знала о Ваших данных. Список берется по всему алкоголю с остатками по складу, но не более 30 строк.

hle 11LRFU999999 - сделать список РФУ-2 по алкопродукции когда либо "проходившую" по складу.

Замечание: данный автомат работает молнееносно… т.ч. картинок не имеется.

Реальное использование:

1. В планировщике можно задать несколько заданий с разными автоматами, исполняемыми в требуемое время и в требуемой последовательности.

2. Можно использовать, приложенный командный файл для вызова из планировщика или ярлыка, подправив его под Ваши нюансы:

hle rests
hle 00lrfu4
hle RFU2

? Не уверен, что разумно обновлять остатки склада, т.к. с момента предыдущего запуска товар может быть продан, т.е. по нему регистр №3 не обновится.


Для компьютерщиков даю его исходный код, но отмечу, что не старался сделать его красивым и оптимальным.

Исходник автомата:
Код:
* --------------------------------------------------------------------------------------------------
*   Автоматическое создание списка РФУ-2 для последующего запроса остатков регистра №3. Передаётся
*   максимальное число сохраняемых кодов справок в ххх: yzLRFUxxxx, где
*   y = 0 - берем только алкопродукцию принадлежащую регистру №3, иначе всё кроме пива
*   z = 0 - берем, если есть остаток на регистре №1 складе, а иначе скан и закончившейся АП
*   xxx   - максимальное за сеанс выявление числа справок РФУ-2, учитывая что запрос раз в 10 минут
*   Приведенная выше является более гибкой системой посроения списка РФУ-2
*   - Анализируется неиндексированный файл остатков склада. Контрол - номер записи
*   - Делаю только по алкопродукции с остатками и принадлежащей регистру №3. Всё ведём в УСЕга 
PROC pgAuCrList( cPar )
    LOCA cM:="", lR3:=FALSE, cB:="", cStr:="", lBof:=FALSE, nBegRec:=0, nCount:=0, nRec:=0, lNew:=TRUE
    LOCA nR3:=0, nRest:=0, nMax:=0, cFile:="ListRFU2.TXT"
    
    //  Разбираем переданный параметр
    nR3     := Val(Subs(cPar,1,1))
    nRest   := Val(Subs(cPar,2,1))
    IF (nMax:=Val(Subs(cPar,7)))<=0 THEN pCloseUSega(); fErr_Quit("Не задано максимальное количество РФУ-2 в списке!",cError)
        
    //  Работа автомата возможна лишь при открытых таблицах программы - иначе прекращение работы
    IF !lOpenMyDbf() THEN pCloseUSega(); fErr_Quit("Не доступна или отключено ведение БД программы - дальнейшая работа не возможна!",cError)

    //  Определяю последнюю обработанную запись из предыдущего запуска автомата
    nBegRec := Val(cgGetValue("LISTRFU2"))
    
    //  Устанавливаем рабочие индексы для работы и начинаем скан остатков склада
    SELE MY_RESTS
    DbSetOrder(0)
    
    //  Для предотвращения зацикливания определяю начальные установки от возможно предыдущего запуска
    lBof    := (nBegRec <= 0)
    DbGoTo( nBegRec )
    IF Eof()
        nBegRec := 0
        lBof    := TRUE
    ENDI
    IF lBof
        DbGoTop()
    ELSE
        DbSkip()
    ENDI
    
    //***   Поехали. Возможно возвращение на начало - ловим момент завершения в теле
    nRec    := RecNo()
    DO WHIL TRUE
    
        //  Блок отсева. Возможно, что ни одна запись не будет удовлетворять условиям
        IF Eof()                //  Достигли конца
            
            //  Ничего не подобрали
            IF nCount <= 0  THEN EXIT
            
            //  Начинали подбор с начала и прошли таблицу до конца
            IF lBof         THEN EXIT
            
            //  Начинаем с начала таблицы
            DbGoTop(); LOOP
        ENDI
        
        //  Пошли на второй круг при старте со средины
        IF !lNew .AND. (Abs(RecNo()-nRec)<0.001) THEN EXIT
        lNew    := FALSE
        
        //  Блок отсева записей по условиям вызова автомата
        IF (nRest <= 0) .AND. (qtyAll <= 0)                 //  Отбор только с остатками на регистре №1
            DbSkip(); LOOP
        ENDI
        
        //  Всегда отсеиваю пиво, считая его не маркированной алкопродукцией
        IF !lgUslPivo(MY_RESTS->codAlc,1)
            DbSkip(); LOOP
        ENDI
        
        //  Отсев по признаку принадлежности регистру №3 по записям в таблице пула марок
        cB      := Alltrim(numbb)
        
        //  Отсев по принадлежности регистру №3 по информации из пула
        IF nR3 <= 0
            lR3 := lgR3Marka(MY_RESTS->regId,cB,@cM)
            IF !lR3 THEN DbSkip(); LOOP
        ENDI
        
        cStr    += cB+CRLF                                  //  Подготавливаю строку для записи в файл
        IF ++nCount >= nMax                                 //  Выбрали требуемое число справок
            EXIT
        ENDI
        DbSkip()
    ENDD
    
    //  Запоминаю запись в таблице остатков на которой остановились
    lgPutValue("LISTRFU2",Alltrim( Str(MY_RESTS->(RecNo()),19) ))
    
    //  Сохраняю в текстовый файл каталога программы
    MemoWrit( HB_OEMTOANSI(cFile), HB_OEMTOANSI(cStr) )
    pCloseUSega()
    fErr_Quit("Сохранено в "+cFile,cMainc)
    RETU
Вложения
Тип файла: 7z autor3.7z (162 байт, 46 просмотров)