Ascon Pilot SDK

Требования

Для создания расширений к Pilot-ICE/ECM требуется один из следующих выпусков Visual Studio

Создание и настройка проекта расширения

Чтобы создать новое расширение для системы Pilot выполните следующие действия:

Для удобства отладки проекта расширения выполните следующие шаги:

Папка Development по умолчанию отсутствует. Ее необходимо создать.

При разработке множества разных расширений для удобства каждое расширение можно поместить в отдельную папку. Например, для расширения WPFExtension можно создать папку: C:\Users\<current_user>\AppData\Local\ASCON\Pilot-ICE\Development\WPFExtension\.

Подключение SDK к проекту расширения

Для подключения SDK Pilot к проекту расширения можно воспользоваться встроенным в Visual Studio механизмом распространения пакетов - NuGet Packages Manager.
Для того, чтобы подключить SDK с помощью Nuget Package Manager выполните следующие шаги:

Для того, чтобы подключить SDK вручную выполните следующие шаги:

Отладка и логирование ошибок расширений

Для ведения журнала подключений MEF в Ascon.Pilot.PilotICE.exe.config нужно дописать строчки:

<system.diagnostics>
    <sources>
        <source name="System.ComponentModel.Composition" switchValue="All">
            <listeners>
                <add name="fileListener"
                     type="System.Diagnostics.TextWriterTraceListener"
                     initializeDataReadOnlyCollection<Guid> ChildrenReadOnlyCollection<Guid> Children="composition.log" />
            </listeners>
        </source>
    </sources>
  <trace autoflush="true" indentsize="4" />
</system.diagnostics>

Содержание

Возможные типы расширений

Интерфейсы управления данными

Интерфейсы работы с данными

Интерфейсы взаимодействия с клиентом Pilot-ICE/ECM

Работа с конфигурацией атрибутов: форматирование, нумераторы, справочники

Управление общими настройками

Поиск

Объекты

Перечисления

События

Дополнительно

Возможные типы расширений

Система расширений Pilot-ICE/ECM основана на стандартном механизме расширений приложений в .NET - Managed Extensibility Framework (MEF). SDK содержит ряд экспортируемых и импортируемых интерфейсов. К экспортируемым интерфейсам относятся интерфейсы, которые описывают тип расширения. К импортируемым интерфейсам относятся интерфейсы взаимодействия с клиентом и работы с данными.

Интерфейс INewTabPage

Для того, чтобы встроить расширение в новую вкладку главного окна клиента Pilot-ICE/ECM необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK INewTabPage. Обязательно пометить класс, реализующий интерфейс INewTabPage атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace WpfExtension
{
    [Export(typeof(INewTabPage))]
    public class MainModule : INewTabPage
    {
        public void BuildNewTabPage(INewTabPageHost host)
        {
        }

        public void OnButtonClick(string name)
        {
        }
    }
}
INewTabPage.BuildNewTabPage

Метод вызывается перед тем, как будет построена вкладка Новая вкладка.

void INewTabPage.BuildNewTabPage(INewTabPageHost host);

где:

Интерфейс содержит только один метод AddButton

void INewTabPageHost.AddButton(string title, string name, string toolTip, byte[] svgIcon);

где:

INewTabPage.OnButtonClick

Метод вызывается при нажатии на кнопку, созданную расширением в методе BuildNewTabPage.

void INewTabPage.OnButtonClick(string name);

где:

Интерфейс IToolbar<TToolbarContext>

Интерфейс позволяет встраивать новые команды в панель инструментов. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IToolbar<TToolbarContext> и обязательно пометить класс, реализующий интерфейс IToolbar< TToolbarContext > атрибутом [Export].

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IToolbar<TasksViewContext>))]
    public class ToolbarSample : IToolbar<TasksViewContext>
    {
        public void Build(IToolbarBuilder builder, TasksViewContext context)
        {
             //...
        }

        public void OnToolbarItemClick(string name, TasksViewContext context)
        {
             //...
        }
    }
}

Чтобы встроить новые команды в панель инструментов вкладки Задания необходимо реализовать интерфейc IToolbar<TasksViewContext>.

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IToolbar<TasksViewContext>))]
    public class ToolbarSample : IToolbar<TasksViewContext>
    {
        ...
    }
}

Чтобы встроить новые команды в панель инструментов Обозревателя документов необходимо реализовать интерфейc IToolbar<ObjectsViewContext>

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IToolbar<ObjectsViewContext>))]
    public class ToolbarSample : IToolbar<ObjectsViewContext>
    {
        ...
    }
}

IToolbar<TasksViewContext>.Build

Метод вызывается перед построением панели инструментов.

void IToolbar<TToolbarContext>.Build(IToolbarBuilder builder, TToolbarContext context);

где:

IToolbar<TToolbarContext>.OnToolbarItemClick

Метод вызывается при нажатии на элемент панели инструментов.

void IToolbar<TToolbarContext>.OnToolbarItemClick(string name, TToolbarContext context);

где:

Интерфейс IToolbarBuilder

Интерфейс позволяет управлять элементами панели инструментов.

IToolbarBuilder.ItemNames

Свойство возвращает список уникальных имен элементов панели инструментов.

IEnumerable<string> IToolbarBuilder.ItemNames { get; }

IToolbarBuilder.Count

Свойство возвращает количество элементов панели инструментов.

int IToolbarBuilder.Count { get; }

IToolbarBuilder.AddSeparator

Метод позволяет добавить разделитель в панель инструментов.

void IToolbarBuilder.AddSeparator(int index);

где:

IToolbarBuilder.AddButtonItem

Метод позволяет добавить кнопку в панель инструментов.

IToolbarButtonItemBuilder AddButtonItem(string name, int index);

где:

Возвращает интерфейс добавления свойств кнопки IToolbarButtonItemBuilder.

IToolbarBuilder.AddMenuButtonItem

Метод позволяет добавить кнопку с выпадающим меню в панель инструментов.

IToolbarMenuButtonItemBuilder AddMenuButtonItem(string name, int index);

где:

Возвращает интерфейс добавления свойств кнопки IToolbarMenuButtonItemBuilder.

IToolbarBuilder.AddToggleButtonItem

Метод позволяет добавить кнопку-переключатель в панель инструментов.

IToolbarToggleButtonItemBuilder AddToggleButtonItem(string name, int index);

где:

Возвращает интерфейс добавления свойств кнопки IToolbarToggleButtonItemBuilder.

IToolbarBuilder.ReplaceButtonItem

Метод позволяет заменить любой элемент панели инструментов на кнопку.

IToolbarButtonItemBuilder ReplaceButtonItem(string name);

где:

Возвращает интерфейс добавления свойств кнопки IToolbarButtonItemBuilder.

IToolbarBuilder.ReplaceMenuButtonItem

Метод позволяет заменить любой элемент панели инструментов на кнопку с выподающим меню.

IToolbarMenuButtonItemBuilder ReplaceMenuButtonItem(string name);

где:

Возвращает интерфейс добавления свойств кнопки IToolbarMenuButtonItemBuilder.

IToolbarBuilder.ReplaceToggleButtonItem

Метод позволяет заменить любой элемент панели инструментов на кнопку-переключатель.

IToolbarToggleButtonItemBuilder ReplaceToggleButtonItem(string name);

где:

Возвращает интерфейс добавления свойств кнопки IToolbarToggleButtonItemBuilder.

Интерфейс IToolbarButtonItemBuilder

Интерфейс позволяет добавить свойства к элементу панели инструменотов.

IToolbarButtonItemBuilder.WithHeader

Метод позволяет добавить отображаемое в UI название.

IToolbarButtonItemBuilder WithHeader(string header);

где:

IToolbarButtonItemBuilder.WithIcon

Метод позволяет добавить иконку элементу панели инструментов. Обратите внимание, иконка должна быть в формате SVG

IToolbarButtonItemBuilder WithIcon(byte[] svgIcon);

где:

IToolbarButtonItemBuilder.WithIsEnabled

Метод позволяет задать значение доступности элемента.

IToolbarButtonItemBuilder WithIsEnabled(bool value);

IToolbarButtonItemBuilder.WithShowHeader

Метод позваляет спрятать или показать заголовок элемента. Чтобы показать элемент только в виде иконки необходимо в метод WithShowHeader передать параметр false

IToolbarButtonItemBuilder WithShowHeader(bool value);

IToolbarButtonItemBuilder.WithHint

Метод позволяет добавить подсказку к элементу панели инструментов.

IToolbarButtonItemBuilder WithHint(string hint);

где:

Интерфейс IToolbarToggleButtonItemBuilder

Интерфейс позволяет добавить свойства к кнопке-переключателю панели инструменотов. Этот интерфейс является наследником IToolbarButtonItemBuilder.

IToolbarToggleButtonItemBuilder.WithIsChecked

Метод позволяет задать состояние кнопки-переключателя.

IToolbarToggleButtonItemBuilder WithIsChecked(bool value);

Интерфейс IToolbarMenuButtonItemBuilder

Интерфейс позволяет добавить свойства к кнопке с выпадающим меню панели инструменотов. Этот интерфейс является наследником IToolbarButtonItemBuilder.

IToolbarMenuButtonItemBuilder.WithMenu

Метод позволяет добавить контекстное меню к кнопке.

IToolbarMenuButtonItemBuilder WithMenu(IToolbarItemSubmenuHandler itemSubmenuHandler);

где:

Интерфейс IToolbarItemSubmenuHandler

Интерфейс построения меню для кнопки панели инструментов. В пакет SDK уже поставляется класс реализующий данный интерфейс - ToolbarItemSubmenuHandler. Для того, чтобы построить меню необходимо унаследоваться от этого класса.

IToolbarItemSubmenuHandler.OnSubmenuRequested

Метод вызывается перед тем как появится меню у кнопки панели инструментов.

void OnSubmenuRequested(IToolbarBuilder builder);

где:

Пример построения меню для кнопки в панели инструментов:

[Export(typeof(IToolbar<TasksViewContext>))]
public class ToolbarSample : IToolbar<TasksViewContext>
{
    public void Build(IToolbarBuilder builder, TasksViewContext context)
    {
        builder.AddMenuButtonItem("tbsMenuButton", 0)
                .WithMenu(new MenuHandler())
                .WithHeader("Menu button")
                .WithHint("Menu button");
    }

    public void OnToolbarItemClick(string name, TasksViewContext context)
    {
        if (name == "MenuName")
        {
            //do somethig
        }
    }
}

public class MenuHandler : ToolbarItemSubmenuHandler
{
    public override void OnSubmenuRequested(IToolbarBuilder builder)
    {
        builder.AddButtonItem("MenuName", 0).WithHeader("item");
    }
}

Подробнее можно посмотреть в примере Ascon.Pilot.SDK.ToolbarSample, поставляемом вместе с пакетом SDK.

Интерфейс IMenu<TMenuContext>

Интерфейс позволяет встраивать новые команды в различные меню приложения в зависимости от контекста. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IMenu<TMenuContext> и обязательно пометить класс, реализующий интерфейс IMenu< TMenuContext > атрибутом [Export].

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IMenu<TasksViewContext>))]
    public class ToolbarSample : IMenu<TasksViewContext>
    {
        public void Build(IMenuBuilder builder, TasksViewContext context)
        {
             //...
        }

        public void OnMenuItemClick(string name, TasksViewContext context)
        {
             //...
        }
    }
}

Чтобы встроить новые команды в контекстное меню вкладки Задания необходимо реализовать интерфейc IMenu<TasksViewContext>.

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IMenu<TasksViewContext>))]
    public class TasksContextMenuSample : IMenu<TasksViewContext>
    {
        ...
    }
}

Чтобы встроить новые команды в контекстное меню Обозревателя документов необходимо реализовать интерфейc IMenu<ObjectsViewContext>

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IMenu<ObjectsViewContext>))]
    public class ObjectsContextMenuSample : IMenu<ObjectsViewContext>
    {
        ...
    }
}

IMenu<TMenuContext>.Build

Метод вызывается перед построением контекстного меню.

void IMenu<TMenuContext>.Build(IMenuBuilder builder, TMenuContext context);

где:

IMenu<TMenuContext>.OnMenuItemClick

Метод вызывается при нажатии на элемент меню.

void IMenu<TMenuContext>.OnMenuItemClick(string name, TMenuContext context);

где:

Интерфейс IMenuBuilder

Интерфейс позволяет управлять элементами меню.

IMenuBuilder.ItemNames

Свойство возвращает список уникальных имен элементов меню.

IEnumerable<string> IMenuBuilder.ItemNames { get; }

IMenuBuilder.Count

Свойство возвращает количество элементов меню.

int IMenuBuilder.Count { get; }

IMenuBuilder.AddSeparator

Метод позволяет добавить разделитель в меню.

void IMenuBuilder.AddSeparator(int index);

где:

IMenuBuilder.AddItem

Метод позволяет добавить пункт меню.

IMenuItemBuilder AddItem(string name, int index);

где:

Возвращает интерфейс добавления свойств пункта меню IMenuItemBuilder.

IMenuBuilder.ReplaceItem

Метод позволяет заменить любой пункт меню.

IMenuItemBuilder ReplaceItem(string name);

где:

IMenuBuilder.GetItem

Метод позволяет получить построитель пункта меню.

IMenuBuilder GetItem(string name);

где:

Возвращает интерфейс добавления пунктов меню IMenuBuilder.

Интерфейс IMenuItemBuilder

Интерфейс позволяет добавлять свойства пункту меню.

IMenuItemBuilder.WithHeader

Метод позволяет добавить отображаемое в UI название.

IMenuItemBuilder WithHeader(string header);

где:

IMenuItemBuilder.WithIcon

Метод позволяет добавить иконку. Обратите внимание, иконка должна быть в формате SVG для всех меню кроме IMenu. Иконки для меню Pilot-Storage дожны быть в формате PNG.

IMenuItemBuilder WithIcon(byte[] icon);

где:

IMenuItemBuilder.WithIsEnabled

Метод позволяет задать значение доступности элемента.

IMenuItemBuilder WithIsEnabled(bool value);

IMenuItemBuilder.WithSubmenu

Метод позволяет добавить подменю к текущему пункту меню.

IMenuBuilder WithSubmenu();

Объекты контекста для построения меню и панели инструментов

TasksViewContext

Чтобы встроить расширение в контекстное меню или панель инструментов вкладки Задания используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<TasksViewContext>))]
    public class ContextMenuSample : IMenu<TasksViewContext>
    {
        ...
    }
}
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IToolbar<TasksViewContext>))]
    public class ToolbarSample : IToolbar<TasksViewContext>
    {
        ...
    }
}

ObjectsViewContext

Чтобы встроить расширение в контекстное меню или панель инструментов Обозревателя проектов используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<ObjectsViewContext>))]
    public class ContextMenuSample : IMenu<ObjectsViewContext>
    {
        ...
    }
}
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IToolbar<ObjectsViewContext>))]
    public class ToolbarSample : IToolbar<ObjectsViewContext>
    {
        ...
    }
}

MainViewContext

Чтобы встроить расширение в главное меню приложения используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<MainViewContext>))]
    public class MenuSample : IMenu<MainViewContext>
    {
        ...
    }
}

SystemTrayContext

Чтобы встроить расширение в системное меню используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<SystemTrayContext>))]
    public class MenuSample : IMenu<SystemTrayContext>
    {
        ...
    }
}

StorageContext

Чтобы встроить расширение в контекстное меню Pilot-Storage используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<StorageContext>))]
    public class MenuSample : IMenu<StorageContext>
    {
        ...
    }
}

XpsMergerContext

Чтобы встроить расширение в панель инструментов компоновщика XPS используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IToolbar<XpsMergerContext>))]
    public class XpsMergerToolbarSample : IToolbar<XpsMergerContext>
    {
        ...
    }
}

XpsRenderContext

XpsRenderContext содержит информацию об открытом в просмотрщике документе. Чтобы встроить расширение в панель инструментов просмотрщика документов используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IToolbar<XpsRenderContext>))]
    public class XpsRenderToolbarSample : IToolbar<XpsRenderContext>
    {
        ...
    }
}

XpsRenderClickPointContext

XpsRenderClickPointContext содержит информацию об открытом в просмотрщике документе и о точке вызова контестного меню, а именно о координатах и номере страницы. Чтобы встроить расширение в контестное меню просмотрщика документов используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<XpsRenderClickPointContext>))]
    public class XpsRenderContextMenuSample : IMenu<XpsRenderClickPointContext>
    {
        ...
    }
}

GraphicLayerElementContext

