Вышеуказанная задача решена и "масло сделано более масленным". Покажу в картинках реакцию программы. По сути пришлось доработать единственную функцию анализа ШК, вызываемую на любой запрос ШК во всех экранных формах и большую часть времени потратил на тест каждой её ветки.
На картинках, в сервисе приёма, где наибольшее число вариаций отражены
типичные неверные значения вносимые "ручками", копипастом или со сканера:
Хотя и раньше на дополнительных контролах программа не давала вводить нелогичные по ФЛК значения, анализирую содержимое накладной в ЕГАИС:
Полный список контролов и алгоритм действий и реакций программы можно посмотреть в подробно описанном исходном коде программы:
Текст функции контроля вводимого ШК марки и групповой тары:
Код:
* -------------------------------------------------------------------------------------------------
* Проверяю на правильность и логичность кода акцизной марки на длину и вхождение допустимых набо-
* ров символов. Вызов из различных режимов - универсальный код. Параметры:
* cAm 68 или 150 разрядный код приходящий со сканера 2d
* lSerAM Истина, если вызов из сервиса проверок акцизных марок
* lBox Истина, если контролировать ещё возможность ШК групповой тары из сервиса приёма
* 05.01.2018 При чтении ^V из блокнота, а из Excel вообще последний знак кривой. Убрал, что прог-
* рамма ругается на ошибку и иммитирует нажатие клавиши Enter, если вводим в ручную
* 18.06.2018 Обработка, пока примитивная, т.к. не знаю алгоритмов марок DataMax 150 знаков
* 29.12.2018 Добавил анализ ШК групповой тары - набор цифр
* 23.04.2019 Добавил ФЛК и на длину ШК групповой тары, который м.б. 18, 26 цифровых знаков
FUNC lgCheckAM( cAm, lSerAM, lBox )
LOCA nI:=0, nL:=0, lBad:=FALSE
DEFAULT lSerAm TO FALSE, lBox TO FALSE
// Убираю пробелы и определение длины марки. Привожу ШК к допустимой длине, отбрасывая мусорный символ
cAm := Alltrim(cAm)
nL := Len(cAm)
DO CASE
CASE nL = 68 // Правильная старая марка
CASE nL = 69 // Старая марка, введенная копипастом
cAm := Left(cAm,68)
nL := 68
CASE nL = 150 // Новая марка, введенная со сканера
CASE nL = 151 // Новая марка, введенная копипастом
cAm := Left(cAm,150)
nL := 150
CASE nL = 18 // Правильный ШК групповой тары
CASE nL = 19 // ШК групповой тары введенный копипастом
cAm := Left(cAm,18)
nL := 18
CASE nL = 26 // Правильный ШК групповой тары
CASE nL = 27 // ШК групповой тары введенный копипастом
cAm := Left(cAm,26)
nL := 26
ENDC
IF nL > 26 // Акцизная марка или сбойный ШК
IF !((nL = 68) .OR. (nL = 150)) THEN ErrMess("У Вас марка "+Alltrim(Str(nL))+"! Однако длина марки должна быть точно равна 68 или 150 символов!",cError); RETU FALSE
// Символы должны быть в верхнем регистре и входить в разрешенный набор знаков: цифры и латинские буквы
FOR nI := 1 TO nL
IF !( Subs(cAm,nI,1) $ _SIMB_AM )
lBad := TRUE
EXIT
ENDI
NEXT nI
IF lBad THEN Errmess("Акцизная марка или ШК содержит недопустимые символы! Символы должны быть в верхнем регистре и входить в разрешенный набор знаков: цифры и латинские буквы",cError); RETU FALSE
// Проверка на повторный ввод марки в сервисе проверок акцизных марок
IF lSerAm
nI := ascan(aeAM,{|x|x[6]==cAm})
IF nI > 0 THEN ErrMess("Уже вводили данную акцизную марку в запросе!",cError); RETU FALSE
ENDI
ELSE // ШК групповой тары или мусор
IF lBox // Проверяю, как ШК групповой тары
IF !((nL = 18) .OR. (nL = 26)) THEN ErrMess("Неверная длина ШК групповой тары = "+Alltrim(Str(nL))+"! Должная быть 18 или 26 цифровых знаков!",cError); RETU FALSE
// Все символы должны иметь числовое значение
FOR nI := 1 TO nL
IF !( Subs(cAm,nI,1) $ "0123456789" )
lBad := TRUE
EXIT
ENDI
NEXT nI
IF lBad THEN Errmess("Штрихкод групповой тары может иметь только цифры!",cError); RETU FALSE
ELSE // Проверка акцизной марки. Не вызов, как ФЛК групповой тары
ErrMess("У Вас марка "+Alltrim(Str(nL))+"! Однако длина марки должна быть точно равна 68 или 150 символов!",cError); RETU FALSE
ENDI
ENDI
RETU TRUE
P.S. До кучи сделал сообщения более детальными и понятными