Cервисы общего назначения

Cервисы общего назначения #

Этот раздел описывает сервисы общего назначения, а также содержит примеры их использования. Сервисы общего назначения позволяют решать разнообразные наиболее часто встречающиеся задачи:

  • получение конфигурации по объектам модели,
  • получение BM-модели,
  • получение версии платформы, связанной с объектами модели и т. д.

IV8ProjectManager #

com._1c.g5.v8.dt.core.platform.IV8ProjectManager

IV8ProjectManager — это менеджер V8-проектов. IV8Project (V8-проект) — это абстракция верхнего уровня, представляющая собой проект в 1C:EDT.

Менеджер V8-проектов позволяет получать V8-проекты, а также прослушивать события, связанные с V8-проектами. Он предоставляет вам свойства проекта, такие как версия проекта, вариант встроенного языка, Eclipse-проект, который содержит объекты метаданных, и т. д.

Класс IV8Project имеет несколько наследников, предоставляющих вам более конкретные, специфичные для проекта вещи:

  • IConfigurationProject и IExtensionProject — предоставляют вам свои конфигурации,
  • IExtensionObjectProject — предоставляет вам внешние отчеты и обработки, которые он содержит.

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Получение варианта встроенного языка

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import com._1c.g5.v8.dt.core.platform.IV8Project;
import com._1c.g5.v8.dt.core.platform.IV8ProjectManager;

...
 
// Получаем V8-проект по объекту
IV8Project v8project = v8projectManager.getProject(object);

// Возвращаем имя в зависимости от варианта встроенного языка
if (v8project.getScriptVariant() == ScriptVariant.ENGLISH)
{
    return "CommonModule";
}
else
{
	return "ОбщийМодуль";
}

Получение внешней обработки

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import com._1c.g5.v8.dt.core.platform.IV8Project;
import com._1c.g5.v8.dt.core.platform.IV8ProjectManager;

...
 
// Получаем V8-проект по объекту
IV8Project v8project = v8projectManager.getProject(object);

// Если это проект внешних отчетов и обработок, то пытаемся найти внешнюю обработку с именем "MyProcessor"
if (v8project instanceof IExternalObjectProject)
{
    return ((IExternalObjectProject)v8project).getExternalObject("MyProcessor", MdClassPackage.Literals.EXTERNAL_DATA_PROCESSOR);
}

IConfigurationProjectManager, IExtensionProjectManager, IExternalObjectProjectManager #

com._1c.g5.v8.dt.core.platform.IConfigurationProjectManager com._1c.g5.v8.dt.core.platform.IExtensionProjectManager com._1c.g5.v8.dt.core.platform.IExternalObjectProjectManager

Менеджеры специфичных V8-проектов позволяют создавать конкретные типы V8-проектов в 1C:EDT, а также совершать некоторые дополнительные действия, такие как, например, изменение родительского проекта для проекта внешних отчетов и обработок или для проекта расширения конфигурации.

Это публичные сервисы, которые доступны через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Создание проекта конфигурации

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import com._1c.g5.v8.dt.core.platform.IConfigurationProjectManager;
import com._1c.g5.v8.dt.platform.version.Version;
import com._1c.g5.v8.dt.metadata.mdclass.Configuration;

...
 
// Если мы хотим создать проект с уже имеющимся объектом конфигурации, мы должны передать его в метод создания проекта
Configuration configuration = getConfiguration();
 
IProject myProject = configurationProjectManager .createProject("MyProject", new Version("8.3.7"), configuration, monitor);
myProject .refreshLocal(IProject.DEPTH_INFINITE, monitor);

IConfigurationProvider #

com._1c.g5.v8.dt.core.platform.IConfigurationProvider

Провайдер конфигураций позволяет управлять конфигурациями и проектами конфигураций в 1C:EDT. Он позволяет получать конфигурации по проектам, объектам модели или их URI.

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Получение конфигурации по объекту

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import com._1c.g5.v8.dt.core.platform.IConfigurationProvider;
import com._1c.g5.v8.dt.metadata.mdclass.Configuration;

...
 
Configuration configuration = configurationProvider.getConfiguration(document);
 
// Конфигурация может быть в невалидном состоянии: нужно проверить, что ее удалось получить
if (configuration != null)
{
    // Получаем поставщика конфигурации, указанного в ее свойствах 
    String vendor = configuration.getVendor();
}

IBmModelManager #

com._1c.g5.v8.dt.core.platform.IBmModelManager

Данный менеджер отвечает за интеграцию платформы БМ в 1C:EDT. В частности, в его обязанности входит:

  • открытие и закрытие платформы БМ при открытии и закрытии 1C:EDT,
  • создание и удаление пространств имен и хранилищ БМ при создании и удалении проектов,
  • синхронизация содержимого ресурсов проекта и его объектной модели,
  • редактирование объектной модели,
  • рассылка событий.

Соответственно, интерфейс IBmModelManager предоставляет методы для:

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

Подробнее про пространства имен и проекты, контексты редактирования, выполнение задач и события см. в разделе, посвященном интеграции платформы БМ и 1C:EDT.

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

ITopObjectFqnGenerator #

com._1c.g5.v8.dt.core.naming.ITopObjectFqnGenerator

Сервис позволяет сгенерировать FQN (квалифицированное имя) различным объектам модели:

  • получить квалифицированное имя объектов модели верхнего уровня,
  • получить квалифицированное имя внешних свойств объектов модели. Это может быть полезно для подключения объектов модели к BM-модели проектов в 1C:EDT.

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Генерация FQN для подключения объекта к BM-модели