Графический слой позволяет встраивать через SDK растровые изображения и блоки XAML разметки в XPS документ (см. Ascon.Pilot.SDK.GraphicLayerSample). Добавленные элементы графического слоя можно перемещать по документу и вызывать контекстное меню с командами, добавленными из плагина. Графический слой не является частью XPS документа и доступен для просмотра только в Pilot. Элементы графического слоя, помеченные как IsFloating = false, вшиваются в XPS документ во время печати или при создании запроса на подпись. Чтобы получить XPS с вшитым графическим слоем, необходимо отправить документ на печать в виртуальный принтер “Pilot XPS” или создать запросы на подпись. После этого элементы графического слоя будет невозможно перемещать по документу, вызывать контекстное меню и менять содержимое через плагин. Чтобы встроить расширение в контекстное меню графического элемента используйте этот тип контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<GraphicLayerElementContext>))]
    public class GraphicLayerContextMenuSample : IMenu<GraphicLayerElementContext>
    {
        ...
    }
}

DocumentFilesContext

Чтобы встроить расширение в контекстное меню панели файлов ECM документа используйте данный вид контекста.
Описание свойств контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<DocumentFilesContext>))]
    public class MenuSample : IMenu<DocumentFilesContext>
    {
        ...
    }
}

LinkedTasksContext

Чтобы встроить расширение в контекстное меню связанных заданий используйте данный вид контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<LinkedTasksContext>))]
    public class MenuSample : IMenu<LinkedTasksContext>
    {
        ...
    }
}

LinkedObjectsContext

Чтобы встроить расширение в контекстное меню вкладки “Связи” используйте данный вид контекста:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IMenu<LinkedObjectsContext>))]
    public class MenuSample : IMenu<LinkedObjectsContext>
    {
        ...
    }
}

IObjectChangeHandler

Интерфейс IObjectChangeHandler позволяет подписаться на изменения, сделанные пользователем. Пример использования данного интерфейса можно найти в проекте SubtreeUserStateAnuller.

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Sample
{
    [Export(typeof(IObjectChangeHandler))]
    public class AnnulHandler : IObjectChangeHandler
    {
        private readonly string _annuledUserStateId;

        [ImportingConstructor]
        public AnnulHandler(IObjectsRepository repository)
        {
            var userStates = repository.GetUserStates();
            var annuledUserState = userStates.FirstOrDefault(x => x.Name == Const.AnnuledUserState);
            if (annuledUserState != null)
                _annuledUserStateId = annuledUserState.Id.ToString();
        }

        public void OnChanged(IEnumerable<DataObjectChange> changes)
        {
            if(string.IsNullOrEmpty(_annuledUserStateId))
                return;

            foreach (var change in changes)
            {
                foreach (var attribute in change.New.Attributes)
                {
                    if (Equals(attribute.Value, _annuledUserStateId))
                    {
                        object oldValue = null;
                        change.Old?.Attributes.TryGetValue(attribute.Key, out oldValue);

                        if (!Equals(oldValue, _annuledUserStateId))
                            OnAnnuled(change.New);
                    }
                }
            }
        }

        private void OnAnnuled(IDataObject obj)
        {
            ...
        }
    }
}

IObjectChangeHandler.OnChanged

Данный метод вызывается после того, как пользователь делает какое-либо изменение. В метод OnChanged параметром передается список произошедших изменений.

Класс DataObjectChange

Представляет собой изменение над одним объектом

DataObjectChange.Old

Состояние объекта до изменения. Равно null в случае создания объекта.

DataObjectChange.New

Состояние объекта после изменения.

Устаревшие интерфейсы

Интерфейс IObjectContextMenu

Интерфейс позволяет встраивать расширение в контекстное меню обозревателя проектов. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IObjectContextMenu и обязательно пометить класс, реализующий интерфейс IObjectContextMenu атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IObjectContextMenu))]
    public class ContextMenuPlugin : IObjectContextMenu
    {
        public void BuildContextMenu(IMenuHost menuHost, IEnumerable<IDataObject> selection, bool isContext)
        {
        }

        public void OnMenuItemClick(string itemName)
        {
        }
    }
}
IObjectContextMenu.BuildContextMenu

Метод вызывается перед построением контекстного меню Обозревателя проектов.

void IObjectContextMenu.BuildContextMenu(IMenuHost menuHost, IEnumerable<IDataObject> selection, bool isContext);

где:

IObjectContextMenu.OnMenuItemClick

Метод вызывается при нажатии на пункт контекстного меню.

void IObjectContextMenu.OnMenuItemClick(string itemName);

где:

Интерфейс IMenuHost

Интерфейс обеспечивает возможность управлять пунктами меню клиента.

IMenuHost.GetItems

Метод возвращает список уникальных имен пунктов контекстного меню.

IEnumerable<string> IMenuHost.GetItems(string parentName = null);

где:

IMenuHost.AddItem

Метод позволяет добавлять в текущее меню свой пункт меню.

void IMenuHost.AddItem(string name, string displayName, byte[] svgIcon, int index);

где:

IMenuHost.AddSubItem

Метод позволяет добавлять подменю в заданный пункт меню.

void IMenuHost.AddSubItem(string parentName, string name, string displayName, byte[] svgIcon, int index);

где:

Интерфейс ITaskContextMenu

Интерфейс позволяет встроить расширение в контекстное меню обозревателя заданий. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK ITaskContextMenu и обязательно пометить класс, реализующий интерфейс ITaskContextMenu атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(ITaskContextMenu))]
    public class TaskContextMenuPlugin : ITaskContextMenu
    {
        public void BuildContextMenu(IMenuHost menuHost, IEnumerable<ITaskObject> selection)
        {
        }

        public void OnMenuItemClick(string itemName)
        {
        }
    }
}
ITaskContextMenu.BuildContextMenu

Метод вызывается перед построением контекстного меню управления заданиями.

void ITaskContextMenu.BuildContextMenu(IMenuHost menuHost, IEnumerable<ITaskObject> selection);

где:

ITaskContextMenu.OnMenuItemClick

Метод вызывается при нажатии на пункт контекстного меню.

void ITaskContextMenu.OnMenuItemClick(string itemName);

где:

Интерфейс IMainMenu

Интерфейс позволяет встроить расширение в главное меню клиента Pilot-ICE/ECM. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IMainMenu и обязательно пометить класс, реализующий интерфейс IMainMenu атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace MainMenuSample
{
    [Export(typeof(IMainMenu))]
    public class MainMenuPlugin : IMainMenu
    {
        public void BuildMenu(IMenuHost menuHost)
        {
        }

        public void OnMenuItemClick(string itemName)
        {
        }
    }
}
IMainMenu.BuildContextMenu

Метод вызывается перед построением главного меню.

void IMainMenu.BuildContextMenu(IMenuHost menuHost);

где:

IMainMenu.OnMenuItemClick

Метод вызывается при нажатии на пункт контекстного меню.

void IMainMenu.OnMenuItemClick(string itemName);

где:

Интерфейс ISystemTrayMenu

Интерфейс позволяет встроить расширение в системное меню клиента Pilot-ICE/ECM. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK ISystemTrayMenu и обязательно пометить класс, реализующий интерфейс ISystemTrayMenu атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace Ascon.Pilot.SDK.SystemTrayMenuSample
{
    [Export(typeof(ISystemTrayMenu))]
    public class SystemTrayMenuPlugin : ISystemTrayMenu
    {
        public void BuildMenu(IMenuHost menuHost)
        {
        }

        public void OnMenuItemClick(string itemName)
        {
        }
    }
}
ISystemTrayMenu.BuildContextMenu

Метод вызывается перед построением системного меню.

void ISystemTrayMenu.BuildContextMenu(IMenuHost menuHost);

где:

ISystemTrayMenu.OnMenuItemClick

Метод вызывается при нажатии на пункт системного меню.

void ISystemTrayMenu.OnMenuItemClick(string itemName);

где:

Интерфейс IStorageContextMenu

Интерфейс позволяет встраивать расширение в контекстное меню проводника Windows. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IStorageContextMenu и обязательно пометить класс, реализующий интерфейс IStorageContextMenu атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IStorageContextMenu))]
    public class ContextMenuPlugin : IStorageContextMenu
    {
        public void BuildContextMenu(IMenuHost menuHost, IEnumerable<IStorageDataObject> selection, bool isContext)
        {
        }

        public void OnMenuItemClick(string itemName)
        {
        }
    }
}
IStorageContextMenu.BuildContextMenu

Метод вызывается перед построением контекстного меню Pilot-Storage.

void IStorageContextMenu.BuildContextMenu(IMenuHost menuHost, IEnumerable<IStorageDataObject> selection);

где:

IStorageContextMenu.OnMenuItemClick

Метод вызывается при нажатии на пункт контекстного меню.

void IStorageContextMenu.OnMenuItemClick(string itemName);

где:

Интерфейс IFileHandler

Интерфейс позволяет реализовать обработку файлов (публикация, создание объектов, автоимпорт). Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IFileHandler и обязательно пометить класс, реализующий интерфейс IFileHandler атрибутом [Export]

using System.Collections.Generic;
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IFileHandler))]
    public class FileHandler : IFileHandler
    {
        public bool Handle(string inputFile, out List<string> outputFiles, FileHandlerSource source)
        {
        }
    }
}

Интерфейс IAutoimportHandler

Интерфейс позволяет реализовать обработку автоимпорта документов (печать на Pilot XPS принтер, загрузка документов в папку автоимпорта). Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IAutoimportHandler и обязательно пометить класс, реализующий интерфейс IAutoimportHandler атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IAutoimportHandler))]
    public class ContextMenuPlugin : IAutoimportHandler
    {
        public bool Handle(string filePath, string sourceFilePath, AutoimportSource autoimportSource)
        {
        }
    }
}

Интерфейс IPrintHandler

Интерфейс позволяет реализовать обработку печати документов с помощью принтера. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IPrintHandler и обязательно пометить класс, реализующий интерфейс IPrintHandler атрибутом [Export]

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ContextMenuSample
{
    [Export(typeof(IAutoimportHandler))]
    public class ContextMenuPlugin : IAutoimportHandler
    {
        public bool Handle(IPrintedDocumentInfo printTicket)
        {
        }
    }
}

Интерфейс IObjectCardHandler

Интерфейс позволяет реализовать работу с атрибутами, отображаемыми в карточке объекта. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK.IObjectCardHandler и обязательно пометить класс, реализующий интерфейс IObjectCardHandler атрибутом [Export].

Метод Handle вызывается при каждом построении карточки объекта: при показе диалогов создания и редактирования объекта, при выборе объектов, для которых отображается карточка, в Обозревателе документов, а так же в диалоге автоимпорта при выборе нового родителя для создаваемого документа или селектировании документа для замены файла. В случае, если карточка находится в режиме редактирования существующего объекта, свойство EditingObject аргумента context возвращает сам объект, атрибуты которого показаны в карточке; и null, если карточка показана для создания нового объекта.

Метод OnValueChanged вызывается при изменении пользователем значения какого-либо из отображаемых атрибутов в карточке объекта. Аргумент sender возвращает атрибут, значение которого было изменено. Аргумент args позволяет получить доступ к аргументам события: предыдущему и новому значению атрибута, а также контексту карточки объекта. modifier позволяет отреагировать на изменения и установить новое значение дополнительно одному или нескольким атрибутам. Изменения в значениях атрибутов, которые были сделаны с помощью modifier не приводят к вызовам метода OnValueChanged.

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ObjectCardHandlerSample
{
    [Export(typeof(IObjectCardHandler))]
    public class ObjectCardHandler : IObjectCardHandler
    {
        public bool Handle(IAttributeModifier modifier, ObjectCardContext context)
        {
            var isObjectModification = context.EditiedObject != null;
        }

        public bool OnValueChanged(IAttribute sender, AttributeValueChangedEventArgs args, IAttributeModifier modifier)
        {
        }
    }
}

Интерфейс INotificationsHandler

Интерфейс позволяет реализовать обработку уведомлений из диспетчера уведомлений. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK.INotificationsHandler и обязательно пометить класс, реализующий интерфейс INotificationsHandler атрибутом [Export].

Метод Handle вызывается перед каждым показом нового уведомления. Если метод вернет true, то уведомление не будет показано в стандартном диспетчере уведомлений.

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace NotificationsHandlerSample
{
    [Export(typeof(INotificationsHandler))]
    public class NotificationsHandler : INotificationsHandler
    {
        public bool Handle(INotification notification)
        {
        }
    }
}

Редактирования атрибутов в карточке IAttributeModifier

Интерфейс позволяет установить новое значения для атрибутов элемента перед тем, как они будут показаны в карточке объекта.

IAttributeModifier.SetValue

Метод позволяет задать новое значение атрибуту.

void IAttributeModifier.SetValue(string name, string value);

где:

Метод имеет несколько перегрузок:

void IAttributeModifier.SetValue(string name, string value);
void IAttributeModifier.SetValue(string name, long value);
void IAttributeModifier.SetValue(string name, double value);
void IAttributeModifier.SetValue(string name, DateTime value);
void IAttributeModifier.SetValue(string name, decimal value);

Контекст карточки ObjectCardContext

Контекст отображения карточки.

ObjectCardContext.DisplayAttributes

Поле содержит список отображаемых в карточке атрибутов. В этот список не входят сервисные атрибуты.

IEnumerable<IAttribute> ObjectCardContext.DisplayAttributes { get; }
ObjectCardContext.AttributeValues

Словарь текущих значений атрибутов карточки объекта, где ключ это имя атрибута, а значение это значение атрибута.

IDictionary<string, object> ObjectCardContext.AttributeValues { get; }
ObjectCardContext.Type

Поле содержит описание типа элемента для которого показана карточка.

IType ObjectCardContext.Type { get; }
ObjectCardContext.EditiedObject

Текущий редактируемый объект, для которого показана карточка. Null, если карточка показана для создания нового объекта.

IDataObject ObjectCardContext.EditiedObject { get; }
ObjectCardContext.Parent

Поле содержит описание родительского элемента.

IDataObject ObjectCardContext.Parent { get; }
ObjectCardContext.IsReadOnly

True, если карточка в режиме только для чтения и атрибуты недоступны для изменения.

bool ObjectCardContext.IsReadOnly { get; }

Интерфейсы управления данными

Для получения доступа к интерфейсам их необходимо передать в конструктор. Можно передавать любые из перечисленных ниже интерфейсов. При этом конструктор обязательно необходимо пометить атрибутом [ImportingConstructor].

[Export(typeof(IObjectContextMenu))]
public class ModifyObjectsPlugin : IObjectContextMenu
{
     private readonly IObjectModifier _modifier;
     private readonly Repository _repository;

     [ImportingConstructor]
     public ModifyObjectsPlugin(IObjectModifier modifier, IObjectsRepository repository)
     {
         _modifier = modifier;
         _repository = repository;
     }
}

Интерфейс IObjectsRepository

Интерфейс позволяет получить доступ к элементам, типам элементов и организационной структуры. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IObjectsRepository.GetCurrentPerson

Метод позволяет получить информацию о текущем пользователе, вошедшем в систему.

IPerson IObjectsRepository.GetCurrentPerson();

Возвращает объект типа IPerson.

IObjectsRepository.GetOrganisationUnit

Метод позволяет получить информацию об организационной единице.

IOrganisationUnit IObjectsRepository.GetOrganisationUnit(int id);

где:

Возвращает объект типа IOrganisationUnit.

IObjectsRepository.GetOrganisationUnits

Метод позволяет получить список организационных единиц.

IEnumerable<IOrganisationUnit> IObjectsRepository.GetOrganisationUnits();

где:

IObjectsRepository.GetPeople

Метод позволяет получить список всех пользователей.

IEnumerable<IPerson> IObjectsRepository.GetPeople();
IObjectsRepository.GetPerson

Метод позволяет получить информацию о пользователе по идентификатору.

IPerson IObjectsRepository.GetPerson(int id);

где:

IObjectsRepository.GetType

Метод позволяет получить информацию о типе элемента по идентификатору или по имени.

IType IObjectsRepository.GetType(int id);

где:

IType IObjectsRepository.GetType(string name);

где:

IObjectsRepository.GetTypes

Метод позволяет получить список всех типов.

IEnumerable<IType> IObjectsRepository.GetTypes();
IObjectsRepository.SubscribeObjects

Метод предназначен для получения элементов по их идентификаторам. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных элементов. Все запрошенные элементы будут загружены в методе OnNext.

IObservable<IDataObject> IObjectsRepository.SubscribeObjects(IEnumerable<Guid> ids);

где:

