Решил для себя задачу так :
1. Добавил реквизит "Уровень" в справочник.
2. ПриНачалеРаботы :
лЗапросODBC=СоздатьОбъект("ODBCRecordSet");
лЗапросODBC.ВыполнитьИнструкцию("
|set nocount on
|declare @level as int, @idspr as char(9),@idparent_spr as char(9)
|declare @cur_id as char(9),@cur_idparent as char(9),@cur_level as int
|declare mcursor cursor local for
| select SprTMZ.id, SprTMZ.parentid, $SprTMZ.Уровень
| from $Справочник.ТМЦ as SprTMZ (nolock)
|open mcursor
| fetch next from mcursor into @cur_id,@cur_idparent,@cur_level
| while @@fetch_status=0
| begin
| select @level=0
| select @idparent_spr = @cur_id
| while (@idparent_spr<>$ПустойИД)
| begin
| select @idparent_spr = SprTMZ.parentid
| from $Справочник.ТМЦ as SprTMZ (nolock) where SprTMZ.id=@idparent_spr
| select @level=@level+1
| end
| if (@level<>@cur_level)
| begin
| update SprTMZ_u
| set $SprTMZ_u.Уровень = @level
| from $Справочник.ТМЦ as SprTMZ_u where SprTMZ_u.id = @cur_id
| end
| fetch next from mcursor into @cur_id,@cur_idparent,@cur_level
| end
|close mcursor
|deallocate mcursor
|set nocount off
|");
лЗапросODBC.Закрыть();
Замечания :
1. Это хорошо, когда справочники меняются редко.
2. Это можно вставить также в процедуру "приоткрытии"
3. По-хорошему, если справочник изменяется интенсивно, нужно писать тригера на добавление записи в справочник и на изменение поля parentid.
4. В процедуре "ПриЗаписи()", "ПриПереносеЭлементаВДругуюГруппу()" не забыть заполнить реквизит "Уровень".