public CompositionElement(CompositionVariants variant, SObjectLink olink)
 {
     this.Variant    = variant;
     this.ObjectLink = olink;
     FocusNode       = variant == CompositionVariants.DirectSystem ? olink.Target : olink.Source;
     if (variant == CompositionVariants.BinaryRelation)
     {
         pair_link = FocusNode.DirectObjectLinks()
                     .FirstOrDefault(lnk => lnk != olink && lnk.Definition.IsEssential);
     }
 }
        private static XName GroupId(SObjectLink p)
        {
            // Здесь можно добавить всякие особые случаи группирования
            XName pname = p.Definition.Id;

            if (pname == "father" || pname == "mother" || pname == "husband" || pname == "wife")
            {
                return("family");
            }
            if (pname == "in-collection" && p.Source
                .DirectObjectLinks("collection-item").Any(d => d.Target != null && d.Target.Definition.OfDocType()))
            {
                return("docincollection");
            }
            if (pname == "reflected" &&
                p.Source
                .DirectObjectLinks("in-doc")
                .Any(d => d.Target != null && d.Target.Definition.OfDocType()))
            {
                return("docinreflection");
            }
            if (pname == "in-org" &&
                p.Source.DirectProperty("role-classification") != null &&
                ((SDataLink)p.Source.DirectProperty("role-classification")).InnerText == "director")
            {
                return("first-faces");
            }
            if (pname == "participant" &&
                (p.Source.Definition.Id == "participation" &&
                 p.Source.DirectObjectLinks("in-org").Any(dol =>
                                                          dol.Target != null &&
                                                          dol.Target.DirectProperty("org-classification") != null &&
                                                          ((SDataLink)dol.Target.DirectProperty("org-classification")).InnerText == "organization")))
            {
                return("work-inorg");
            }
            return(p.Definition.Id);
        }