Пример:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ObjectsSample
{
    [Export(typeof(IDataPlugin))]
    public class ObjectsSamplePlugin : IDataPlugin, IObserver<IDataObject>
    {
        private readonly IObjectsRepository _repository;
        private readonly List<IDataObject> _elements;

        [ImportingConstructor]
        public ObjectsSamplePlugin(IObjectsRepository repository)
        {
            _repository = repository;
            _elements = new List<IDataObject>();
            //Получить корневой элемент
            _repository.SubscribeObjects(new[] { SystemObjectIds.RootObjectId }).Subscribe(this);
        }

        public void OnNext(IDataObject value)
        {
            _elements.Clear();
            if (!_elements.Exists(e => e.Id == value.Id))
                _elements.Add(value);
        }

        public void OnError(Exception error)
        {
        }

        public void OnCompleted()
        {
        }
    }
}

В данном примере описан сценарий получения элементов асинхронно с использованием метода SubscribeObjects. В данном подходе при реализации интерфейса IObserver<IDataObject> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext реализовано сохранение запрошенных элементов для дальнейшего использования.

IObjectsRepository.SubscribeOrganisationUnits

Метод предназначен для подписки на изменения организационных единиц (должности и подразделения). Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных объектов. Все запрошенные объекты будут загружены в методе OnNext.

IObservable<IOrganisationUnit> IObjectsRepository.SubscribeOrganisationUnits();

Пример:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ObjectsSample
{IOrganisationUnit.Title
    [Export(typeof(IDataPlugin))]
    public class ObjectsSamplePlugin : IDataPlugin, IObserver<IOrganisationUnit>
    {
        [ImportingConstructor]
        public ObjectsSamplePlugin(IObjectsRepository repository)
        {
            repository.SubscribeOrganisationUnits().Subscribe(this);
        }

        public void OnNext(IOrganisationUnit value)
        {
            //TODO update organization unit
        }

        public void OnError(Exception error)
        {
        }

        public void OnCompleted()
        {
        }
    }
}

В данном примере описан сценарий обновления организационной единицы с использованием метода SubscribeOrganisationUnits. В данном подходе при реализации интерфейса IObserver<IOrganisationUnit> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление организационной единицы.

IObjectsRepository.SubscribePeople

Метод предназначен для подписки на изменения информации о пользователях. Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных объектов. Все запрошенные объекты будут загружены в методе OnNext.

IObservable<IPerson> IObjectsRepository.SubscribePeople();

Пример:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ObjectsSample
{
    [Export(typeof(IDataPlugin))]
    public class ObjectsSamplePlugin : IDataPlugin, IObserver<IPerson>
    {
        [ImportingConstructor]
        public ObjectsSamplePlugin(IObjectsRepository repository)
        {
            repository.SubscribePeople().Subscribe(this);
        }

        public void OnNext(IPerson value)
        {
            //TODO update person info
        }

        public void OnError(Exception error)
        {
        }

        public void OnCompleted()
        {
        }
    }
}

В данном примере описан сценарий обновления информации о пользователе с использованием метода SubscribePeople. В данном подходе при реализации интерфейса IObserver<IPerson> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление организационной единицы.

IObjectsRepository.SubscribeTypes

Метод предназначен для подписки на изменения описания типов элементов. Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных типов. Все запрошенные типы будут загружены в методе OnNext.

IObservable<IType> IObjectsRepository.SubscribeTypes();

Пример:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace ObjectsSample
{
    [Export(typeof(IDataPlugin))]
    public class ObjectsSamplePlugin : IDataPlugin, IObserver<IType>
    {
        [ImportingConstructor]
        public ObjectsSamplePlugin(IObjectsRepository repository)
        {
            repository.SubscribeTypes().Subscribe(this);
        }

        public void OnNext(IType value)
        {
            //TODO update element type info
        }

        public void OnError(Exception error)
        {
        }

        public void OnCompleted()
        {
        }
    }
}

В данном примере описан сценарий обновления информации о типе элемента с использованием метода SubscribeTypes. В данном подходе при реализации интерфейса IObserver<IType> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление описания типа.

IObjectsRepository.SubscribeTasks

Метод предназначен для получения заданий по их идентификаторам. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных элементов. Все запрошенные элементы будут загружены в методе OnNext.

IObservable<ITaskObject> SubscribeTasks(IEnumerable<Guid> ids);

где:

Пример:

using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;

namespace TaskSample
{
    [Export(typeof(IDataPlugin))]
    public class ObjectsSamplePlugin : IDataPlugin, IObserver<ITaskObject>
    {
        private readonly IObjectsRepository _repository;
        private readonly List<ITaskObject> _tasks;

        [ImportingConstructor]
        public ObjectsSamplePlugin(IObjectsRepository repository)
        {
            _repository = repository;
            _tasks = new List<IDataObject>();
            _repository.SubscribeTasks(new[] { id1, id2, id3 }).Subscribe(this);
        }

        public void OnNext(IDataObject value)
        {
            _tasks.Clear();
            if (!_tasks.Exists(e => e.Id == value.Id))
                _tasks.Add(value);
        }

        public void OnError(Exception error)
        {
        }

        public void OnCompleted()
        {
        }
    }
}

В данном примере описан сценарий получения заданий асинхронно с использованием метода SubscribeTasks. В данном подходе при реализации интерфейса IObserver<ITaskObject> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext реализовано сохранение запрошенных элементов для дальнейшего использования.

IObjectsRepository.SubscribeWorkflow

Метод предназначен для получения рабочего процесса. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных элементов. Все запрошенные элементы будут загружены в методе OnNext.

IObservable<IWorkflowObject> SubscribeWorkflow(IEnumerable<Guid> ids);

где:

IObjectsRepository.SubscribeStageObjects

Метод предназначен для получения этапов рабочего процесса. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных элементов. Все запрошенные элементы будут загружены в методе OnNext.

IObservable<IStageObject> SubscribeStageObjects(IEnumerable<Guid> ids);

где:

IObjectsRepository.SubscribeTaskMessages

Метод предназначен для получения переписки по заданию. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных элементов. Все запрошенные элементы будут загружены в методе OnNext.

IObservable<ITaskMessage> SubscribeTaskMessages(IEnumerable<Guid> ids);

где:

IObjectsRepository.GetUserStates

Метод предназначен для получения списка всех пользовательских состояний, зарегистрированных в базе.

IObjectsRepository.GetCurrentAccess

Метод предназначен для получения информации о доступе пользователя к определенному объекту.

AccessLevel GetCurrentAccess(Guid objectId, int personId);

где:

Интерфейс IObjectModifier

Интерфейс предназначен для создания, изменения и удаление элементов. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IObjectModifier.Create

Метод позволяет создать новый элемент заданного типа.

IObjectBuilder IObjectModifier.Create(IDataObject parent, IType type);

где:

Метод возвращает объект типа IObjectBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства. Подробнее смотри интерфейс IObjectBuilder

IObjectModifier.Edit

Метод позволяет отредактировать заданный элемент.

IObjectBuilder IObjectModifier.Edit(IDataObject object);

где:

Метод возвращает объект типа IObjectBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства. Подробнее смотри интерфейс IObjectBuilder

IObjectModifier.Move

Метод позволяет переместить элемент из текущего родительского в другой.

void IObjectModifier.Move(IDataObject object, IDataObject newParent);

где:

IObjectModifier.Delete

Метод позволяет удалить элемент в корзину.

void IObjectModifier.Delete(IDataObject object);

где:

IObjectModifier.DeleteById

Метод позволяет удалить элемент в корзину.

void IObjectModifier.DeleteById(Guid objectId);

где:

IObjectModifier.ChangeState

Метод позволяет изменить статус элемента.

void IObjectModifier.ChangeState(IDataObject @object, ObjectState state);

где:

Метод позволяет связать два элемента выбранной связью.

void IObjectModifier.CreateLink(IRelation relation1, IRelation relation2);

где:

Пример:

using Ascon.Pilot.SDK;

class ObjectsSample
{
    private IObjectModifier _modifier;

    {...}

    private void CreateSourceFileLink(ObjectsViewContext context)
    {
        var object1 = context.SelectedObjects.First();
        var object2 = context.SelectedObjects.Last();

        //Create relations
        var relationId = Guid.NewGuid();
        var relationName = "RelationName";
        var relationType = ObjectRelationType.Custom;

        var relation1 = new Relation
        {
            Id = relationId,
            Type = relationType,
            Name = relationName,
            TargetId = object2.Id
        };

        var relation2 = new Relation
        {
            Id = relationId,
            Type = relationType,
            Name = relationName,
            TargetId = object1.Id
        };

        _modifier.CreateLink(relation1, relation2);
        _modifier.Apply();
    }

    {...}
}

Метод позволяет удалить связь между объектами.

void IObjectModifier.RemoveLink(IDataObject obj, IRelation relation);

где:

Пример:

using Ascon.Pilot.SDK;

class ObjectsSample
{
    private IObjectModifier _modifier;

    {...}

