На прошлой неделе решил начать процесс проверок состояния регистра №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