private object[] _processParticiple(SentenceElement element, Sentence sentence, UniformPartsFinalResults upRows)
        {
            var participleId = element.Id;

            var hasChildrenNotServicePart = sentence.SyntacticChildren(participleId).Any(x =>
                x.SyntacticRole.Value != SyntacticRole.ParticleNegative.Value
                && x.SyntacticRole.Value != SyntacticRole.CoordinatingConjunction.Value
                && x.SyntacticRole.Value != SyntacticRole.Particle.Value);
            if (hasChildrenNotServicePart)
            {
                Log.InfoFormat("  Обнаружили потомка не СЧР. Причастие -- Причастие Финальное 1");
                var finalParticiple1 = participleId;
                return new object[] {participleId, finalParticiple1, -1, finalParticiple1, -1};
            }

            Log.InfoFormat("Причастие - Причастие - предварительное 2)");

            if (!upRows.All.Any(x => x.Id == participleId))
            {
                Log.InfoFormat("  Причастие не принадлежит ни одному из рядов. Причастие -- Признак 1");
                var participleFeature = participleId;
                return new object[] {participleId, -1, -1, -1, participleFeature};
            }

            var rowNr = upRows.All.Find(x => x.Id == participleId).RowNr;
            Log.InfoFormat("  Причастие принадлежит к ряду ОЧ {0}. Причастие - предваритиельное 3", rowNr);

            if (sentence.Elements.FindAll(x => upRows.All.Select(y => y.Id).Contains(x.SyntacticParentWordId)).Any(x =>
                x.SyntacticRole.Value != SyntacticRole.ParticleNegative.Value
                && x.SyntacticRole.Value != SyntacticRole.CoordinatingConjunction.Value
                && x.SyntacticRole.Value != SyntacticRole.Particle.Value))
            {
                Log.InfoFormat("  У сочиненных с рассматриваемым причастий нет потомков не СЧР. Причастие -- Признак 2");
                var participleFeature = participleId;
                return new object[] { participleId, -1, -1, -1, participleFeature };
            }
            else
            {
                Log.InfoFormat("  У сочиненных с рассматриваемым причастий есть хотя бы один потомок не СЧР. Причастие -- Финальное 2");
                var participleFinal2 = participleId;
                return new object[] { participleId, -1, participleFinal2, participleFinal2, -1 };
            }
        }
 public int ConjunctedWordId(Sentence sent)
 {
     // ищем соч связь между прилагательными через соч связь существительных
     if (FalseParentId > -1)
     {
         var falseElement = sent.GetElement(FalseParentId);
         var conjunctedWord = sent.Elements.Find(x => falseElement.ConjunctedWithId == x.Id);
         var firstChild = sent.SyntacticChildren(conjunctedWord).First(x =>
             (x.SyntacticRole.Value == SyntacticRole.AgreedAttribute.Value
              || x.SyntacticRole.Value == SyntacticRole.ConcordantAttr.Value)
             && x.GrammarInfo.IsSingular
             && x.ConjunctedWithId == -1);
         return firstChild.Id;
     }
     else if (SuspectedParentId > -1)
     {
         var suspectedElement = sent.GetElement(SuspectedParentId);
         var conjunctedWord = sent.Elements.Find(x => x.ConjunctedWithId == suspectedElement.Id);
         var firstChild = sent.SyntacticChildren(conjunctedWord).First(x =>
             (x.SyntacticRole.Value == SyntacticRole.AgreedAttribute.Value
              || x.SyntacticRole.Value == SyntacticRole.ConcordantAttr.Value)
             && x.GrammarInfo.IsSingular
             && x.ConjunctedWithId == -1);
         return firstChild.Id;
     }
     return -1;
 }
        private void _processConfirmedAttach(QuasiUPAttachmentHelperObject confirmedAttach, List<QuasiUPAttachmentHelperObject> additionalAttachments, Sentence sentence, QuasiUniformPartsAttachmentMainHelperData resultHelpData)
        {
            Log.InfoFormat("Обрабатываем подтвержденный КвазиОЧ-Приложение. Тип1: {0}, Тип2: {1}, Текст: {2}, Id: {3}", confirmedAttach.Type1Confirmed, confirmedAttach.Type2Confirmed, confirmedAttach.Text, confirmedAttach.Id);

            var attachParentElement = sentence.SyntacticParent(confirmedAttach);
            if (attachParentElement != null)
            {
                Log.InfoFormat("  Нашли родителя: Текст: {0}, Id: {1}", attachParentElement.Id, attachParentElement.Text);
                if (attachParentElement.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Noun.Value || attachParentElement.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Pronoun.Value)
                {
                    Log.InfoFormat("  У родителя часть речи: существительное или местоимение, добавляем квази ОЧ.");
                    var attachParentElementWithHelperInfo = new QuasiUPAttachmentHelperObject(attachParentElement)
                    {
                        SourceNr = -1,
                        Type1Confirmed = confirmedAttach.Type1Confirmed,
                        Type2Confirmed = confirmedAttach.Type2Confirmed,
                        IsInitiallyType1 = confirmedAttach.IsInitiallyType1,
                        IsInitiallyType2 = confirmedAttach.IsInitiallyType2,
                        IsAdditional = true,
                        AddedParent = true,
                        NewNr = confirmedAttach.SourceNr
                    };
                    additionalAttachments.Add(attachParentElementWithHelperInfo);
                }
                else if(attachParentElement.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Verb.Value)
                {
                    Log.InfoFormat("  У родителя часть речи: глагол, ищем потомков-существительные с таким же падежом, как у обрабатываемого Квази ОЧ.");
                    var parentChildren = sentence.SyntacticChildren(attachParentElement).FindAll(
                                x => x.GUID != confirmedAttach.GUID
                                && x.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Noun.Value
                                && x.GrammarInfo.Case.Value == confirmedAttach.GrammarInfo.Case.Value);

                    if (parentChildren.Count > 0)
                    {
                        foreach (var child in parentChildren)
                        {
                            Log.InfoFormat("    Добавляем потомка-существительного с падежом {0} к результирующему массиву", confirmedAttach.GrammarInfo.Case.Value);
                            var childWithHelperInfo = new QuasiUPAttachmentHelperObject(child)
                            {
                                SourceNr = -1,
                                Type1Confirmed = confirmedAttach.Type1Confirmed,
                                Type2Confirmed = confirmedAttach.Type2Confirmed,
                                IsInitiallyType1 = confirmedAttach.IsInitiallyType1,
                                IsInitiallyType2 = confirmedAttach.IsInitiallyType2,
                                IsAdditional = true,
                                AddedChildForParent =  true,
                                NewNr = confirmedAttach.SourceNr
                            };
                            additionalAttachments.Add(childWithHelperInfo);
                        }
                    }
                    else
                        Log.InfoFormat("  У родителя с PartOfSpeech = {0} не найдены потомки-существительные в падеже {1}, кроме текущего активного элемента. Ничего не делаем", attachParentElement.GrammarInfo.PartOfSpeech.Value, confirmedAttach.GrammarInfo.Case.Value);
                }
            }
            else
                Log.Error("Для данного ТЭ не найден синтаксический родитель!");
        }