    private void RemoveSourceFileLink(ObjectsViewContext context)
    {
        var selected = context.SelectedObjects.First();

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

    {...}
}
IObjectModifier.Apply

Применить все изменения сделанные над элементами. Без вызова этого метода изменения не будут применены.

void IObjectModifier.Apply();

Интерфейс IObjectBuilder

Интерфейс обеспечивает возможность наполнения или редактирования элементов атрибутами и дополнительными свойствами.

IObjectBuilder.SetAttribute

Метод задает или изменяет атрибут с заданным именем.

IObjectBuilder SetAttribute(string name, string value);

где:

Метод имеет несколько перегрузок:
IObjectBuilder SetAttribute(string name, string value); - для установки строкового значения атрибута.
IObjectBuilder SetAttribute(string name, int value); - для установки целочисленного значения атрибута.
IObjectBuilder SetAttribute(string name, long value); - для установки целочисленного 64-разрядного значения атрибута.
IObjectBuilder SetAttribute(string name, DateTime value); - для установки значения атрибута времени.
IObjectBuilder SetAttribute(string name, double value); - для установки цифрового значения атрибута с плавающей точкой.
IObjectBuilder SetAttribute(string name, decimal value); - для установки денежного значения атрибута.
IObjectBuilder SetAttribute(string name, Guid value); - для установки значения атрибута идентификатора Guid.

IObjectBuilder.RemoveAttribute

Метод удаляет атрибут с заданным именем.

IObjectBuilder RemoveAttribute(string name);

где:

IObjectBuilder.DataObject

Поле возвращает пустую болванку редактируемого элемента с заполненным идентификатором элемента и идентификатором родительского элемента.

IDataObject IObjectBuilder.DataObject { get; }
IObjectBuilder.AddFile

Метод добавляет файл к заданному элементу.

void IObjectBuilder.AddFile(string path);

где:

Этот метод имеет перегрузку:

void IObjectBuilder.AddFile(string name, Stream stream, DateTime creationTime, DateTime lastAccessTime, DateTime lastWriteTime);

где:

IObjectBuilder.AddOrReplaceFile

Метод добавляет или заменяет файл к заданному элементу.

void IObjectBuilder.AddOrReplaceFile(string name, Stream stream, IFile file, DateTime creationTime, DateTime lastAccessTime, DateTime lastWriteTime);

где:

IObjectBuilder.RemoveFile

Метод удаляет файл из текущего снимка файлов по идентификатору.

IObjectBuilder.SetAccessRights

Метод добавляет директивные права на элемент.

IObjectBuilder SetAccessRights(int positionId, AccessLevel level, DateTime validThrough, bool isInherited);

где:

IObjectBuilder.RemoveAccessRights

Метод удаляет директивные права на элемент.

IObjectBuilder RemoveAccessRights(int positionId);

где:

IObjectBuilder.MakeSecret

Метод позволяет сделать элемент скрытым.

IObjectBuilder MakeSecret();
IObjectBuilder.MakePublic

Метод позволяет сделать элемент общедоступным.

IObjectBuilder MakePublic();
IObjectBuilder.CreateFileSnapshot

Метод позволяет создать снимок файлов и указать причину. Текущие файлы будут перемещены в историю.

IObjectBuilder CreateFileSnapshot(string reason);

где:

IObjectBuilder.MakeSnapshotActual

Метод позволяет сделать выбранный снимок файлов текущим.

IObjectBuilder MakeSnapshotActual(string reason, IFilesSnapshot snapshot);

где:

IObjectBuilder.AddSubscriber

Метод позволяет подписаться на изменения элемента.

IObjectBuilder AddSubscriber(int personId);

где:

IObjectBuilder.RemoveSubscriber

Метод позволяет отписаться от изменений элемента.

IObjectBuilder RemoveSubscriber(int personId);

где:

IObjectBuilder.SetIsDeleted

Метод позволяет задать элементу состояние удалено безвозвратно.

IObjectBuilder SetIsDeleted(bool isDeleted);

где:

IObjectBuilder.SetIsInRecycleBin

Метод позволяет задать элементу состояние удалено корзину.

IObjectBuilder SetIsInRecycleBin(bool isInRecycleBin);

где:

IObjectBuilder.SetParent

Метод позволяет задать элементу нового родителя.

IObjectBuilder SetParent(Guid parentId);

где:

IObjectBuilder.SetType

Метод позволяет задать элементу тип.

IObjectBuilder SetType(IType type);

где:

ВНИМАНИЕ!
Рекомендуется использовать этот метод только для восстановления безвозвратно удаленных объектов. В остальных случаях это может привести к неработоспособности системы.

IObjectBuilder.SetCreator

Метод позволяет задать создателя элемента.

IObjectBuilder SetCreator(int creatorId);

где:

IObjectBuilder.Lock

Метод позволяет заблокировать объект для изменений текущим пользователем.

IObjectBuilder Lock();
IObjectBuilder.Unlock

Метод позволяет разблокировать объект.

IObjectBuilder Unlock();

Интерфейс ITaskModifier

Интерфейс предназначен для создания и изменения заданий. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

ITaskModifier.NewWorkflow

Метод создает новый рабочий процесс для заданий. Один рабочий процесс может содержать множество этапов.

IWorkflowChangeBuilder NewWorkflow();

Метод возвращает объект типа IWorkflowChangeBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства.

ITaskModifier.NewStage

Метод создает новый этап в рабочем процессе. Один этап может содержать множество заданий.

IStageChangeBuilder NewStage(IWorkflowObject workflow);

где:

ITaskModifier.NewTask

Метод позволяет создать новое задание или несколько заданий для разных исполнителей.

IEnumerable<ITaskBuilder> NewTask(string title, string description, IEnumerable<int> executors, DateTime deadLine);

где:

Метод возвращает список объектов IEnumerable<ITaskBuilder>, который позволяет заполнить элементы атрибутами и задать дополнительные свойства для каждого задания. Подробнее смотри ITaskBuilder.

IEnumerable<ITaskBuilder> NewTask(string title, string description, IEnumerable<int> executors, DateTime deadLine, IEnumerable<Guid> attachments);

где:

ITaskBuilder NewTask(IWorkflowObject workflow, IStageObject stage, int executorPosition);

где:

ITaskModifier.NewAgreementTask

Метод позволяет создать новое задание на согласование.

ITaskBuilder NewAgreementTask(IWorkflowObject workflow, IStageObject stage, int executorPosition);

где:

ITaskModifier.EditTask

Метод позволяет отредактировать задание.

ITaskBuilder EditTask(ITaskObject task);

где:

Метод возвращает объект типа ITaskBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства. При вызове этого метода создается версия задания и сохраняется в истории. Изменения вступают в силу только после вызова метода Apply

ITaskModifier.EditTaskById

Метод изменения задания по идентификатору объекта задания.

ITaskBuilder EditTaskById(Guid taskId);

где:

Метод возвращает объект типа ITaskBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства. При вызове этого метода создается версия задания и сохраняется в истории. Изменения вступают в силу только после вызова метода Apply

ITaskModifier.EditWorkflow

Метод изменения рабочего процесса заданий.

IWorkflowChangeBuilder EditWorkflow(IWorkflowObject workflow);

где:

ITaskModifier.EditStage

Метод изменения этапа заданий.

IStageChangeBuilder EditStage(IStageObject stage);

где:

ITaskModifier.Apply

Применить все изменения сделанные над заданием. Без вызова этого метода изменения не будут применены.

void ITaskModifier.Apply();

Интерфейс IWorkflowChangeBuilder

Интерфейс обеспечивает возможность наполнения или редактирования рабочего процесса заданий атрибутами и дополнительными свойствами.

IWorkflowChangeBuilder.SetTitle

Метод задает или изменяет заголовок рабочего процесса. Этот заголовок распространится на все этапы и задания рабочего процесса.

IWorkflowChangeBuilder SetTitle(string title);

где:

IWorkflowChangeBuilder.SetDescription

Метод задает или изменяет описание рабочего процесса. Это описание распространится на все этапы и задания рабочего процесса.

IWorkflowChangeBuilder SetDescription(string description);

где:

IWorkflowChangeBuilder.SetInitiatorAttachments

Метод задает или изменяет вложения инициатора рабочего процесса. Все вложения так же будут доступны во всех этапах и заданиях рабочего процесса.

IWorkflowChangeBuilder SetInitiatorAttachments(IEnumerable<Guid> attachments);

где:

IWorkflowChangeBuilder.WorkflowObject

Поле содержит описание объекта рабочего процесса. Подробнее см. IWorkflowObject

IWorkflowObject WorkflowObject { get; }

Интерфейс IStageChangeBuilder

Интерфейс обеспечивает возможность наполнения или редактирования этапа заданий атрибутами и дополнительными свойствами.

IStageChangeBuilder.SetStageOrder

Метод задает или изменяет порядок выполнения этапа.

IStageChangeBuilder SetStageOrder(int order);

где:

IStageChangeBuilder.StageObject

Поле содержит описание объекта тапа. Подробнее см. IStageObject

IStageObject StageObject { get; }

Интерфейс ITaskBuilder

Интерфейс обеспечивает возможность наполнения или редактирования заданий атрибутами и дополнительными свойствами.

ITaskBuilder.SetAttribute

Метод задает или изменяет атрибут с заданным именем.

ITaskBuilder SetAttribute(string name, string value);

где:

Метод имеет несколько перегрузок:
ITaskBuilder SetAttribute(string name, string value);
ITaskBuilder SetAttribute(string name, int value);
ITaskBuilder SetAttribute(string name, long value);
ITaskBuilder SetAttribute(string name, DateTime value);
ITaskBuilder SetAttribute(string name, double value);
ITaskBuilder SetAttribute(string name, decimal value);

ITaskBuilder.RemoveAttribute

Метод удаляет атрибут с заданным именем.

ITaskBuilder RemoveAttribute(string name);

где:

ITaskBuilder.SetTitle

Метод задает новую тему задания.

ITaskBuilder SetTitle(string title);

где:

ITaskBuilder.SetDescription

Метод задает новый текст задания.

ITaskBuilder SetDescription(string description);

где:

ITaskBuilder.SetState

Метод изменяет состояние задания.

ITaskBuilder SetState(State state);

где:

ITaskBuilder.SetExecutor

Метод изменяет исполнителя задания.

ITaskBuilder SetExecutor(IPosition position);

где:

ITaskBuilder.SetDeadline

Метод изменяет срок окончания работ по заданию.

ITaskBuilder SetDeadline(DateTime deadlineDate);

где:

ITaskBuilder.SetRelativeDeadline

Задает относительный срок окончания работ по заданию. Применим к заданиям второго и последующих этапов. Метод вычисляет количество дней между сегодняшним днем и датой, переданной в качестве аргумента. Это значение будет использованно для вычисления срока окончания работ по заданию нового этапа в момент завершения предыдущего этапа согласования: дата, когда завершился предыдущий этап, плюс определенное ранее количество дней. Если задать относительный срок окончания работ для задания первого этапа, такое задание не получит срока вообще, потому что нет предыдущего этапа. Отменить установку относительного срока задания можно передав значение DateTime.MaxValue в качестве аргумента.

ITaskBuilder SetRelativeDeadline(DateTime relativeDeadline);

где:

ITaskBuilder.SetInitiatorAttachments

Метод изменяет набор вложенных инициатором элементов в задание.

ITaskBuilder SetInitiatorAttachments(IEnumerable<Guid> attachments);

где:

ITaskBuilder.SetExecutorAttachments

Метод изменяет набор вложенных исполнителем элементов в задание.

ITaskBuilder SetExecutorAttachments(IEnumerable<Guid> attachments);

где:

ITaskBuilder.SetExecutorRole

Метод позволяет задать роль исполнителя задания при согласовании документов.

ITaskBuilder SetExecutorRole(string role);

где:

ITaskBuilder.SetValidationPhase

Метод задает значение, которое указывает будет ли задание иметь состояние “на проверке”.

ITaskBuilder SetValidationPhase(bool withValidation);

где:

ITaskBuilder.SetAuditors

Метод позволяет задать аудиторов задания.

ITaskBuilder SetAuditors(IEnumerable<int> positionIds);

где:

ITaskBuilder.SetTags

Метод позволяет задать тэги.

ITaskBuilder SetTags(IEnumerable<string> tags);

где:

ITaskBuilder.SetKind

Метод позволяет задать тип задания.

ITaskBuilder SetKind(TaskKind kind);

где:

ITaskBuilder.TaskObject

Текущий объект задания.

ITaskObject TaskObject { get; }

Интерфейс IFileProvider

Интерфейс обеспечивает работу с телами файлов. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IFileProvider.Exists

Метод показывает существует-ли тело файла с заданным идентификатором файла.

bool IFileProvider.Exists(Guid fileId);

где:

IFileProvider.IsFull

Метод показывает полностью-ли загружен файл с сервера.

bool IFileProvider.IsFull(Guid fileId);

где:

IFileProvider.OpenRead

Метод открывает заданный файл на чтение. Загружает тело файла, если файл не был загружен с сервера.

Stream IFileProvider.OpenRead(IFile file);

где:

Интерфейсы работы с данными

Интерфейс IXpsDigitalSigner

Интерфейс позволяет подписывать запросы на подпись в XPS документах. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IXpsDigitalSigner.SignDocumentWithCertificate

Метод подписывает документ выбранным сертификатом.

void IFileProvider.SignDocumentWithCertificate(Guid documentId, IEnumerable<int> positionIds, X509Certificate2 certificate);

где:

Интерфейс IXpsRender

Интерфейс позволяет рендерить XPS документы в растровое изображение. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IXpsRender.RenderXpsToBitmap

Метод возвращает список отрендеренных страниц в формате Stream.

IEnumerable<Stream> IFileProvider.RenderXpsToBitmap(Stream xpsStream, double quality = 1.0);

где:

Интерфейс IFileSaver

Интерфейс позволяет сохранять документы (повторяет логику работы команды “Отправить -> На диск”). Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IFileSaver.SaveFile

Метод сохраняет документ по указанному пути, возвращает все сохраненные файлы.

IList<string> IFileSaver.SaveFile(IDataObject dataObject, string outputFilePath);

где:

Интерфейс IXpsViewer

Интерфейс позволяет получить номер текущей страницы просмотрщика документов и произвести увеличение/уменьшение масштаба на элементе графического слоя или аннотации. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IXpsViewer.CurrentPageNumber

Свойство возвращает номер открытой в просмотрщике страницы (от 0 до N-1)

IXpsViewer.ZoomToElement

Метод производит увеличение/уменьшение масштаба на элементе графического слоя или аннотации по его идентификатору

void ZoomToElement(Guid id, double scale = 1);

где:

IXpsViewer.SubscribeLeftMouseClick

Метод позволяет добавить обработчик клика левой кнопки мыши.

void SubscribeLeftMouseClick(IMouseLeftClickListener leftMouseClickListener);

где:

IXpsViewer.UnsubscribeLeftMouseClick

Метод позволяет удалить обработчик клика левой кнопки мыши.

Интерфейс IXpsMerger

Интерфейс позволяет сохранять скомпонованный XPS документ по указанному пути. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IXpsMerger.SaveMergedXps

Метод сохраняет скомпонованный документ по пути и производит подписку на событие завершения сохранения

void SaveMergedXps(string filepath, IXpsMergerSaveListener saveListener);

где:

Интерфейс IXpsMergerSaveListener

Интерфейс позволяет обработать завершение сохранения скомпонованного XPS документа. Для использования необходимо создать класс, унаследованный от абстрактного XpsMergerSaveListener, и передать его аргументом в метод IXpsMerger.SaveMergedXps

IXpsMergerSaveListener.OnSaveCompleted

Метод вызывается при завершении сохранения документа

void OnSaveCompleted(string filepath);

где:

Интерфейс IGraphicLayerElement

Интерфейс представляет элемент графического слоя на XPS документах. Каждый графический элемент представлен в виде 2 файлов, хранящихся в объекте.
Первый файл содержит описательную часть графического элемента, а именно xml-сериализованный объект, унаследованный от IGraphicLayerElement. Имя первого файла должно быть создано по правилу GraphicLayerElementConstants.GRAPHIC_LAYER_ELEMENT + ElementId, где

Второй файл представляет содержимое графического элемента (XAML или BITMAP). Имя второго файла должно быть создано по правилу GraphicLayerElementConstants.GRAPHIC_LAYER_ELEMENT_CONTENT + ContentId, где

IGraphicLayerElement.ElementId

Идентификатор графического элемента

IGraphicLayerElement.ContentId

Идентификатор содержимого графического элемента

IGraphicLayerElement.OffsetY

Отступ по вертикали в точках

IGraphicLayerElement.OffsetX

Отступ по горизонтали в точках

IGraphicLayerElement.Scale

Масштаб по X и Y, по-умолчанию (1,1).

IGraphicLayerElement.Angle

Угол поворота.

IGraphicLayerElement.PositionId

Идентификатор пользователя, у которого есть права на редактирования элемента (если 0, то редактировать могут все).

IGraphicLayerElement.PageNumber

Номер страницы, на которую наложен графический элемент (от 0).

IGraphicLayerElement.VerticalAlignment

Вертикальное выравнивание.

IGraphicLayerElement.HorizontalAlignment

Горизонтальное выравнивание.

IGraphicLayerElement.ContentType

Тип содержимого графического элемента (GraphicLayerElementConstants.XAML или GraphicLayerElementConstants.BITMAP)

IGraphicLayerElement.IsFloating

Определяет, является ли графический элемент плавающим (будет ли он встраиваться в документ при создании запроса на подпись или отправке на диск). Если true, то графический элемент никогда не будет вшит и всегда будет доступен для перемещения и удаления.

Класс GraphicLayerElementConstants

Класс с константами для работы с графическим слоем

GraphicLayerElementConstants.GRAPHIC_LAYER_ELEMENT

Константа для обозначения графического элемента.

GraphicLayerElementConstants.GRAPHIC_LAYER_ELEMENT_CONTENT

Константа для обозначения содержимого графического элемента.

GraphicLayerElementConstants.XAML

Константа для обозначения содержимого XAML.

GraphicLayerElementConstants.BITMAP

Константа для обозначения содержимого растровой графики.

Интерфейсы взаимодействия с клиентом Pilot-ICE/ECM

Для получения доступа к интерфейсам их необходимо передать в конструктор. Можно передавать любые из перечисленных ниже интерфейсов. При этом конструктор обязательно необходимо пометить атрибутом [ImportingConstructor].

[Export(typeof(IObjectContextMenu))]
public class ModifyObjectsPlugin : IObjectContextMenu
{
     private readonly ITabServiceProvider _tabServiceProvider;

     [ImportingConstructor]
     public ModifyObjectsPlugin(ITabServiceProvider tabServiceProvider)
     {
         _tabServiceProvider = tabServiceProvider;
     }
}

Интерфейс ITabServiceProvider

Интерфейс обеспечивает работу с вкладками главного окна клиента Pilot-ICE/ECM. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

ITabServiceProvider.GetTabPageTitles

Метод возвращает список заголовков открытых вкладок.

IEnumerable<string> ITabServiceProvider.GetTabPageTitles();
ITabServiceProvider.GetActiveTabPageTitle

Метод возвращает заголовок активной вкладки.

string ITabServiceProvider.GetActiveTabPageTitle();
ITabServiceProvider.ActivateTabPage

Вызов метода активирует вкладку с заданным заголовком.

void ITabServiceProvider.ActivateTabPage(string title);

где:

ITabServiceProvider.OpenNewTabPage

Метод открывает вкладку Новая вкладка в текущей панели вкладок или в новой.

void ITabServiceProvider.OpenNewTabPage(bool isInOtherPane = false);

где:

ITabServiceProvider.OpenTabPage

Метод открывает новую вкладку с заданным контентом в текущей панели вкладок или в новой.

void ITabServiceProvider.OpenTabPage(string title, FrameworkElement view, bool isInOtherPane = false);

где:

ITabServiceProvider.CloseTabPage

Метод закрывает первую открытую вкладку с заданным заголовком.

void ITabServiceProvider.CloseTabPage(string title);

где:

ITabServiceProvider.UpdateTabPageContent

Метод обновляет контент в открытой вкладке с заданным заголовком.

void ITabServiceProvider.UpdateTabPageContent(string oldTitle, string newTitle, FrameworkElement view);

где:

Интерфейс IPilotDialogService

Интерфейс обеспечивает работу со встроенными диалоговыми окнами клиента Pilot-ICE/ECM. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IPilotDialogService.ShowSharingSettingsDialog

Метод показывает диалог управления общим доступом к элементам.

void IPilotDialogService.ShowSharingSettingsDialog(IEnumerable<Guid> objectIds);

где:

IPilotDialogService.ShowPositionSelectorDialog

Метод показывает диалог выбора пользователей и должностей.

IEnumerable<IOrganisationUnit> IPilotDialogService.ShowPositionSelectorDialog();
IPilotDialogService.ShowOrganisationUnitSelectorDialog

Метод показывает диалог выбора организационных едениц. Отличается от ShowPositionSelectorDialog возможностью выбора групп.

IPilotDialogService.ShowDocumentsSelectorDialog

Метод показывает диалог выбора элементов из обозревателя проектов.

IEnumerable<IDataObject> IPilotDialogService.ShowDocumentsSelectorDialog();

Метод возвращает список выбранных элементов.

IPilotDialogService.ShowReferenceBookDialog

Метод показывает диалог выбора элементов из справочика

IEnumerable<IDataObject> IPilotDialogService.ShowReferenceBookDialog(string referenceBookConfiguration, string serializationId = null, IPilotDialogOptions options = null);

где:

Интерфейс IEventAggregator

Интерфейс обеспечивает возможность подписываться на разные события возникающие в клиенте Pilot-ICE/ECM. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].

IEventAggregator.Subscribe

Метод подписывает заданного подписчика на события.

void IEventAggregator.Subscribe(object subscriber);

где:

Пример:

using Ascon.Pilot.SDK;

namespace EventSample
{
    class EventSubscriber : IHandle<UnloadedEventArgs>, IHandle<LoadedEventArgs>
    {
        private readonly IEventAggregator _eventAggregator;

        public EventSubscriber(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
            _eventAggregator.Subscribe(this);
        }

        public void Handle(UnloadedEventArgs message)
        {
            //TODO do something when unloading extension
        }

        public void Handle(LoadedEventArgs message)
        {
            //TODO do something when loading extension
        }
    }
}

В примере показано как можно подписаться на события загрузки и выгрузки расширения.

IEventAggregator.Unsubscribe

Метод отписывается от ранее подписанных событий;

void IEventAggregator.Unsubscribe(object subscriber);

где:

Интерфейс IConnectionStateProvider

Интерфейс для получения информации о состоянии подключения к Pilot-Server

IConnectionStateProvider.IsOnline

Метод, определяющий, установлено ли соединение клиента с Pilot-Server

bool IsOnline();
IConnectionStateProvider.Subscribe

Подписка на изменение состояния подключения клиента с Pilot-Server

IObservable<bool> Subscribe();

Работа с конфигурацией атрибутов: форматирование, нумераторы, справочники

Каждый из пользовательских атрибутов может быть дополнен конфигурацией. Конфигурация представляет собой текстовое поле, с помощью которого могут быть заданы специальные настройки атрибута:

Для работы с конфигурацией атрибута можно использовать интерфейс IAttributeFormatParser, который предоставляет методы для десериализации настроек, хранящихся в строке конфигурации атрибута. Более полную информацию о форматировании атрибутов, нумераторах и справочниках смотри в справке к Pilot-ICE.

Пример Ascon.Pilot.SDK.ObjectsSample использует этот интерфейс для построения карточки объекта, включающей в себя отображение атрибутов, которым назначен нумератор, и атрибутов типа справочник; а так же для построения отоброжаемого имени объектов.

Интерфейс IAttributeFormatParser

Позволяет работать с конфигурайией атрибутов: получать формат отображения атрибутов, а так же десериализованное описание нумераторов и справочников.

Для получения доступа к интерфейсу поиска его необходимо передать в конструктор. При этом конструктор обязательно необходимо пометить атрибутом [ImportingConstructor].

