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