private void _prepareData(DataRowCollection attachInfos, List<QuasiUPAttachmentHelperObject> attachments, Sentence sentence)
        {
            if (attachInfos.Count <= 0) return;

            foreach (DataRow attachInfo in attachInfos)
            {
                // 3.6
                var attachIdType1 =
                    attachInfo.Field<int>(HelperDataQuasiUniformPartsAttachmentPreliminaryIdType1.Name);
                // 3.2
                var attachIdType2 =
                    attachInfo.Field<int>(HelperDataQuasiUniformPartsAttachmentPreliminaryIdType2.Name);
                // 102
                var attachNr = attachInfo.Field<int>(HelperDataQuasiUniformPartsAttachmentPreliminaryNr.Name);

                if (attachIdType1 > 0)
                {
                    var newAttach = new QuasiUPAttachmentHelperObject(sentence.Elements.Find(x => x.Id == attachIdType1))
                    {
                        IsInitiallyType1 = true,
                        IsInitiallyType2 = false,
                        SourceNr = attachNr
                    };
                    Log.InfoFormat($"Создан КвазиОЧ Т1: Id: {newAttach.Id}, Текст: {newAttach.Text}");

                    attachments.Add(newAttach);
                }
                else if (attachIdType2 > 0)
                {
                    var newAttach = new QuasiUPAttachmentHelperObject(sentence.Elements.Find(x => x.Id == attachIdType2))
                    {
                        IsInitiallyType2 = true,
                        IsInitiallyType1 = false,
                        SourceNr = attachNr
                    };
                    Log.InfoFormat($"Создан КвазиОЧ Т2: Id: {newAttach.Id}, Текст: {newAttach.Text}");

                    attachments.Add(newAttach);
                }
            }
        }
        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("Для данного ТЭ не найден синтаксический родитель!");
        }