string AttributesFormat(string format, Dictionary attributes)

Осуществляет форматирование значениий атрибутов объекта в соответсвии с указанным форматом. Например, используется для получения отображаемого имени объекта. Строка форматирования может быть получена с помощью метода GetAttributeFormat, который описан ниже.

string objAttributesDisplayString = _parser.AttributesFormat(format, objectAttributes);

где:

string GetAttributeFormat(string configuration)

Возвращает строку форматирования атрибута на основе конфигурации атрибута.

string format = _parser.GetAttributeFormat(configuration);

где:

string GetAttributeFormatCulture(string configuration)

Возвращает имя культуры, которая должна использоваться, при форматировании значения атрибута.

string culture = _parser.GetAttributeFormatCulture(configuration);

где:

bool TryParseNumeratorDeclaration(string declaration, out IEnumerable numeratorInfo)

Метод для получения десериализованного описания нумераторов из строки конфигурации атрибута. Возвращает true, если строка конфигурации содержит описание нумераторов и его удалось успешно десериализовать; false в обратном случае.

IEnumerable<INumeratorInfo> numeratorsCollection;
bool success = _parser.TryParseNumeratorDeclaration(configuration, out numeratorsCollection);

где:

string PreviewNumeratorFormat(string configuration, Dictionary values);

Применяет нумератор к текущему состоянию объекта и возвращает строку, которая может использоваться для предпросмотра значения атрибута, которое будет назначено сервером при создании объекта и применения к нему нумератора. Используется для визуализации значения атрибута в карточке создания нового объекта, которое будет назначено сервером.

string attributeValuePreview = _parser.PreviewNumeratorFormat(configuration, objectAttributes);

где:

объекта;

bool TryParseReferenceBookConfiguration(string configuration, out IReferenceBookConfiguration referenceBookConfiguration);

Метод для получения десериализованного описания справочника из строки конфигурации атрибута. Возвращает true, если строка конфигурации содержит описание справочника и его удалось успешно десериализовать; false в обратном случае.

IReferenceBookConfiguration referenceBookConfiguration;
bool success = _parser.TryParseReferenceBookConfiguration(configuration, out referenceBookConfiguration);

где:

Интерфейс INumeratorInfo

Описание нумератора.

string DisplayName { get; }

Отображаемое имя нумератора.

string Configuration { get; }

Конфигурация нумератора, используется как параметр метода PreviewNumeratorFormat, для получения предпросмотра значния атрибута, к которому применяется нумератор.

Интерфейс IReferenceBookConfiguration

Конфигурация справочника, которая описывает его тип, поведение и правила формирования списка его элементов.

RefBookKind Kind { get; }

Свойство типа RefBookKind, определяет тип справочника.

IEnumerable<string> Values { get; }

Свойство, которое определяет коллекцию элементов справочника, если свойство Kind имеет значение RefBookKind.Enum.

Guid Source { get; }

Идентификатор объекта базы данных, дочерние объкты которого являются элементами справочника, если свойство Kind имеет значение RefBookKind.Object.

IEnumerable<string> ElementsTypes { get; }

Список имен типов, из объектов которого должны формироваться элементы справочника, если свойство Kind имеет значение RefBookKind.Object. Если имен список пуст, то в формировании элементов справочника учавствуют дочерние элементы любого типа.

bool IsEditable { get; }

Определяет, имеет ли пользователь возможность вручную отредактировать значение выбранного из элементов справочника. Если свойство имеет значение false, то редактор атрибута не допускает ручной ввод значений, и значение атрибута может быть лишь выбрано из списка. В противном случае, пользователь может вводить значение атрибута вручную, а список элементов справочника используется как список значений для быстрого заполнения.

string StringFormat { get; }

Строка форматирования, которая должна использоваться для формирования значения атрибута, при выборе элемента справочника.

Перечисление RefBookKind

Указывает тип справочника, то есть один из возможных вариантов заполнения списка возможных значений справочника.

RefBookKind.Enum;

Справочник, элементами которого является предопределенный набор строковых значений. Смотри свойство Values интерфеса IReferenceBookConfiguration.

RefBookKind.Object;

Справочник, элементами которого являются дочерние элементы определенного объекта в базе данных. Этот объект определяется идентификатором, значение которого возвращается свойством Source интерфеса IReferenceBookConfiguration.

RefBookKind.OrgUnit;

Справочник, который предоставляет выбор элементов оргструктуры базы данных.

RefBookKind.Type;

Справочник, который предоставляет выбор типов из базы данных.

Перечисление RefBookEditorType

Указывает тип редактора, который должен использоваться для редактирования значения атрибута, для которого назначен справочник.

RefBookEditorType.Dialog;

Редактор атрибута должен представлять собой поле ввода с кнопкой, которая вызывает новый диалог для выбора значений из элементов справочника.

RefBookEditorType.ComboBox;

В качестве редактора значения атрибута должен использоваться комбобокс, выпадающий список которого состоит из элементов справочника.

Управление общими настройками

Общие настройки представляют собой персонифицированное хранилище типа “ключ-значение”, где ключ - название настройки, а значение - ее значение. Список ключей системных настроек описан в классе SystemSettingsKeys. Данные хранилища общих настроек синхронизируются с сервером. Значения настроек могут быть записаны как для конкретного пользователя, так и для элемента организационной структуры, причем настройки, записанные для конкретного пользователя, имеют приоритет перед настройками для элемента организационной структуры, в который входит должность, на которой состоит пользователь.

Интерфейс ISettingsFeature

Интерфейс ISettingsFeature позволяет зарегистрировать в диалоге общих настроек новый ключ. Класс, реализующий данный интерфейс, должен быть помечен атрибутом [Export(typeof(ISettingsFeature))].

string Key { get; }

Ключ настройки.

string Title { get; }

Отображаемое имя настройки.

FrameworkElement Editor { get; }

Визуальный элемент, используемый для редактирования настроек данного типа.

void SetValueProvider(ISettingValueProvider settingValueProvider)

Данный метод вызывается со стороны приложения перед показом Editor и позволяет получить объект ISettingValueProvider для редактирования значения настройки.

Интерфейс IPersonalSettings

Импортируемый интерфейс, позволяющий получать и менять значения настроек текущего пользователя.

IObservable> SubscribeSetting(string key)

Подписка на значение настройки по передаваемому ключу.

void ChangeSettingValue(string key, string value)

Изменение значения настройки по ключу.

Интерфейс ISettingValueProvider

Позволяет получать и устанавливать значение настройки для диалога общих настроек.

string GetValue()

Получение текущего значения настройки.

void SetValue(string value)

Установка значения настройки.

Класс SystemSettingsKeys

Класс SystemSettingsKeys описывает ключи системных общих настроек.

string FavoritesFeatureKey { get; }

Список избранного в обозревавателе документов.

string PilotStorageDriveLetter { get; }

Предпочтительная буква монтирования диска Pilot-Storage.

string AgreementRolesFeatureKey { get; }

Список ролей для согласования.

string MountedItemsList { get; }

Список смонтированных проектов.

string AutoBlockingFileExtensionsFeatureKey { get; }

Список расширений файлов на Pilot-Storage, для которых будет работать функционал автоблокировки.

string DocsAutoFillFeatureKey { get; }

Настройки автозаполнения полей файлов.

Поиск

Поисковая система Pilot предоставляет богатый язык запросов. Построение запросов осуществляется с помощью конструкторов запросов (IQueryBuilder). Поиск можно осуществлять как по полям объектов так и по ключевому слову или части слова (фразы). Основными элементами языка запросов являются так называемые “условия поиска“.
Чтобы осуществить поиск необходимо:

Конструкторы запросов имеют три ключевых метода для построения поисковых запросов:

Чтобы задать поиск по определенному полю объекта используйте условия поиска для объектов ObjectFields и конструктор запросов для объектов (см GetObjectQueryBuilder)
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.TypeId.BeAnyOf(16,17));

Чтобы задать поиск по определенному полю задания используйте условия поиска для заданий TaskFields и конструктор запросов для заданий (см GetTaskQueryBuilder)
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.State.Be(State.InProgress));

Для любых объектов в базе Pilot предусмотрен поиск по ключевым словам. Такой поиск осуществляется с помощью “условия поиска AllText”.
Поиск по ключевому слову:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.AllText.Be("Проект*"));

Поиск по ключевым словам поддерживает одиночный (?) и многократный (*) подстановочные символы.

Для поиска с использованием одного символа подстановки используется служебный символ ?. Например, чтобы найти слова “test” и “text” вы можете использовать следующую запись:

ObjectFields.AllText.Be("te?t")

Для поиска с использованием многократного символа подстановки используется служебный символ *. Например, чтобы найти слова “test”, “tests” или “tester” вы можете использовать следующую запись:

ObjectFields.AllText.Be("test*")

Также есть возможность использования символа многократной подстановки в середине или в начале слова. Например:

ObjectFields.AllText.Be("te*t")

ВНИМАНИЕ!
Не рекомендуется использовать подстановочные символы в начале слова. Это приведет к полному перебору поисковых индексов, что может привести к сильным задержкам выдачи результата.

Интерфейс ISearchService

Интерфейс работы с поисковыми запросами.
Для получения доступа к интерфейсу поиска его необходимо добавить как параметр в конструктор класса плагина. При этом конструктор обязательно необходимо пометить атрибутом [ImportingConstructor].

Чтобы осуществить поиск объектов необходимо предварительно составить поисковый запрос с помощью выбранного конструктора запроса. После задания условий в конструкторе запросов с помощью условий поиска, его необходимо передать как параметр в метод Search. Существует четыре типа конструкторов поисковых запросов:

IObservable< ISearchResult> Search(IQueryBuilder query)

С помощью этого метода осуществляется поиск объектов по заданным критериям в конструкторе запросов. Результатом вызова этого метода является поставщик push-уведомлений результатов поиска cм. ISearchResult.

IObservable<ISearchResult> Search(IQueryBuilder query);

IQueryBuilder GetObjectQueryBuilder()

Метод получения предварительно сконфигурированного конструктора запросов для пользовательских объектов.
В результат поисковой выдачи не попадают:

IQueryBuilder ISearchService.GetObjectQueryBuilder();

IQueryBuilder GetTaskQueryBuilder()

Метод получения предварительно сконфигурированного конструктора запросов для заданий.
В результат поисковой выдачи не попадают:

IQueryBuilder ISearchService.GetTaskQueryBuilder();

IQueryBuilder GetEmptyQueryBuilder()

Метод получения простого конструктора запросов. Это универсальный конструктор запросов без предварительных условий. Этот конструктор можно использовать для поиска любых объектов в базе, включая объекты системных типов, например файл или папка на Pilot-Storage.

IQueryBuilder ISearchService.GetEmptyQueryBuilder();

ISearchService.GetSmartFolderQueryBuilder

Метод получения конструктора строки запроса для умной папки.

ISmartFolderQueryBuilder ISearchService.GetSmartFolderQueryBuilder();

Интерфейс ISmartFolderQueryBuilder

Интерфейс создания поискового запроса умной папки.

ISmartFolderQueryBuilder.WithSearchMode

Задает режим поиска (по атрибутам или по файлам)

ISmartFolderQueryBuilder WithSearchMode(SearchMode searchMode);

где:

ISmartFolderQueryBuilder.WithKeyword

Задает ключевое слово для поиска

ISmartFolderQueryBuilder WithKeyword(string keyword);

где:

ISmartFolderQueryBuilder.WithQuotedKeyword

Задает ключевое слово для точного поиска.

ISmartFolderQueryBuilder WithQuotedKeyword(string keyword);

где:

ISmartFolderQueryBuilder.WithType

Задает тип элемента для поиска.

ISmartFolderQueryBuilder WithType(int typeId);

где:

ISmartFolderQueryBuilder.WithTypes

Задает список типов элементов для поиска.

ISmartFolderQueryBuilder WithTypes(IEnumerable<int> typeIds);

где:

ISmartFolderQueryBuilder.WithState

Задает состояние элементов для поиска.

ISmartFolderQueryBuilder WithState(ObjectState state);

где:

ISmartFolderQueryBuilder.WithAuthor

Задает автора (создателя) элемента для поиска.

ISmartFolderQueryBuilder WithAuthor(int authorId);

где:

ISmartFolderQueryBuilder.WithAuthors

Задает авторов (создателей) элементов для поиска.

ISmartFolderQueryBuilder WithAuthors(IEnumerable<int> authorIds);

где:

ISmartFolderQueryBuilder.WithCreatedToday

Задает время создания элементов “сегодня” для поиска.

ISmartFolderQueryBuilder WithCreatedToday();
ISmartFolderQueryBuilder.WithCreatedYesterday

Задает время создания элементов “вчера” для поиска.

ISmartFolderQueryBuilder WithCreatedYesterday();
ISmartFolderQueryBuilder.WithCreatedThisWeek

Задает время создания элементов “на этой неделе” для поиска.

ISmartFolderQueryBuilder WithCreatedThisWeek();
ISmartFolderQueryBuilder.WithCreatedLastWeek

Задает время создания элементов “на прошлой неделе” для поиска.

ISmartFolderQueryBuilder WithCreatedLastWeek();
ISmartFolderQueryBuilder.WithCreatedThisMonth

Задает время создания элементов “в этом месяце” для поиска.

ISmartFolderQueryBuilder WithCreatedThisMonth();
ISmartFolderQueryBuilder.WithCreatedLastMonth

Задает время создания элементов “в прошлом месяце” для поиска.

ISmartFolderQueryBuilder WithCreatedLastMonth();
ISmartFolderQueryBuilder.WithCreatedThisYear

Задает время создания элементов “в этом году” для поиска.

ISmartFolderQueryBuilder WithCreatedLastYear();
ISmartFolderQueryBuilder.WithCreatedLastYear

Задает время создания элементов “в прошлом году” для поиска.

ISmartFolderQueryBuilder WithCreatedThisYear();
ISmartFolderQueryBuilder.WithCreatedInRange

Задает диапазон дат создания элементов для поиска.

ISmartFolderQueryBuilder WithCreatedInRange(DateTime fromUtc, DateTime toUtc);

где:

ISmartFolderQueryBuilder.ToString

Преобразует поисковый запрос в строку для последующего сохранения ее в соответствующем атрибуте умной папки

string ToString();

Пример создания “умной папки”
using Ascon.Pilot.SDK;

namespace SmartFolderSample
{
    [Export(typeof(IDataPlugin))]
    public class SmartFolderSample : IDataPlugin
    {
        private readonly ISearchService _searchService;
        private readonly IObjectsRepository _repository;
        private readonly IObjectModifier _modifier;

        [ImportingConstructor]
        public SmartFolderSample(ISearchService searchService, IObjectsRepository repository, IObjectModifier modifier)
        {
            _searchService = searchService;
            _repository = repository;
            _modifier = modifier;
        }

        public void CreateSmartFolder(IDataObject parent)
        {
            _modifier.Create(parent, GetSmartFolderType())
                     .SetAttribute(SystemAttributeNames.SMART_FOLDER_TITLE, "title")
                     .SetAttribute(SystemAttributeNames.SEARCH_CRITERIA, GetSmartFolderSearchString())
                     .SetAttribute(SystemAttributeNames.SEARCH_CONTEXT_OBJECT_ID, parent.Id.ToString());
            _modifier.Apply();
        }

        private string GetSmartFolderSearchString()
        {
            var searchString = string.Empty;
            var type = _repository.GetType("Project");
            if (type == null)
                return searchString;

            var builder = _searchService.GetSmartFolderQueryBuilder();
            builder.WithSearchMode(SearchMode.Attributes)
                   .WithType(type.Id)
                   .WithKeyword("5000").ToString();
            searchString = builder.ToString();
            return searchString;
        }

        private IType GetSmartFolderType()
        {
            return _repository.GetType(SystemTypeNames.SMART_FOLDER);
        }
    }
}

Интерфейс IQueryBuilder

Универсальный интерфейс конструктора поисковых запросов.

IQueryBuilder.Must

Используйте этот метод для условий поиска, которые ДОЛЖНЫ быть в объектах.

IQueryBuilder Must(ISearchTerm term);

где:

IQueryBuilder.MustAnyOf

Используйте этот метод, если какое-либо из указанных условий поиска ДОЛЖНО быть в объектах.

IQueryBuilder MustAnyOf(params ISearchTerm[] terms);

где:

IQueryBuilder.MustNot

Используйте этот метод, если условие поиска НЕ ДОЛЖНО быть в объектах.

IQueryBuilder MustNot(ISearchTerm term);

где:

IQueryBuilder.SortBy

