---- IsTopworkInObjTree ----
  -- проверяет, является ли работа работой верхнего уровня в дереве работ её объекта
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[IsTopworkInObjTree]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[IsTopworkInObjTree]
GO
create function IsTopworkInObjTree(@WorkID integer)
returns bit
as
begin
  declare @res bit
  declare @CurParentID int
  declare @ObjID int
  declare @CurObjID int
  declare @NewWorkID int
  select @CurParentID = IsNull(Работа.Код_работы_владельца,0), @ObjID = Работа.Код_объекта, @CurObjID = IsNull(Надработа.Код_объекта,0)
    from Работа
    left join Работа Надработа on Надработа.Код_работы = Работа.Код_работы_владельца
    where Работа.Код_работы = @WorkID  
  while (@CurParentID<>0) AND (@CurObjID<>@ObjID)
  begin
    select @NewWorkID = IsNull(Работа.Код_работы_владельца,0), @CurObjID = IsNull(Надработа.Код_объекта,0)
      from Работа
      left join Работа Надработа on Надработа.Код_работы = Работа.Код_работы_владельца
      where Работа.Код_работы = @CurParentID 
    -- затычка на случай того, что родительская работа выставлена, но её не существует
      if @NewWorkID = @CurParentID set @CurParentID = 0 else set @CurParentID = @NewWorkID 
  end
  if @CurParentID = 0 set @res = 1 else set @res = 0
  return @res
end
