а мона и так (пример для справочника Номенклатура):
sql="declare @oldid char(9)
|declare @id char(9)
|declare @urr int
|
|set @id = '"+?(ВыбТовар.Выбран()=1, GetID(ВыбТовар)," 0 ")+"'
|set @oldid = @id
|set @urr="+?(ВыбТовар.Выбран()=1, ВыбТовар.Уровень(),0)+"
|
|create table #tmpid1 (ID char(9) NOT NULL, ur int not null, FullCode varchar(360) not null)
|
|While RTrim(LTrim(@id)) <> '0'
| begin
| insert into #tmpid1 (ID, ur, FullCode) values (@id, @urr, space(9-@urr)+'/')
| select @id = PARENTID
| from sc33
| where id = @id
| set @urr=@urr-1
| end
| set @id=@oldid
| set @urr="+?(ВыбТовар.Выбран()=1, ВыбТовар.Уровень(),0)+"
|
| create table #tmpid2 (ID char(9) NOT NULL, ur int not null, FullCode varchar(360) not null)
| set @urr=@urr+1
| insert into #tmpid2 (ID, ur, FullCode)
| select ID, @urr, rtrim(code)
| from sc33 s1
| where parentid=@id and s1.isfolder = '1'
| While @@rowcount > 0
| begin
| set @urr=@urr+1
| insert into #tmpid2 (ID, ur, FullCode)
| select distinct s1.ID, @urr, rtrim(s2.FullCode)+' /'+rtrim(s1."+сорт+")
| from sc33 s1,
| #tmpid2 s2
| where s2.ID = s1.parentid
| and s1.isfolder = '1'
| and not exists (select 1
| from #tmpid2 s3
| where s1.ID = s3.ID)
| end
|
|";
Тхт.ДобавитьСтроку(sql);
RecSet=Conn.Execute(sql);
а это функция для получения внутреннего ID
//*****
Function GetID(Val Obj)
Var Str;
Str = ValueToStringInternal(Obj);
LV = CreateObject("ValueList");
LV.FromSeparatedString(Mid(Str,2,Strlen(Str)-2));
Str = LV.GetValue(LV.GetListSize());
//If Right(Str,3) = CodeDB Then
// Str = ""+_IDToStr(Str)+CodeDB;
//Else
// Str = ""+_IDToStr(Str)+" ";
//EndIF;
баз=Right(Str,3);
Str = ""+_IDToStr(Str)+баз;
While Strlen(Str) < 9 Do
Str = " "+Str;
EndDo;
Return Str;
EndFunction
сия весчь реально работает даже без ВК 1c++
заполняет от выбранной группы все нижестоящие и вышестоящие группы справочника Номенклатура
FullCode используется для дальнейшей сортировки, а в переменной сорт прописывается либо code, либо descr, либо ID