Используйте этот метод для того, чтобы установить поле и направление сортировки результатов поиска.

IQueryBuilder SortBy(INamedField field, ListSortDirection direction);

где:

IQueryBuilder.MaxResults

Используйте этот метод для того, чтобы ограничить количество результатов. Значение по умолчанию 250.

IQueryBuilder MaxResults(int result);

где:

IQueryBuilder.InContext

Используйте этот метод для того, чтобы установить контекст поиска.

IQueryBuilder InContext(Guid id);

где:

Интерфейс ISearchResult

Интерфейс предоставляет доступ к результатам поиска.

ISearchResult.Result

Список идентификаторов найденных объектов.

IEnumerable<Guid> Result { get; }
ISearchResult.Total

Общее количество найденных объектов. Так как поисковая выдача ограничена с помощью IQueryBuilder.MaxResults, в общем случае значение Total может быть больше количества результатов Result. Если требуется найти больше объектов, установите большее значение IQueryBuilder.MaxResults и перезапустите поиск.

long Total { get; }
ISearchResult.Kind

Источник результата поиска.

SearchResultKind Kind { get; }
Перечисление SearchResultKind

Источник результата поиска.

Результаты были получены из локального хранилища клиента.

SearchResultKind.Local

Результаты были получены с удаленного сервера.

SearchResultKind.Remote

Предустановленные условия поиска

Условия поиска для объектов ObjectFields

ObjectFields.Id

Используйте это условие, чтобы задать поиск по определенному идентификатору объекта.
Например:

var id  = new Guid("01A1028B-79BC-45C7-8A59-6191E8ADFE39");
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.Id.Be(id));
ObjectFields.ParentId

Используйте это условие, чтобы задать поиск по определенному идентификатору родительского объекта.
Например:

var id  = new Guid("01A1028B-79BC-45C7-8A59-6191E8ADFE39");
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ParentId.Be(id));
ObjectFields.TypeId

Используйте это условие, чтобы задать поиск по типу объекта.
Например: зададим условие поиска для объектов типа 16 ИЛИ 17

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.TypeId.BeAnyOf(16,17));
ObjectFields.ObjectState

Используйте это условие, чтобы задать поиск по состоянию объекта.
Например: зададим условие поиска для объектов в состоянии заморозка

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf((int)ObjectState.Frozen));

Дргугой пример, поиск объектов, находящихся в корзине:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf((int)ObjectState.InRecycleBin));

Или наоборот: фильтрация объектов, помещенных в корзину, которые не должны отображаться в результатах поиска:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf(new {(int)ObjectState.Frozen, (int)ObjectState.Alive}));
ObjectFields.CreatorId

Используйте это условие, чтобы задать поиск по создателю объекта.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.CreatorId.Be(25));
ObjectFields.CreatedDate

Используйте это условие, чтобы задать поиск по дате создания объектов. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetObjectQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(ObjectFields.CreatedDate.BeInRange(fromDate, toDate));
ObjectFields.IsSecret

Используйте это условие, чтобы искать скрытые или общедоступные объекты.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.IsSecret.Be(true));
ObjectFields.LockState

Используйте это условие, чтобы искать заблокированные объекты.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.LockState.Be(LockState.Accepted));
ObjectFields.LockPersonId

Используйте это условие, чтобы искать объекты заблокированные определенным пользователем.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.LockPersonId.Be(32));
ObjectFields.AllText

Используйте это условие, чтобы искать объекты по слову или части слова. Поиск осуществляется по атрибутам объекта.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.AllText.Be("Проект*"));

Условия поиска для заданий TaskFields

TaskFields.Id

Используйте это условие, чтобы искать задания по определенному идентификатору.
Например:

var taskId = new Guid("90242DF7-00A7-40E2-8424-071FFB2D8190");
var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.Id.Be(taskId));
TaskFields.InitiatorPositionId

Используйте это условие, чтобы искать задания выданные пользователем.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.InitiatorPositionId.Be(42));

где: 42 - идентификатор должности пользователя.

TaskFields.ExecutorPositionId

Используйте это условие, чтобы искать задания полученные пользователем.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.ExecutorPositionId.Be(42));

где: 42 - идентификатор должности пользователя.

TaskFields.CreatedDate

Используйте это условие, чтобы искать задания созданные в заданный промежуток времени. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.CreatedDate.BeInRange(fromDate, toDate));
TaskFields.State

Используйте это условие, чтобы искать задания, находящиеся в определенных состояниях.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.State.BeAnyOf(State.Assigned, State.Completed, State.InProgress));
TaskFields.Title

Используйте это условие, чтобы искать задания с заданной темой.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.Title.ContainsAll("Задание на *", "КЖ"));
TaskFields.Description

Используйте это условие, чтобы искать задания с заданным описанием.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.Description.Be("Выполнить *"));
TaskFields.DeadlineDate

Используйте это условие, чтобы искать задания с заданным сроком выполнения. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.DeadlineDate.BeInRange(fromDate, toDate));
TaskFields.DateOfAssignment

Используйте это условие, чтобы искать задания выданные в заданный диапазон дат. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.DateOfAssignment.BeInRange(fromDate, toDate));
TaskFields.DateOfCompletion

Используйте это условие, чтобы искать задания выполненные в заданный диапазон дат. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.DateOfCompletion.BeInRange(fromDate, toDate));
TaskFields.DateOfStart

Используйте это условие, чтобы искать задания взятые в работу в заданный диапазон дат. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.DateOfStart.BeInRange(fromDate, toDate));
TaskFields.Kind

Используйте это условие, чтобы искать по типу задания. Задание на согласование или ознакомление.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.Kind.Be(TaskKind.Agreement));
TaskFields.AllText

Используйте это условие, чтобы искать задания по слову или части слова. Поиск осуществляется по атрибутам задания.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.AllText.Be("Задание 1-*"));
TaskFields.TaskIsVersion

Используйте это условие, чтобы искать версии задания или исключить их.
Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.TaskIsVersion.Be(true));

Условия поиска по произвольным атрибутам AttributeFields

AttributeFields.String

Используйте это условие, чтобы искать объекты по атрибуту типа строка.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.String("AttributeName").Be("Искать*"));
AttributeFields.DateTime

Используйте это условие, чтобы искать объекты по атрибуту типа дата. Дату и время необходимо задавать в формате UTC.
Например:

var builder = _searchService.GetObjectQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(AttributeFields.DateTime("AttributeName").BeInRange(fromDate, toDate));
AttributeFields.Double

Используйте это условие, чтобы искать объекты по атрибуту типа вещественное число.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.Double("AttributeName").Be(2.2));
AttributeFields.Integer

Используйте это условие, чтобы искать объекты по атрибуту типа целое число.
Например:

var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.Integer("AttributeName").Be(2));

Общие условия поиска

Условие Be

Используйте это условие для точного поиска значения.

ISearchTerm Be(T value);

Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.ExecutorPositionId.Be(42));
Условие BeAnyOf

Поиск значений удовлетворяющих одному из условий.

ISearchTerm BeAnyOf(params T[] values);

Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.ExecutorPositionId.BeAnyOf(45,42,15));
Условие BeInRange

Поиск значений находящихся в заданном диапазоне значений.

ISearchTerm BeInRange(T from, T to);

Например:

var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.DateOfCompletion.BeInRange(fromDate, toDate));
Условие ContainsAll

Поиск значений соответствующих всем заданным условиям.

ISearchTerm ContainsAll(params T[] values);

Например:

var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.AllText.ContainsAll("задание", "согласование"));

Пример создания поискового запроса
using Ascon.Pilot.SDK;

namespace SearchSample
{
    [Export(typeof(IDataPlugin))]
    public class SearchSamplePlugin : IDataPlugin, IObserver<ISearchResult>
    {
        private readonly IObjectsRepository _repository;
        private long _total;

        [ImportingConstructor]
        public SearchSamplePlugin(ISearchService searchService, IObjectsRepository repository)
        {
            _repository = repository;
            var currentPerson = repository.GetCurrentPerson();
            var fromDate = new DateTime(2016,1,1);
            var to = new DateTime(2016,12,31);
            //Построим запрос на поиск объектов:
            // - созданные текущим пользователем
            // - объекты только типа "Project"
            // - созданные в 2016 году
            // - сортировать результаты по дате создания. По возрастанию.
            // - вывести только 50 результатов
            var qBuilder = searchService.GetObjectQueryBuilder();
            qBuilder.Must(ObjectFields.CreatorId.Be(currentPerson.Id))
                    .Must(ObjectFields.TypeId.Be(GetProjectTypeId()))
                    .Must(ObjectFields.CreatedDate.BeInRange(fromDate, to))
                    .SortBy(ObjectFields.CreatedDate, ListSortDirection.Ascending)
                    .MaxResults(50);

            searchService.Search(qBuilder).Subscribe(this);
        }

        public void OnNext(ISearchResult value)
        {
            var items = value.Result;
            _total = value.Total;
            _repository.SubscribeObjects(items).Subscribe(SomeObjectsLoader);
        }

        public void OnError(Exception error)
        {
        }

        public void OnCompleted()
        {
        }

        private int GetProjectTypeId()
        {
            //Сработает только если в конфигурации базы данных присутствует тип с именем Project
            var type = _repository.GetType("Project");
            if (type == null)
                throw new Exception("Type Project not found");

            return type.Id;
        }
    }
}

Интерфейсы объектов

К данным интерфейсам относятся объекты, которые содержат информацию об элементах, пользователях, заданиях и т.п.

Система взаимодействия расширений с клиентом Pilot построена на механизме доменов приложений. Код из одного домена не может получить прямой доступ к коду или данным другого. Взаимодействие между доменами обеспечивается исключительно посредством специальных прокси-классы. Все объекты, которые получает расширение являются прокси-классами, у которых есть время жизни. Все объекты-классы имеют время жизни по умолчанию равное 2 минуты. Если обратиться к прокси-классу после истечения времени его жизни, то бросится исключение типа System.Runtime.Remoting.RemotingException.

Например:
System.Runtime.Remoting.RemotingException: Объект ‘76e7cd41_2cd2_4e89_9c03_fae752ec4d59
/zb_uualy_cm6kwizjlentfdl_3.rem’ был отключен или не существует на сервере.

Чтобы избежать появления этого исключения необходимо обернуть прокси-классы в так называемые классы-обертки. Например класс-обертка для прокси-класса реализующего интерфейс IDataObject может выглядеть так:

    //Класс-обертка для IDataObject
    class DataObject
    {
        public DataObject(IDataObject dataObject)
        {
            //Запоминаем нужные для работы свойства dataObject
            Id = dataObject.Id;
            ParentId = dataObject.ParentId;
            Title = dataObject.DisplayName;
            Icon = dataObject.Type.SvgIcon;
            Sort = dataObject.Type.Sort;
            Type = new DataType(dataObject.Type);
            Children = new ReadOnlyCollection<Guid>(dataObject.Children);
            Attributes = new Dictionary<string, object>(dataObject.Attributes);
            Access = new ReadOnlyCollection<AccessRecord>(dataObject.Access2);
            Files = new ReadOnlyCollection<DataFile>(dataObject.Files.Select(f => new DataFile(f)).ToList());
            IsSecret = dataObject.IsSecret;
            Relations = new ReadOnlyCollection<Relation>(obj.Relations.Select(r => new Relation(r)));
        }

        public Guid Id { get; private set; }
        public Guid ParentId { get; private set; }
        public string Title { get; private set; }
        public byte[] Icon { get; private set; }
        public int Sort { get; private set; }
        public DataType Type { get; }
        public ReadOnlyCollection<Guid> Children { get; private set; }
        public IDictionary<string, object> Attributes { get; private set; }
        public ReadOnlyCollection<AccessRecord> Access { get; }
        public ReadOnlyCollection<DataFile> Files { get; private set; }
        public bool IsSecret { get; private set; }
        public ReadOnlyCollection<Relation> Relations { get; }
    }

    //Класс-обертка для IType
    public class DataType
    {
        public DataType(IType type)
        {
            //Запомним нужные свойства type
            Id = type.Id;
            IsMountable = type.IsMountable;
            Attributes = new ReadOnlyCollection<AttributeWrapper>(type.Attributes.Select(x => new AttributeWrapper(x)).ToList());
            Title = type.Title;
            Name = type.Name;
            IsService = type.IsService;
            Kind = type.Kind;
            Sort = type.Sort;
            Children = new ReadOnlyCollection<int>(type.Children);
            HasFiles = type.HasFiles;
            Icon = type.SvgIcon;
        }

        public int Id { get; private set; }
        public bool IsMountable { get; private set; }
        public ReadOnlyCollection<AttributeWrapper> Attributes { get; private set; }
        public string Title { get; private set; }
        public string Name { get; private set; }
        public bool IsService { get; private set; }
        public TypeKind Kind { get; private set; }
        public int Sort { get; private set; }
        public ReadOnlyCollection<int> Children { get; private set; }
        public bool HasFiles { get; private set; }
        public byte[] Icon { get; private set; }
    }

    //Класс-обертка для IAttribute
    class AttributeWrapper
    {
        public AttributeWrapper(IAttribute attribute)
        {
            Name = attribute.Name;
            Title = attribute.Title;
            IsObligatory = attribute.IsObligatory;
            DisplaySortOrder = attribute.DisplaySortOrder;
            ShowInObjectsExplorer = attribute.ShowInObjectsExplorer;
            IsService = attribute.IsService;
            Configuration = attribute.Configuration;
            DisplayHeight = attribute.DisplayHeight;
            Type = attribute.Type;
        }

        public string Name { get; private set; }
        public string Title { get; private set; }
        public AttributeType Type { get; private set; }
        public bool IsObligatory { get; private set; }
        public int DisplaySortOrder { get; private set; }
        public bool ShowInObjectsExplorer { get; private set; }
        public bool IsService { get; private set; }
        public string Configuration { get; private set; }
        public int DisplayHeight { get; private set; }
    }

    //. . . и т.д.

Данный пример применим, если необходимо полностью скопировать свойства прокси-класса. Если для работы расширения достаточно запомнить только идентификатор полученного объекта, то в создании класса-обертки нет необходимости.

Интерфейс IDataObject

Интерфейс предназначен для просмотра информации об элементе.

IDataObject.Id

Поле Id содержит идентификатор элемента.

Guid IDataObject.Id { get; }
IDataObject.ParentId

Поле ParentId содержит идентификатор родительского элемента.

Guid IDataObject.ParentIdId { get; }
IDataObject.Created

Поле Created содержит дату создания элемента.

DateTime IDataObject.Created { get; }
IDataObject.Attributes

Поле Attributes содержит словарь атрибутов элемента. Где значением атрибута могут быть следующие типы: string, int, DateTime и double.

IDictionary<string, object> IDataObject.Attributes { get; }
IDataObject.DisplayName

Поле DisplayName содержит отображаемое имя элемента, собранное из доступных атрибутов по определенному правилу.

string IDataObject.DisplayName { get; }
IDataObject.Type

Поле Type содержит тип элемента.

IType IDataObject.Type { get; }
IDataObject.Creator

Поле Creator содержит информацию о пользователе, создавшем текущий элемент.

IPerson IDataObject.Creator { get; }
IDataObject.Children

Поле Children содержит список идентификаторов дочерних элементов.

ReadOnlyCollection<Guid> IDataObject.Children { get; }
IDataObject.Relations

Поле Relations содержит список всех связей элемента с другими элементами.

ReadOnlyCollection<IRelation> IDataObject.Relations { get; }
IDataObject.RelatedSourceFiles

Поле RelatedSourceFiles содержит список идентификаторов элементов, связанных с текущим связью типа “Исходный файл”

ReadOnlyCollection<Guid> IDataObject.RelatedSourceFiles { get; }
IDataObject.RelatedTaskInitiatorAttachments

Поле RelatedTaskInitiatorAttachments содержит список идентификаторов элементов, связанных с текущим связью типа “Вложение в задание от инициатора”

ReadOnlyCollection<Guid> IDataObject.RelatedTaskInitiatorAttachments { get; }
IDataObject.RelatedTaskMessageAttachments

Поле RelatedTaskMessageAttachments содержит список идентификаторов элементов, связанных с текущим связью типа “Вложение в сообщение по заданию”

ReadOnlyCollection<Guid> IDataObject.RelatedTaskMessageAttachments { get; }
IDataObject.TypesByChildren

С помощью поле TypesByChildren можно определить тип ребенка элемента не загружая его.

IDictionary<Guid, int> IDataObject.TypesByChildren { get; }
IDataObject.State

Поле State содержит информацию о текущем статусе элемента. Загружен элемент в кеш клиента или нет. Подробнее см. DataState

