private void UpdateSpcObjByPilot(SpcObject spcObject)
        {
            var needToChange = false;
            var loader       = new ObjectLoader(_objectsRepository);

            loader.Load(spcObject.GlobalId, obj =>
            {
                if (obj == null)
                {
                    return;
                }
                var builder = _objectModifier.Edit(obj);
                foreach (var spcColumn in spcObject.Columns)
                {
                    var spcColVal = ValueTextClear(spcColumn.Value);
                    // проверка нужно ли изменять объект
                    foreach (var attrObj in obj.Attributes)
                    {
                        if (attrObj.Key != spcColumn.TypeName)
                        {
                            continue;
                        }
                        if (attrObj.Value.ToString() == spcColVal)
                        {
                            continue;
                        }
                        needToChange = true;
                        if (int.TryParse(spcColVal, out var i))
                        {
                            builder.SetAttribute(spcColumn.TypeName, i);
                        }
                        else
                        {
                            builder.SetAttribute(spcColumn.TypeName, spcColVal);
                        }
                    }
                }
                // получаем pdf файл из Обозревателя
                var fileFromPilot = obj.Files.FirstOrDefault(f => IsFileExtension(f.Name, ".pdf"));
                var doc           = spcObject.Documents.FirstOrDefault(f => IsFileExtension(f.FileName, SOURCE_DOC_EXT));
                if (doc != null && fileFromPilot != null)
                {
                    var pdfFile = spcObject.PreviewDocument;
                    // md5 в нижнем регистре расчитывается и возвращается пилотом
                    var fileNameMd5 = CalculatorMd5Checksum.Go(pdfFile);
                    if (!string.IsNullOrEmpty(fileNameMd5) && fileFromPilot.Md5 != fileNameMd5)
                    {
                        needToChange = true;
                        builder.CreateFileSnapshot("").AddFile(pdfFile);
                    }
                }
                if (needToChange)
                {
                    _objectModifier.Apply();
                }
            });
        }
        private void UpdateSpcByPilot(Specification spc)
        {
            var loader = new ObjectLoader(_objectsRepository);

            loader.Load(spc.GlobalId, obj =>
            {
                var needToChange = false;

                var builder = _objectModifier.Edit(obj);

                var spcName        = ValueTextClear(spc.Name);
                var spcDesignation = ValueTextClear(spc.Designation);
                // проверка нужно ли изменять объект
                foreach (var attrObj in obj.Attributes)
                {
                    if (attrObj.Key == "name")
                    {
                        if (attrObj.Value.ToString() != spcName)
                        {
                            builder.SetAttribute(attrObj.Key, spcName);
                            needToChange = true;
                        }
                    }
                    if (attrObj.Key == "mark")
                    {
                        if (attrObj.Value.ToString() != spcDesignation)
                        {
                            builder.SetAttribute(attrObj.Key, spcDesignation);
                            needToChange = true;
                        }
                    }
                }

                // получаем xps файл из Обозревателя
                var fileFromPilot = obj.Files.FirstOrDefault(f => IsFileExtension(f.Name, ".xps"));
                var xpsFile       = spc.PreviewDocument;
                if (xpsFile != null && fileFromPilot != null)
                {
                    // md5 в нижнем регистре расчитывается и возвращается пилотом
                    var fileNameMd5 = CalculatorMd5Checksum.Go(xpsFile);
                    if (!string.IsNullOrEmpty(fileNameMd5) && fileFromPilot.Md5 != fileNameMd5)
                    {
                        builder.CreateFileSnapshot("").AddFile(xpsFile);
                        needToChange = true;
                    }
                }
                if (needToChange)
                {
                    _objectModifier.Apply();
                }
            });
        }
        private void SetDocOnMenuClick()
        {
            var loader = new ObjectLoader(_objectsRepository);

            if (_listSpec == null)
            {
                return;
            }
            if (_listSpec.Count == 0)
            {
                return;
            }
            // для объектов спецификациий формируем pdf, для спецификаций формируем xps
            // формируем вторичное представление для спецификаций
            using (var k = new KompasConverter())
            {
                k.KompasConvertToXps(_listSpec);
                foreach (var spc in _listSpec)
                {
                    k.KompasConvertToPdf(spc.ListSpcObjects);
                }
            }
            // прикрепляем xps'ки
            foreach (var spc in _listSpec)
            {
                if (spc.GlobalId == Guid.Empty || spc.PreviewDocument == null)
                {
                    continue;
                }
                loader.Load(spc.GlobalId, obj =>
                {
                    var builder = _objectModifier.Edit(obj);
                    builder.AddFile(spc.PreviewDocument);
                    _objectModifier.Apply();
                });

                foreach (var spcObject in spc.ListSpcObjects)
                {
                    if (spcObject.GlobalId != Guid.Empty && spcObject.PreviewDocument != null)
                    {
                        loader.Load(spcObject.GlobalId, obj =>
                        {
                            var builder = _objectModifier.Edit(obj);
                            builder.AddFile(spcObject.PreviewDocument);
                            _objectModifier.Apply();
                        });
                    }
                }
            }
        }
        private void CreateNewSpcObjToPilot(IDataObject parent, SpcObject spcObject)
        {
            var t = GetTypeBySectionName(spcObject.SectionName);

            if (t == null)
            {
                return;
            }
            var builder = _objectModifier.Create(parent, t);

            spcObject.GlobalId = builder.DataObject.Id;
            foreach (var attr in spcObject.Columns)
            {
                var val = attr.Value;
                if (string.IsNullOrEmpty(attr.TypeName) || string.IsNullOrEmpty(val))
                {
                    continue;
                }
                // очишаем значение от служебных символов и выражений
                val = ValueTextClear(val);
                // в качестве наименование передаётся внутренее имя (а не то которое отображается)
                if (int.TryParse(val, out var i))
                {
                    builder.SetAttribute(attr.TypeName, i);
                }
                else
                {
                    builder.SetAttribute(attr.TypeName, val);
                }
            }
            var doc = spcObject.Documents.FirstOrDefault(f => IsFileExtension(f.FileName, SOURCE_DOC_EXT));

            if (doc == null)
            {
                return;
            }

            var fileName = doc.FileName;

            string[] paths          = { fileName };
            var      storageObjects = _objectsRepository.GetStorageObjects(paths);
            var      storageObject  = storageObjects.FirstOrDefault();

            if (File.Exists(spcObject.PreviewDocument))
            {
                builder.AddFile(spcObject.PreviewDocument);
            }
            _objectModifier.Apply();

            if (storageObject == null)
            {
                return;
            }

            if (storageObject.DataObject.Id == Guid.Empty)
            {
                return;
            }

            var loader = new ObjectLoader(_objectsRepository);

            loader.Load(spcObject.GlobalId, obj =>
            {
                foreach (var relation in obj.Relations.Where(x => x.Type == ObjectRelationType.SourceFiles))
                {
                    _objectModifier.RemoveLink(obj, relation);
                }
                var relationId   = Guid.NewGuid();
                var relationName = relationId.ToString();
                const ObjectRelationType relationType = ObjectRelationType.SourceFiles;
                var selectedRelation = new Relation
                {
                    Id       = relationId,
                    Type     = relationType,
                    Name     = storageObject.DataObject.DisplayName,
                    TargetId = storageObject.DataObject.Id
                };
                var chosenRelation = new Relation
                {
                    Id       = relationId,
                    Type     = relationType,
                    Name     = relationName,
                    TargetId = builder.DataObject.Id
                };
                _objectModifier.CreateLink(selectedRelation, chosenRelation);
                _objectModifier.Apply();
            });
        }
        private void CreateNewSpcToPilot(IDataObject parent, Specification spc)
        {
            var t       = GetTypeSpecification();
            var builder = _objectModifier.Create(parent, t);

            spc.GlobalId = builder.DataObject.Id;

            builder.SetAttribute("name", spc.Name);
            builder.SetAttribute("mark", ValueTextClear(spc.Designation));
            // todo: нужен callbakc о создании или изменении объекта
            //if (File.Exists(spc.PreviewDocument))
            //{
            //    builder.AddFile(spc.PreviewDocument);
            //}
            _objectModifier.Apply();

            var loader = new ObjectLoader(_objectsRepository);

            loader.Load(spc.GlobalId, obj =>
            {
                if (!File.Exists(spc.FileName))
                {
                    return;
                }
                string[] paths     = { spc.FileName };
                var storageObjects = _objectsRepository.GetStorageObjects(paths);
                var storageObject  = storageObjects.FirstOrDefault();

                if (storageObject == null)
                {
                    return;
                }

                foreach (var relation in obj.Relations.Where(x => x.Type == ObjectRelationType.SourceFiles))
                {
                    _objectModifier.RemoveLink(obj, relation);
                }

                var relationId   = Guid.NewGuid();
                var relationName = relationId.ToString();
                const ObjectRelationType relationType = ObjectRelationType.SourceFiles;
                var selectedRelation = new Relation
                {
                    Id       = relationId,
                    Type     = relationType,
                    Name     = storageObject.DataObject.DisplayName,
                    TargetId = storageObject.DataObject.Id
                };
                var chosenRelation = new Relation
                {
                    Id       = relationId,
                    Type     = relationType,
                    Name     = relationName,
                    TargetId = spc.GlobalId
                };
                _objectModifier.CreateLink(selectedRelation, chosenRelation);
                _objectModifier.Apply();

                foreach (var spcObject in spc.ListSpcObjects)
                {
                    if (spcObject.SectionNumber == 15)
                    {
                        continue;
                    }
                    CreateNewSpcObjToPilot(obj, spcObject);
                }

                if (spc.Children == null)
                {
                    return;
                }

                foreach (var cSpc in spc.Children)
                {
                    CreateNewSpcToPilot(obj, cSpc);
                }
            });
        }