В какой-то момент может возникнуть необходимость определить, в каких типовых маршрутах используются конкретные блоки.
Поиск таких типовых маршрутов можно произвести с помощью следующего сценария:
DEL = ', '
Blocks = CreateStringList()
// Выбрать блоки для поиска
Ref = References.SYSREF_ROUTE_BLOCKS.GetComponent()
AddWhereID = Ref.AddWhere(Ref.Requisites(SYSREQ_STATE).SQLFieldName & " = 'Д'")
Ref.Open
View = Ref.CreateView(Ref.MainViewCode)
View.MultiSelection = TRUE
View.ViewMode = vmSelect
Form = Ref.ComponentForm
Form.ShowModal
if Form.Result == mrOK
Index = 0
RecordCount = View.SelectedRecordCount
while Index < RecordCount
Blocks.Add(View.SelectedRecordsID(Index))
Index = Index + 1
endwhile
endif
Ref.Close
Ref.DelWhere(AddWhereID)
if Blocks.Count > 0
// Определить названия блоков
Blocks.Delimiter = DEL
Blocks.DelimitedText = SQL(Format("
select t.%s
from dbo.%s t
where t.xRecID in (%s)";
ArrayOf(Ref.Requisites(SYSREQ_CODE).SQLFieldName; Ref.TableName; Blocks.DelimitedText));; DEL)
endif
Ref = nil
ResList = CreateList()
if Blocks.Count > 0
Query = CreateQuery()
Query.CommandText = "
select
t.Kod as Kod,
t.NameAn as Name,
s.SearchCondition as Text
from
MBVidAn r
inner join
MBAnalit t on t.Vid = r.Vid and t.xRecStat = '+' and t.Sost = 'Д'
inner join
MBText s on s.SrcRecID = t.Analit
where
r.Kod = 'ТМТ'"
Query.Open
Progress = CreateProgress(; Query.RecordCount; TRUE;; 2)
Progress.Show
XMLDoc = CreateObject("MSXml.DomDocument")
foreach Record in Query
Name = Record.Fields('Name').AsString
Progress.Text = 'Типовой маршрут ' & Name
XMLDoc.LoadXML(Record.Fields('Text').AsString)
// Перебрать все имена блоков
foreach BlockName in Blocks
Path = Format("/Settings/Blocks/Block[@Type='%s']"; BlockName)
if not VarIsClear(XMLDoc.SelectSingleNode(Path))
if ResList.IndexOfName(BlockName) <> -1
List = ResList.ValueByName(BlockName)
else
List = CreateStringList()
endif
List.Add(Record.Fields('Kod').AsString & TAB & Name)
ResList.SetVar(BlockName; List)
endif
endforeach
Progress.Next
endforeach
Progress.Hide
XMLDoc = nil
Query.Close
endif
ResultText = CreateStringList()
ResultText.Delimiter = CR
while ResList.Count > 0
ResultText.Add('Блок ' & ResList.Names(0))
List = ResList.Values(0)
List.Delimiter = CR & TAB
ResultText.Add(TAB & List.DelimitedText)
ResList.Delete(0)
endwhile
EditText(ResultText.DelimitedText)
После запуска данного сценария появится окно с выбором блоков типовых маршрутов:

После выбора необходимых блоков произойдёт поиск типовых маршрутов.
Для удобного копирования названий типовых маршрутов, вывод результатов происходит в режиме редактирования текста:
Авторизуйтесь, чтобы написать комментарий