DataState IDataObject.State { get; }
IDataObject.ObjectStateInfo

Поле ObjectStateInfo содержит информацию о текущем статусе ObjectState объекта и информацию о том, кто и когда совершил последнее изменения статуса. Подробнее см. DataState.

DataState IDataObject.State { get; }
IDataObject.SynchronizationState

Поле SynchronizationState содержит информацию о текущем статусе синхронизации элемента с сервером. Подробнее см. SynchronizationState

SynchronizationState IDataObject.SynchronizationState { get; }
IDataObject.Files

Поле Files содержит список доступных файлов элемента. Содержит только информацию о файле. Тело файла необходимо загружать отдельно. Подробнее см. IFileProvider

ReadOnlyCollection<IFile> IDataObject.Files { get; }
IDataObject.Access2

Поле Access2 содержит информацию о текущих правах доступа к этому элементу. Подробнее см IAccessRecord.

ReadOnlyCollection<IAccessRecord> IDataObject.Access2 { get; }
IDataObject.IsSecret

Поле IsSecret содержит значение указывающее является ли этот элемент скрытым.

 bool IDataObject.IsSecret { get; }
IDataObject.ActualFileSnapshot

Поле ActualFileSnapshot содержит информацию о текущих фалах элемента. Подробнее см. IFilesSnapshot.

 IFilesSnapshot IDataObject.ActualFileSnapshot { get; }
IDataObject.PreviousFileSnapshots

Поле PreviousFileSnapshots содержит информацию об изменениях файлов элемента. Это история изменения файлов элемента. Подробнее см. IFilesSnapshot.

 ReadOnlyCollection<IFilesSnapshot> IDataObject.PreviousFileSnapshots { get; }
IDataObject.Subscribers

Поле Subscribers содержит список пользователей, которые подписаны на изменения этого элемента.

 ReadOnlyCollection<int> IDataObject.Subscribers { get; }
IDataObject.ToTaskObject

Используется для конвертации текущего экземпляра IDataObject в экземпляр ITaskObject. Если текущий экземпляр IDataObject не является объектом типа задание, метод возвращает null.

IDataObject ToDataObject();

Интерфейс ITaskObject

Интерфейс предназначен для просмотра информации о задании.

ITaskObject.Id

Поле Id содержит идентификатор задания.

Guid ITaskObject.Id { get; }
ITaskObject.Initiator

Поле Initiator содержит информацию об инициаторе задания.

IPerson Initiator { get; }
ITaskObject.Executor

Поле Executor содержит информацию об исполнителе задания.

IPerson Executor { get; }
ITaskObject.Created

Поле Created содержит дату создания задания.

DateTime ITaskObject.Created { get; }
ITaskObject.Children

Поле Children содержит список идентификаторов дочерних элементов, таких как версии задания.

ReadOnlyCollection<Guid> ITaskObject.Children { get; }
ITaskObject.Attributes

Поле Attributes содержит словарь атрибутов задания. Где значением атрибута могут быть следующие типы: string, int, DateTime и double.

IDictionary<string, object> ITaskObject.Attributes { get; }
ITaskObject.Children

Поле Children содержит список идентификаторов детей задания (версий).

ReadOnlyCollection<Guid> Children { get; }
ITaskObject.InitiatorAttachments

Поле InitiatorAttachments содержит список идентификаторов вложений в задание, сделанных инициатором задания.

ReadOnlyCollection<Guid> InitiatorAttachments { get; }
ITaskObject.ExecutorAttachments

Поле ExecutorAttachments содержит список идентификаторов вложений в задание, сделанных исполнителем задания.

ReadOnlyCollection<Guid> ExecutorAttachments { get; }
ITaskObject.State

Поле State содержит текущее состояние задания. Подробнее см. State

State State { get; }
ITaskObject.DataState

Поле DataState содержит информацию о текущем статусе элемента задания. Загружено задание в кеш клиента или нет. Подробнее см. DataState

DataState DataState { get; }
ITaskObject.Title

Поле Title содержит тему задания.

string Title { get; }
ITaskObject.Description

Поле Description содержит описание задания.

string Description { get; }
ITaskObject.DeadlineDate

Поле DeadlineDate содержит дату окончания работ по заданию. Если дата не указана, то значение этого поля равно DateTime.MaxValue.

DateTime DeadlineDate { get; }
ITaskObject.DateOfAssignment

Поле DateOfAssignment содержит дату выдачи задания.

DateTime DateOfAssignment { get; }
ITaskObject.DateOfCompletion

Поле DateOfCompletion содержит дату завершения работ по заданию.

DateTime? DateOfCompletion { get; }
ITaskObject.DateOfStart

Поле DateOfStart содержит дату начала работ по заданию.

DateTime? DateOfStart { get; }
ITaskObject.DisplayTitle

Поле DisplayTitle - вспомогательное свойство, которое возвращает тему задания или описание задания, если тема не задана.

string DisplayTitle { get; }
ITaskObject.SynchronizationState

Поле SynchronizationState содержит информацию о текущем статусе синхронизации задания с сервером. Подробнее см. SynchronizationState

SynchronizationState SynchronizationState { get; }
ITaskObject.ChatId

Поле ChatId содержит идентификатор объекта переписки.

Guid ChatId { get; }
ITaskObject.IsVersion

Флаг IsVersion указывает, является ли текущее задание версией.

bool IsVersion { get; }
ITaskObject.Auditors

Поле Auditors содержит список организационных единиц аудиторов задания

IEnumerable<IOrganisationUnit> Auditors { get; }
ITaskObject.Tags

Поле Tags содержит список тэгов задания.

ReadOnlyCollection<string> Tags { get; }
ITaskObject.Kind

Поле Kind содержит тип задания. Подробнее см. TaskKind

TaskKind Kind { get; }
ITaskObject.ToDataObject

Используется для конвертации текущего экземпляра ITaskObject в экземпляр IDataObject

IDataObject ToDataObject();

Интерфейс IWorkflowObject

Интерфейс предназначен для просмотра информации о рабочем процессе заданий.

IWorkflowObject.Id

Поле Id содержит идентификатор рабочего процесса.

Guid Id { get; }
IWorkflowObject.Title

Поле Title содержит заголовок рабочего процесса.

string Title { get; }
IWorkflowObject.Description

Поле Description содержит описание рабочего процесса.

string Description { get; }
IWorkflowObject.InitiatorAttachments

Поле InitiatorAttachments содержит список вложений инициатора рабочего процесса.

IEnumerable<Guid> InitiatorAttachments { get; }

Интерфейс IStageObject

Интерфейс предназначен для просмотра информации об этапе рабочего процесса заданий.

IStageObject.Id

Поле Id содержит идентификатор этапа.

Guid Id { get; }
IStageObject.Order

Поле Order содержит порядковый номер этапа.

int Order { get; }

Интерфейс IType

Интерфейс предназначен для просмотра информации о типе элемента.

IType.Id

Поле Id содержит идентификатор типа элемента.

Guid IType.Id { get; }
IType.Name

Поле Name содержит внутренне имя типа элемента.

string IType.Name { get; }
IType.Title

Поле Title содержит локализованное имя типа элемента.

string IType.Title { get; }
IType.Sort

Поле Sort содержит порядковый номер сортировки.

int IType.Sort { get; }
IType.HasFiles

Поле HasFiles показывает может ли данный тип содержать файлы.

bool IType.HasFiles { get; }
IType.Children

Поле Children содержит идентификаторы дочерних типов.

ReadOnlyCollection<int> IType.Children { get; }
IType.Attributes

Поле Attributes содержит информацию об атрибутах, которые может содержать элемент данного типа.

ReadOnlyCollection<IAttribute> IType.Attributes { get; }
IType.DisplayAttributes

Поле DisplayAttributes содержит информацию об отображаемых в Обозревателе проектов атрибутах.

ReadOnlyCollection<IAttribute> IType.DisplayAttributes { get; }
IType.SvgIcon

Поле SvgIcon содержит массив байт иконки типа в формате svg.

byte[] IType.SvgIcon { get; }
IType.IsMountable

Флаг IsMountable указывает может ли элемент данного типа монтироваться на диск (Pilot - Storage).

bool IType.IsMountable { get; }
IType.Kind

Поле Kind содержит вид типа элемента.

TypeKind IType.Kind { get; }
IType.IsDeleted

Поле IsDeleted указывает удален ли текущий тип. В системе Pilot типы не удаляются из базы данных, а только помечаются как удаленные.

bool IType.IsDeleted { get; }
IType.IsService

Поле IsService указывает является ли текущий тип сервисным. Если данное свойство установлено в true, то элементы такого типа не будут отображаться в Обозревателе проектов. Доступ к элементам такого типа можно получить только из кода.

bool IType.IsService { get; }

Интерфейс IAttribute

Интерфейс предназначен для просмотра информации об атрибутах типа элемента.

IAttribute.Name

Поле Name содержит внутреннее название атрибута типа.

string IAttribute.Name { get; }
IAttribute.Title

Поле Title содержит локализованное название атрибута типа.

string IAttribute.Title { get; }
IAttribute.IsObligatory

Поле IsObligatory показывает является ли данный атрибут обязательным для заполнения при создании нового элемента.

bool IAttribute.IsObligatory { get; }
IAttribute.DisplaySortOrder

Поле DisplaySortOrder содержит порядковый номер сортировки атрибута типа.

int IAttribute.DisplaySortOrder { get; }
IAttribute.ShowInObjectsExplorer

Поле ShowInObjectsExplorer показывает будет ли данный атрибут виден в Обозревателе проектов.

bool IAttribute.ShowInObjectsExplorer { get; }
IAttribute.InGroup

Поле InGroup показывает, что, при наличии свободного места, данный атрибут группируется с соседними атрибутами, помечеными так же, при отображении в карточке объекта.

bool IAttribute.InGroup { get; }
IAttribute.IsService

Поле IsService показывает является ли данный атрибут сервисным.

bool IAttribute.IsService { get; }
IAttribute.Configuration

Поле Configuration содержит дополнительную информацию типа. Например этот атрибут используется для описания меток штрих-кода или описания справочников.

string IAttribute.Configuration { get; }
IAttribute.DisplayHeight

Поле DisplayHeight содержит высоту атрибута, которую занимает атрибут в карточке редактирования и просмотра свойств элемента в Обозревателе проектов. По умолчанию атрибуты занимают одну строку.

int IAttribute.DisplayHeight { get; }

Интерфейс IFile

Интерфейс предназначен для просмотра информации о файлах, которые содержит элемент.

IFile.Id

Поле Id содержит идентификатор файла

Guid IFile.Id { get; }
IFile.Size

Поле Size содержит информацию о размере файла.

long IFile.Size { get; }
IFile.Md5

Поле Md5 содержит хеш-код файла, вычисленный по алгоритму хеширования md5

string IFile.Md5 { get; }
IFile.Name

Поле Name содержит имя файла с расширением.

string IFile.Name { get; }
IFile.Modified

Поле Modified содержит время последнего изменения файла.

DateTime IFile.Modified { get; }
IFile.Created

Поле Created содержит время создания файла.

DateTime IFile.Created { get; }
IFile.Accessed

Поле Accessed содержит время последнего доступа к файлу.

DateTime IFile.Accessed { get; }
IFile.Signatures

Поле Signatures содержит список цифровых подписей, поставленных на файл.

ReadOnlyCollection<ISignature> IFile.Signatures { get; }

Интерфейс ISignature

Интерфейс предназначен для просмотра информации о цифровых подписях, поставленных на файл.

ISignature.Id

Поле Id содержит идентификатор цифровой подписи.

Guid ISignature.Id { get; }
ISignature.DatabaseId

Поле DatabaseId содержит идентификатор базы данных, к которой привязана должность пользователя.

Guid ISignature.DatabaseId { get; }
ISignature.PositionId

Поле PositionId содержит идентификатор должности пользователя, который подписал или должен подписать документ.

int ISignature.PositionId { get; }
ISignature.Role

Поле Role содержит информацию о роли пользователя, который подписал или должен подписать документ.

string ISignature.Role { get; }
ISignature.Sign

Поле Sign содержит информацию о подписи.

string ISignature.Sign { get; }
ISignature.RequestedSigner

Поле RequestedSigner содержит информацию о должности пользователя, который должен подписать документ.

string ISignature.RequestedSigner { get; }

Интерфейс IOrganisationUnit

Интерфейс предназначен для просмотра информации о должностях и структурных подразделениях организации.

IOrganisationUnit.Id

Поле Id содержит идентификатор должности или структурного подразделения.

int IOrganisationUnit.Id { get; }
IOrganisationUnit.Kind

Поле Kind возвращает тип элемента организационной структуры.

OrganisationUnitKind IOrganisationUnit.Kind { get; }
IOrganisationUnit.Title

Поле Title содержит локализованное наименование должности или структурного подразделения.

string IOrganisationUnit.Title { get; }
IOrganisationUnit.IsDeleted

Поле IsDeleted показывает удалена ли должность или структурное подразделение. В системе Pilot организационные единицы не удаляются из базы данных, а только помечаются как удаленные.

bool IOrganisationUnit.IsDeleted { get; }
IOrganisationUnit.Children

Поле Children содержит идентификаторы дочерних должностей или структурных подразделений.

ReadOnlyCollection<int> IOrganisationUnit.Children { get; }
IOrganisationUnit.Person

Метод расширения Person возвращает идентификатор пользователя, занимающего должность. Если должность вакантна, значение будет -1.

IOrganisationUnit.VicePersons

Метод расширения VicePersons возвращает список идентификаторов пользователей-заместителей на должности. Порядок идентификаторов в списке определяет порядок вступления заместителей в должность при неактивном состоянии пользователя.

IOrganisationUnit.GroupPerson

Метод расширения GroupPersons возвращает список идентификаторов пользователей в группе.

Интерфейс IPerson

Интерфейс предназначен для просмотра информации о пользователе системы Pilot.

IPerson.Id

Поле Id содержит уникальный идентификатор пользователя.

int IPerson.Id { get; }
IPerson.Login

Поле Login содержит имя пользователя (login).

string IPerson.Login { get; }
IPerson.DisplayName

Поле DisplayName содержит отображаемое имя пользователя. Например ФИО.

string IPerson.DisplayName { get; }
IPerson.Positions

Поле Positions содержит список должностей, которые в данный момент занимает пользователь.

ReadOnlyCollection<IPosition> IPerson.Positions { get; }
IPerson.MainPosition

Поле MainPosition содержит основную должность пользователя.

IPosition IPerson.MainPosition { get; }
IPerson.Comment

Поле Comment содержит дополнительные сведения о пользователе.

string IPerson.Comment { get; }
IPerson.IsInactive

Метод расширения IsInactive возвращает true, если статус пользователя “Недоступен”.

IPerson.Sid

Поле Sid содержит уникальный идентификатор доменной учетной записи пользователя.

string IPerson.Sid { get; }
IPerson.IsDeleted

Поле IsDeleted показывает удален пользователь или нет. В системе Pilot информация пользователях не удаляется из базы данных. Пользователи помечаются как удаленные.

bool IPerson.IsDeleted { get; }
IPerson.IsAdmin

Поле IsAdmin показывает является ли текущий пользователь администратором.

bool IPerson.IsAdmin { get; }
IPerson.ActualName

Поле ActualName содержит актуальное имя пользователя. По умолчанию это поле выводит информацию из поля DisplayName. Если поле DisplayName не заполнено, то данное поле выводит информацию из поля Login.

string IPerson.ActualName { get; }
IPerson.Groups

Метод расширения Groups возвращает список идентификаторов групп, в которых состоит пользователь

IPerson.AllOrgUnits

Метод расширения AllOrgUnits возвращает список идентификаторов всех должностей, подразделений и групп, в которых состоит пользователь.

Интерфейс IPosition

Интерфейс предназначен для просмотра информации о должности пользователя.

IPosition.Order

Поле Order содержит порядковый номер должности пользователя. Основная должность имеет наименьший порядковый номер.

int IPosition.Order { get; }
IPosition.Position

Поле Position содержит идентификатор должности пользователя.

int IPosition.Position { get; }

Интерфейс IAccess

Интерфейс предназначен для просмотра информации об уровне доступа.

IAccess.AccessLevel

Содержит уровень доступа к элементу.

AccessLevel IAccess.AccessLevel { get; }
IAccess.ValidThrough

Содержит дату, до которой действует право доступа.

DateTime IAccess.ValidThrough { get; }
IAccess.IsInheritable

Флаг, указывающий унаследовано право от родительского элемента или нет.