1
2
3
4
5
6
import com._1c.g5.v8.dt.core.naming.IFqnProvider;
import com._1c.g5.v8.dt.bsl.model.BslPackage;
...

String fqn = topObjectFqnGenerator.generateStandaloneObjectFqn(MdClassPackage.Literals.CATALOG, "Clients");
transaction.attachTopObject(newCatalog, fqn);

IResourceLookup #

com._1c.g5.v8.dt.core.platform.IResourceLookup

Сервис позволяет производить поиск ресурсов рабочей области по объектам модели, EMF-ресурсам модели или их URI. Полученные ресурсы рабочей области будут содержать передаваемые объекты модели:

  • поиск IFile, в котором содержится искомый объект,
  • поиск IProject, в котором содержится искомый объект.

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Получение workspace-ресурса

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import com._1c.g5.v8.dt.core.platform.IResourceLookup;

...
 
IFile resource = resourceLookup.getPlatformResource(module);
 
if (!resource.exists())
{
    // Создадим модуль с пустым содержимым, если он еще не был создан
    try (InputStream stream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)))
    {
        resource.create(stream, true, monitor);
    }
    catch (IOException | CoreException e)
    {
         // Залогируем ошибку
         MyPlugin.log(new Status(IStatus.ERROR, MyPlugin.PLUGIN_ID, "Module content creation error", e));
    }
}

Получение проекта

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import com._1c.g5.v8.dt.core.platform.IResourceLookup;

...
 
// Получаем родительский проект
IProject project = resourceLookup.getProject(document);
 
// Создадим папку с названием "MyFolder" внутри проекта
IFolder myFolder = project.getFolder("MyFolder");
if (!myFolder .exists())
{
    myFolder .create(true, true, monitor);
}

IRuntimeVersionSupport #

com._1c.g5.v8.dt.platform.version.IRuntimeVersionSupport

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

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Получение версии проекта

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import com._1c.g5.v8.dt.platform.version.IRuntimeVersionSupport;
import com._1c.g5.v8.dt.platform.version.Version;
import com._1c.g5.v8.dt.metadata.mdclass.Document;

...
 
Version version = runtimeVersionSupport.getRuntimeVersion(document);

if (new Version("8.3.8").equals(version))
{
    // Наш класс знает, как работать с документом версии 8.3.8 платформы
    workWithSupportedVersion(document);
}
else
{
    // Наш класс не знает, как работать с документами других версий
    throw new UnsupportedOperationException("My service does not support version " + version);
}

IRuntimeRegistry #

com._1c.g5.v8.dt.platform.IRuntimeRegistry

Сервис позволяет получить все поддерживаемые (зарегистрированные в точках расширения) версии платформы «1С:Предприятия». Его удобно использовать для определения своих сервисов и своих точек расширения, которые зависят от версии «1С:Предприятия».

Это публичный сервис, который доступен через AbstractServiceAwareModule или ServiceAccess (см. как использовать публичные сервисы).

Возможно вы хотите создать свою точку расширения, в которой можно будет определять версионно-зависимые события. Например, чтобы можно было зарегистрировать для версии 8.3.7 один компонент, обрабатывающий какое-то событие, а для версии 8.3.8 — другой компонент. Тогда вы можете сослаться в определении точки расширения на зарегистрированные версии «1С:Предприятия»:

Фрагмент описания сервиса myServiceContributors.exsd

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<element name="executor">
   <complexType>
      <attribute name="class" type="string" use="required">
         <annotation>
            <documentation>
                My service contributor class.
            </documentation>
            <appinfo>
               <meta.attribute kind="java" basedOn=":com.myplugin.IMyServiceContributor"/>
            </appinfo>
         </annotation>
      </attribute>
      <attribute name="runtime" type="string">
         <annotation>
            <documentation>
               1C:Enterprise Runtime version.
            </documentation>
            <appinfo>
               <meta.attribute kind="identifier" basedOn="com._1c.g5.v8.dt.platform.runtimes/runtime/@id"/>
            </appinfo>
         </annotation>
      </attribute>
   </complexType>
</element>

Затем вы можете зарегистрировать свои компоненты для интересующих вас версий «1С:Предприятия» и через registry-класс «собрать» все зарегистрированные компоненты:

Пример использования

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import com._1c.g5.v8.dt.platform.version.IRuntimeVersionSupport;
import com._1c.g5.v8.dt.platform.version.Version;
...

Map<Version, IMyServiceContributor> contributors = Maps.newHashMap();
        
IConfigurationElement[] configurationElements = 
    Platform.getExtensionRegistry().getConfigurationElementsFor("com.myplugin.myServiceContributors");

for (IConfigurationElement configurationElement : configurationElements)
{
    try
    {
        IMyServiceContributor contributor =
            (IMyServiceContributor)configurationElement.createExecutableExtension("class");

        String runtimeId = configurationElement .getAttribute("runtime");
        IRuntime runtime = runtimeRegistry.getRuntime(runtimeId);
        if (runtime != null)
        {
            contributors.put(runtime.getVersion(), contributor);
        }
        else
        {
            MyPlugin.log(new Status(IStatus.ERROR, MyPlugin.PLUGIN_ID, MessageFormat.format("Registered runtime with id \"{0}\" is unknown", runtimeId ), e));
        }
    }
    catch (CoreException e)
    {
         MyPlugin.log(new Status(IStatus.ERROR, MyPlugin.PLUGIN_ID, "My extension point read error", e));
    }
}