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

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

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

  • получение конфигурации по объектам модели,
  • получение 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

Менеджер BM-моделей позволяет управлять BM-моделями в 1C:EDT:

  • Создавать BM-модели, сконфигурированные стандартным для проектов 1C:EDT образом,
  • Получать существующие BM-модели по проектам, объектам модели или их URI.
  • Управлять жизненным циклом BM-моделей: пересоздавать (clean) модели, закрывать модели.
  • Приостанавливать выполнение текущего потока до конца синхронизации BM-модели. Более подробно про работу с BM-моделью, BM-объектами и сессиями, можно прочитать здесь.

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

Получение BM-модели

 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
33
34
35
36
import com._1c.g5.v8.bm.IBmModel;
import com._1c.g5.v8.bm.IBmObject;
import com._1c.g5.v8.bm.IBmSession;
import com._1c.g5.v8.bm.editing.IBmTask2;
import com._1c.g5.v8.dt.core.platform.IBmModelManager;
import com._1c.g5.v8.dt.metadata.mdclass.Document;

...
 
IBmModel bmModel = modelManager.getModel(document);

IBmSession session = bmModel.createSession();
final Document attachedDocument = session.attach((IBmObject)document);
 
// Далее мы можем работать с документом в рамках изменений его BM-модели
session.executeExclusive(new IBmTask2()
{
    @Override
    public String getName()
    {
        return "Changing Document";
    }
 
    @Override
    public IStatus execute(IBmEditingSupport editingSupport, IProgressMonitor monitor)
    {
        attachedDocument.setComment("Test comment");
        return Status.OK_STATUS;
    }
 
    @Override
    public List<IBmObject> getAffectedObjects()
    {
        return Collections.singletonList(attachedDocument);
    }
});

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));
    }
}