bool IAccess.IsInheritable { get; }
IAccess.IsInherited

Флаг, указывающий будут ли наследовать дочерние элементы текущее право доступа.

bool IAccess.IsInherited { get; }

Интерфейс IAccessRecord

Интерфейс предназначен для просмотра информации о правах доступа на элемент.

IAccessRecord.OrgUnitId

Содержит идентификатор должности для которого действует указанный уровень доступа.

int IAccessRecord.OrgUnitId { get; }
IAccessRecord.Access

Содержит информацию об уровене доступа. Подробнее см. IAccess

IAccess IAccessRecord.Access { get; }
IAccessRecord.RecordOwner

Содержит информацию о должности, которая установила указанный уровень доступа.

int IAccessRecord.RecordOwner { get; }
IAccessRecord.InheritanceSource

Содержит идентификатор элемента, с которого текущий элемент получил унаследованное право доступа.

Guid IAccessRecord.InheritanceSource { get; }

Интерфейс IStorageDataObject

Интерфейс предназначен для просмотра информации об элементе Pilot-Storage.

IStorageDataObject.DataObject

Поле DataObject содержит полную информацию об элементе.

IDataObject IStorageDataObject.DataObject { get; }
IStorageDataObject.Path

Поле Path содержит абсолютный путь до элемента на Pilot-Storage.

string IStorageDataObject.Path { get; }
IStorageDataObject.State

Поле State содержит текущее состояние элемента.

StorageObjectState IStorageDataObject.State { get; }
IStorageDataObject.IsDirectory

Поле IsDirectory показывает является ли текущий элемент папкой.

bool IStorageDataObject.IsDirectory { get; }

Интерфейс IStateInfo

Интерфейс предназначен для просмотра информации о состоянии объекта.

IStateInfo.State

Поле State содержит ифнормацию о состоянии объекта.

ObjectState IStateInfo.State { get; }
IStateInfo.Date

Поле Date содержит ифнормацию дате последнего изменения состояния объекта.

DateTime IStateInfo.Date { get; }
IStateInfo.PersonId

Поле PersonId содержит идентификатор пользователя, изменившего состояние объекта последним.

int IStateInfo.PersonId { get; }
IStateInfo.PositionId

Поле PositionId содержит идентификатор позиции пользователя, изменившего состояние объекта последним.

int IStateInfo.PositionId { get; }

Интерфейс IRelation

Интерфейс предоставляет доступ к свойствам связи элемента.

IRelation.Id

Поле Id содержит идентификатор связи. У двух связанных между собой объектов должны быть связи с одинаковым идентификатором.

Guid IRelation.Id { get; }
IRelation.TargetId

Поле TargetId содержит идентификатор элемента, с которым связан текущий объект.

Guid IRelation.TargetId { get; }
IRelation.Type

Поле Type содержит тип связи. Подробнее см ObjectRelationType

ObjectRelationType IRelation.Type { get; }
IRelation.Name

Поле Name содержит имя связи.

string IRelation.Name { get; }
IRelation.VersionId

Поле VersionId содержит дату создания версии документа.

DateTime IRelation.VersionId { get; }

Интерфейс IFilesSnapshot

Интерфейс содержит информацию о файлах элемента.

IFilesSnapshot.Created

Поле Created содержит дату создания снимка файлов.

DateTime IFilesSnapshot.Created { get; }
IFilesSnapshot.CreatorId

Поле CreatorId содержит идентификатор пользователя сделавшего снимок файлов.

int IFilesSnapshot.CreatorId { get; }
IFilesSnapshot.Reason

Поле Reason содержит информацию о причине создания снимка файлов.

string IFilesSnapshot.Reason { get; }
IFilesSnapshot.Files

Поле Files содержит список файлов снимка.

ReadOnlyCollection<IFile> IFilesSnapshot.Files { get; }

Интерфейс ILicenseInfo

Интерфейс содержит информацию о лицензии для определенного продукта.

ILicenseInfo.ProductId

Поле ProductId содержит номер продукта.

int ILicenseInfo.ProductId { get; }
ILicenseInfo.IsExpired

Поле IsExpired содержит информацию просрочена ли лицензия.

bool ILicenseInfo.IsExpired { get; }
ILicenseInfo.IsCheated

Поле IsCheated содержит информацию о корректности файла лицензии.

bool ILicenseInfo.IsCheated { get; }
ILicenseInfo.ExpirationDate

Поле ExpirationDate дату истечения лицензии.

DateTime ILicenseInfo.ExpirationDate { get; }
ILicenseInfo.MaxLicensesCount

Поле MaxLicensesCount содержит количество рабочих мест, выделенных для данного продукта.

int ILicenseInfo.MaxLicensesCount { get; }

Интерфейс IUserState

Интерфейс IUserState описывает пользовательское состояние

IUserState.Id

Поле Id содержит уникальный идентификатор пользовательского состояния. Данный идентификатор в виде строки записывается как значение атрибута в объект, находящийся в данном состоянии.

Guid IUserState.Id { get; }
IUserState.Name

Поле Name содержит уникальное внутреннее имя пользовательского состояния.

string IUserState.Name { get; }
IUserState.Title

Поле Title содержит отображаемое имя пользовательского состояния.

string IUserState.Title { get; }
IUserState.Icon

Поле Icon содержит иконку пользовательского состояния в формате SVG.

byte[] IUserState.Icon { get; }
IUserState.Color

Поле Color содержит цвет пользовательского состояния из перечисления возможных цветов.

UserStateColors IUserState.Color { get; }
IUserState.IsDeleted

Поле IsDeleted показывает, было ли удалено пользовательское состояние.

bool IUserState.IsDeleted { get; }

Интерфейс IMouseLeftClickListener

Интерфейс обработчика клика левой кнопки мыши по документу.

IMouseLeftClickListener.OnLeftMouseButtonClick

Метод вызывается при клике левой кнопки мыши

void OnLeftMouseButtonClick(XpsRenderClickPointContext pointContext);

где pointContext - XpsRenderClickPointContext

Перечисления

Перечисление DataState

Перечисление состояний элемента.

DataState.Unknown

Не известное состояние элемента. Все создаваемые элементы получают данное состояние.

DataState.Unknown;
DataState.NoData

Элемент существует, но не загружен в память клиента.

DataState.NoData;
DataState.Loaded

Элемент существует и загружен в память клиента.

DataState.Loaded;
DataState.NonExistent

Элемента не существует.

DataState.NonExistent;

Перечисление SynchronizationState

Перечисление состояний синхронизации элемента с сервером.

SynchronizationState.Synchronized

Элемент синхронизирован с сервером. Элемент на сервере идентичен элементу в кеше клиента.

SynchronizationState.Synchronized;
SynchronizationState.AwaitingForSynchronization

Элемент в ожидании синхронизации с сервером.

SynchronizationState.AwaitingForSynchronization;
SynchronizationState.SynchronizationAborted

Изменения внесенные в элемент по каким-то причинам были отклонены сервером. Например отсутствие прав на изменение атрибутов элемента.

SynchronizationState.SynchronizationAborted;

Перечисление TypeKind

Перечисление видов типа элемента.

TypeKind.User

Тип елемента является пользовательским и элементы данного типа могут отображаться в Обозревателе проектов.

TypeKind.User;
TypeKind.System

Тип элемента является системным и элементы данного типа не отображаются в Обозревателе проектов.

TypeKind.System;

Перечисление ObjectState

Перечисление состояний элемента.

ObjectState.Alive

Состояние по умолчанию. Элемент “живой”.

ObjectState.Alive;
ObjectState.InRecycleBin

Элемент удален в корзину

ObjectState.InRecycleBin;
ObjectState.DeletedPermanently

Элемент удален безвозвратно

ObjectState.DeletedPermanently;
ObjectState.Frozen

Элемент заморожен

ObjectState.Frozen;

Перечисление State

Перечисление состояний элемента задания.

State.None

Черновик

State.None;
State.Assigned

Задание выдано

State.Assigned;
State.InProgress

Задание взято в работу

State.InProgress;
State.Revoked

Задание отозвано

State.Revoked;
State.OnValidation

Задание находится на проверке

State.OnValidation;
State.Completed

Задание выполнено

State.Completed;

Перечисление AccessLevel

Перечисление возможных уровней доступа к элементам.

AccessLevel.None

Нет доступа к элементу.

AccessLevel.None;
AccessLevel.Create

Уровень доступа, позволяющий создавать дочерние элементы.

AccessLevel.Create;
AccessLevel.Edit

Уровень доступа, позволяющий редактировать текущий элемент.

AccessLevel.Edit;
AccessLevel.View

Уровень доступа, позволяющий просматривать свойства текущего элемента.

AccessLevel.View;
AccessLevel.ViewCreate

Уровень доступа, позволяющий просматривать свойства текущего элемента и создавать дочерние элементы. Это комбинация двух уровней доступа Create и View.

AccessLevel.ViewCreate;

`

AccessLevel.ViewEdit

Полный доступ к элементу. Уровень доступа, позволяющий просматривать, редактировать свойства текущего элемента и создавать дочерние элементы. Это комбинация уровней доступа Create, View и Edit.

AccessLevel.ViewEdit;

Перечисление StorageObjectState

Перечисление состояний элемента Pilot-Storage.

StorageObjectState.None

Неизвестное состояние элемента.

StorageObjectState.None;
StorageObjectState.Loaded

Элемент загружен.

StorageObjectState.Loaded;
StorageObjectState.Outdated

Элемент скачан с сервера. Но на сервере есть более новая версия.

StorageObjectState.Outdated;
StorageObjectState.NotSent

Элемент еще не был отправлен на сервер.

StorageObjectState.NotSent;
StorageObjectState.Edited

Есть локальные изменения, которые не отправлены на сервер.

StorageObjectState.Edited;
StorageObjectState.Aborted

Изменения не принятые сервером.

StorageObjectState.Aborted;
StorageObjectState.Temp

Временный элемент, который никогда не будет отправлен на сервер.

StorageObjectState.Aborted;

Перечисление ObjectRelationType

ObjectRelationType.SourceFiles

Тип связи с исходным файлом

ObjectRelationType.SourceFiles;
ObjectRelationType.TaskInitiatorAttachments

Тип связи, описывающий вложения в задание документов или файлов инициатором задания.

ObjectRelationType.TaskInitiatorAttachments;
ObjectRelationType.MessageAttachments

Тип связи, описывающий вложения в переписку по заданию документов или файлов.

ObjectRelationType.MessageAttachments;
ObjectRelationType.Custom

Пользовательский тип связи. Этот тип связи отображается во вкладке “Связи” в клиенте Pilot.

ObjectRelationType.Custom;

Перечисление TaskKind

Перечисление типов заданий.

TaskKind.Task

Обычное задание

TaskKind.Task;
TaskKind.Agreement

Задание на согласование документов

TaskKind.Agreement;
TaskKind.Acquaintance

Задание на ознакомление

TaskKind.Acquaintance;

Перечисление OrganisationUnitKind

Перечисление типов элементов организационной структуры.

OrganisationUnitKind.Department

Подразделение организационной структуры. Может включать дочерние подразделения и должности. Пользователь не может быть назначен на подразделение.

OrganisationUnitKind.Department;
OrganisationUnitKind.Position

Должность организационной структуры. Не может иметь дочерних элементов. На должность может быть назначен пользователь и список заместителей.

OrganisationUnitKind.Position;
OrganisationUnitKind.Group

Группа организационной структуры. Может быть создана только на первом уровне организационной структуры, не может содержать дочерних элементов и иметь назначенного пользователя. Используется для объединения пользователей в группы.

OrganisationUnitKind.Group;

События

Событие OfflineEventArgs

Аргументы события OfflineEventArgs присылаются расширению когда возникает событие перехода клиента Pilot-ICE/ECM в режим автономной работы.

public class OfflineEventArgs : MarshalByRefObject { }

Событие OnlineEventArgs

Аргументы события OnlineEventArgs присылаются расширению когда возникает событие перехода клиента Pilot-ICE/ECM в режим автономной работы в сети.

public class OnlineEventArgs : MarshalByRefObject { }

Событие CloseTabEventArgs

Аргументы события CloseTabEventArgs присылаются расширению перед закрытием вкладки.

public class CloseTabEventArgs : MarshalByRefObject { }

Класс CloseTabEventArgs содержит поле с заголовком закрываемой вкладки.

public string CloseTabEventArgs.TabTitle { get; private set; }

Событие OpenTabEventArgs

Аргументы события OpenTabEventArgs присылаются расширению перед открытием новой вкладки.

public class OpenTabEventArgs : MarshalByRefObject { }

Класс OpenTabEventArgs содержит поле с заголовком открываемой вкладки.

public string OpenTabEventArgs.TabTitle { get; private set; }

Событие LoadedEventArgs

Аргументы события LoadedEventArgs присылаются расширению после загрузки клиентом Pilot-ICE/ECM данного расширения.

public class LoadedEventArgs : MarshalByRefObject { }

Событие UnloadedEventArgs

Аргументы события LoadedEventArgs присылаются расширению перед выгрузкой клиентом Pilot-ICE/ECM данного расширения.

public class UnloadedEventArgs : MarshalByRefObject { }

Дополнительно

Пример создания объекта с нумератором

Для заполнения атрибута типа нумератор при создании объекта необходимо:

  1. Получить метаданные атрибута создаваемого объекта. IDataObject.Type.Attributes -> найти по имени (или другому признаку) нужный атрибут;

  2. Получить значение поля IAttribute.Configuration и распарсить его. Поле должно содержать описание возможных строк формата данного атрибута. Ниже приведен наиболее сложный пример такого описания:
    Входящий документ, ВХ-{Counterc11cbdead2d047399127798d2d1ea07f:d5}-{CurrentDate:yyyy}
    Исходящий документ, ИС-{Counterc11cbdead2d047399127798d2d1ea07f:d5}-{CurrentDate:yyyy}

  3. Строками разделены различные возможные описания нумератора. Таких строк может быть 1 или более. Каждая строка содержит следующие данные, разделенные между собой знаком ",":

  4. Из распарсенных данных из пункта 2 выбираем нужное нам описание (если оно одно, то без выбора) и получаем значение его строки форматирования. Например, из вышеприведенного примера мы выберем
    ИС-{Counterc11cbdead2d047399127798d2d1ea07f:d5}-{CurrentDate:yyyy}

  5. Присваиваем значению атрибута создаваемого объекта значение строки форматирования из пункта 3.

  6. Создаем объект, после прохождения объекта через сервер атрибут будет заполен согласно выбранной строке форматирования.

Пример:

using System.Linq;
using System.Text;
using Ascon.Pilot.SDK;
using Ascon.Pilot.SDK.DataObjectWrappers;
using Ascon.Pilot.SDK.Menu;
using NumeratorPlugin.Wrappers;

namespace NumeratorPlugin
{
    [Export(typeof(IMenu<ObjectsViewContext>))]
    public class MainModule : IMenu<ObjectsViewContext>
    {
        private readonly IObjectsRepository _repository;
        private readonly IObjectModifier _modifier;
        private readonly IAttributeFormatParser _attributeFormatParser;
        private const string CREATE_COMMAND = "CreateCommand";

        [ImportingConstructor]
        public MainModule(IObjectsRepository repository, IObjectModifier modifier, IAttributeFormatParser attributeFormatParser)
        {
            _repository = repository;
            _modifier = modifier;
            _attributeFormatParser = attributeFormatParser;
        }

        public void Build(IMenuBuilder builder, ObjectsViewContext context)
        {
            builder.AddItem(CREATE_COMMAND, 0).WithHeader("Create element with numerator");
        }

        public void OnMenuItemClick(string name, ObjectsViewContext context)
        {
            var type = _repository.GetType("DocumentTypeWithNumerator");
            //PlgAttribute - wrapper class for the IAttribute
            var numberAttribute = new PlgAttribute(type.Attributes.First(att => att.Name == "Number"));
            IEnumerable<INumeratorInfo> numInfos = null;
            if (_attributeFormatParser.TryParseNumeratorDeclaration(numberAttribute.Configuration, out numInfos))
            {
                //PlgDataObject - wrapper class for the IDataObject
                var parent = new PlgDataObject(context.SelectedObjects.FirstOrDefault());
                //PlgNumeratorInfo - wrapper class for the INumeratorInfo
                var infos = numInfos.Select(i => new PlgNumeratorInfo(i));
                foreach (var ni in infos)
                {
                    _modifier.Create(context.SelectedObjects.FirstOrDefault(), type).SetAttribute("Number", ni.Configuration);
                }
            }

            _modifier.Apply();
        }
    }
}