Skip to content

Commit 4b4ba0e

Browse files
committed
doc: Добавлен детальный анализ типов реквизитов с примерами использования нового функционала.
Обновлена документация, включающая полное описание типов, квалификаторы и анализ зависимостей объектов метаданных.
1 parent 3475c0b commit 4b4ba0e

File tree

2 files changed

+137
-130
lines changed

2 files changed

+137
-130
lines changed

docs/ru/examples.md

Lines changed: 127 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,110 @@ catalogs.forEach(catalog -> {
144144
});
145145
```
146146

147+
### Детальный анализ типов реквизитов
148+
149+
```java
150+
// Полный пример анализа типов реквизитов с демонстрацией нового функционала
151+
public class TypeAnalysisExample {
152+
153+
public static void main(String[] args) {
154+
// Путь к каталогу конфигурации
155+
Path configurationPath = Paths.get("path/to/configuration");
156+
157+
// Чтение конфигурации
158+
Configuration configuration = (Configuration) MDClasses.createConfiguration(configurationPath);
159+
160+
System.out.println("=== АНАЛИЗ ТИПОВ РЕКВИЗИТОВ ===\n");
161+
162+
// Анализ реквизитов справочников
163+
configuration.getCatalogs().forEach(catalog -> {
164+
System.out.println("Справочник: " + catalog.getName());
165+
System.out.println("=====================================");
166+
167+
catalog.getAttributes().forEach(attribute -> {
168+
analyzeAttributeType(attribute);
169+
});
170+
171+
System.out.println();
172+
});
173+
}
174+
175+
private static void analyzeAttributeType(ObjectAttribute attribute) {
176+
ValueTypeDescription typeDescription = attribute.getType();
177+
178+
System.out.println("Реквизит: " + attribute.getName());
179+
System.out.println(" Полное описание типа: " + typeDescription.getDescription());
180+
System.out.println(" Составной тип: " + typeDescription.isComposite());
181+
System.out.println(" Количество типов в составе: " + typeDescription.getTypes().size());
182+
183+
// Анализ каждого типа в составе
184+
typeDescription.getTypes().forEach(type -> {
185+
System.out.println(" Тип: " + type.getClass().getSimpleName());
186+
187+
if (type instanceof MetadataValueType metadataType) {
188+
System.out.println(" Ссылка на объект: " + metadataType.getName());
189+
System.out.println(" Тип метаданных: " + metadataType.getKind());
190+
System.out.println(" Составной: " + metadataType.isComposite());
191+
} else if (type instanceof PrimitiveValueType primitiveType) {
192+
System.out.println(" Примитивный тип: " + primitiveType);
193+
}
194+
});
195+
196+
// Анализ квалификаторов
197+
if (!typeDescription.getQualifiers().isEmpty()) {
198+
System.out.println(" Квалификаторы:");
199+
typeDescription.getQualifiers().forEach(qualifier -> {
200+
if (qualifier instanceof StringQualifiers stringQual) {
201+
System.out.println(" Строковые: длина=" + stringQual.getLength() +
202+
", допустимая длина=" + stringQual.getAllowedLength());
203+
} else if (qualifier instanceof NumberQualifiers numberQual) {
204+
System.out.println(" Числовые: точность=" + numberQual.getPrecision() +
205+
", масштаб=" + numberQual.getScale());
206+
} else {
207+
System.out.println(" " + qualifier.getClass().getSimpleName() + ": " + qualifier);
208+
}
209+
});
210+
}
211+
212+
System.out.println();
213+
}
214+
}
215+
```
216+
217+
**Ожидаемый вывод:**
218+
219+
```sh
220+
=== АНАЛИЗ ТИПОВ РЕКВИЗИТОВ ===
221+
222+
Справочник: Справочник1
223+
=====================================
224+
Реквизит: Наименование
225+
Полное описание типа: Строка(100)
226+
Составной тип: false
227+
Количество типов в составе: 1
228+
Тип: PrimitiveValueType
229+
Примитивный тип: STRING
230+
Квалификаторы:
231+
Строковые: длина=100, допустимая длина=FIXED
232+
233+
Реквизит: СсылкаНаДругойСправочник
234+
Полное описание типа: СправочникСсылка.ДругойСправочник
235+
Составной тип: false
236+
Количество типов в составе: 1
237+
Тип: MetadataValueType
238+
Ссылка на объект: ДругойСправочник
239+
Тип метаданных: CATALOG
240+
Составной: false
241+
```
242+
243+
**Особенности нового функционала:**
244+
245+
1. **Полное описание типов**: Метод `getDescription()` возвращает понятное описание типа, включая квалификаторы
246+
2. **Составные типы**: Поддержка типов, содержащих несколько вариантов значений
247+
3. **Детальный анализ**: Возможность получить доступ к каждому типу в составе и его свойствам
248+
4. **Квалификаторы**: Полная информация о квалификаторах типов (длина строк, точность чисел и т.д.)
249+
5. **Ссылки на метаданные**: Извлечение информации о ссылках на объекты метаданных
250+
147251
### Работа с документами
148252

149253
```java
@@ -272,134 +376,26 @@ allModules.stream()
272376

273377
## Анализ типов данных
274378

275-
При чтении описания метаданных для объектов и их атрибутов вычисляются описания типов. Все сущности, имеющие описания типов данных, реализуют интерфейс `ValueTypeOwner`.
276-
277-
Ниже приведены примеры, как можно использовать данную информацию.
278-
279-
### Получение описания типа реквизита справочника
379+
При чтении описания метаданных для объектов и их атрибутов вычисляются описания типов. Все сущности, имеющие описания типов данных, реализуют интерфейс `ValueTypeOwner`.
280380

281-
Часть описания реквизита справочника
282-
283-
```xml
284-
<attributes uuid="dff5b5d8-762d-4490-a336-dcc8d93c17d5">
285-
<name>Реквизит2</name>
286-
<type>
287-
<types>Number</types>
288-
<numberQualifiers>
289-
<precision>10</precision>
290-
</numberQualifiers>
291-
</type>
292-
<minValue xsi:type="core:UndefinedValue"/>
293-
<maxValue xsi:type="core:UndefinedValue"/>
294-
<fillValue xsi:type="core:UndefinedValue"/>
295-
<fullTextSearch>Use</fullTextSearch>
296-
</attributes>
297-
```
298-
299-
Код, которым можно посмотреть описание типа
381+
### Работа с определяемыми типами
300382

301383
```java
302-
// найдем справочник из прочитанной конфигурации
303-
var childMDO = configuration.findChild("Catalog.Справочник1");
304-
305-
// проверим, что это на самом деле справочник
306-
if (childMDO.isPresent() && childMDO.get() instanceof Catalog catalog) {
307-
308-
// убедимся, что у справочника есть дочерние
309-
assertThat(catalog.getChildren()).isNotEmpty();
310-
311-
// найдем нужный дочерний (реквизит)
312-
var childAttribute = catalog.findChild(md -> "Реквизит2".equals(md.getName()));
313-
314-
// проверим, что он есть и нужного типа
315-
if (childAttribute.isPresent() && childAttribute.get() instanceof ObjectAttribute objectAttribute) {
316-
317-
// проверим наименование
318-
assertThat(objectAttribute.getName()).isEqualTo("Реквизит2");
319-
320-
// описание типа `getValueType`
321-
assertThat(objectAttribute.getValueType()).isNotNull();
322-
// убеимся в наличии примитивного типа СТРОКА в составе описания
323-
assertThat(objectAttribute.getValueType().contains(PrimitiveValueType.NUMBER)).isTrue();
324-
// убедимся, что тип не составно
325-
assertThat(objectAttribute.getValueType().isComposite()).isFalse();
326-
// убедимся, что квалификаторы прочитаны
327-
assertThat(objectAttribute.getValueType().getQualifiers()).hasSize(1);
328-
329-
// убедимся, что прочитан квалификатор числа
330-
var qualifier = objectAttribute.getValueType().getQualifiers().get(0);
331-
assertThat(qualifier).isInstanceOf(NumberQualifiers.class);
332-
333-
// убаимся, что квалификатор числа содожержит верную информацию
334-
var numberQualifiers = (NumberQualifiers) qualifier;
335-
assertThat(numberQualifiers.getPrecision()).isEqualTo(10); // длина 10
336-
assertThat(numberQualifiers.getScale()).isEqualTo(0); // точность 0
337-
assertThat(numberQualifiers.isNonNegative()).isFalse(); // возможны любые знаки
338-
}
339-
}
340-
}
341-
```
342-
343-
### Определение состава определяемого типа
344-
345-
Часть описания определяемого типа
346-
347-
```xml
348-
<name>ЗначениеДоступа</name>
349-
<type>
350-
<types>CatalogRef.ПапкиФайлов</types>
351-
<types>CatalogRef.ВнешниеПользователи</types>
352-
<types>CatalogRef.КлючиДоступа</types>
353-
<types>CatalogRef.ИдентификаторыОбъектовРасширений</types>
354-
<types>CatalogRef.ГруппыВнешнихПользователей</types>
355-
<types>CatalogRef.ГруппыПользователей</types>
356-
<types>EnumRef.ДополнительныеЗначенияДоступа</types>
357-
<types>ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения</types>
358-
<types>CatalogRef.ДополнительныеОтчетыИОбработки</types>
359-
<types>CatalogRef.Пользователи</types>
360-
<types>CatalogRef.ГруппыИсполнителейЗадач</types>
361-
<types>CatalogRef.УчетныеЗаписиЭлектроннойПочты</types>
362-
<types>CatalogRef.ИдентификаторыОбъектовМетаданных</types>
363-
</type>
364-
```
365-
366-
Код, которым можно посмотреть описание типа
367-
368-
```java
369-
370-
// найдем определяемый тип прочитанной конфигурации
384+
// Поиск определяемого типа и анализ его состава
371385
var childMDO = configuration.findChild("DefinedType.ЗначениеДоступа");
372386
if (childMDO.isPresent() && childMDO.get() instanceof DefinedType definedType) {
373-
assertThat(definedType.getName()).isEqualTo("ЗначениеДоступа");
374-
// убедимся, что тип прочитан
375-
assertThat(definedType.getValueType()).isNotNull();
376-
// убедимся, что в составе нет ЧИСЛА
377-
assertThat(definedType.getValueType().contains(PrimitiveValueType.NUMBER)).isFalse();
378-
// убедимся, что описание соответствует составному типу
379-
assertThat(definedType.getValueType().isComposite()).isTrue();
380-
// квалификаторов нет
381-
assertThat(definedType.getValueType().getQualifiers()).isEmpty();
382-
383-
// создадим типа по имени
384-
var typeContains = MetadataValueType.fromString("EnumRef.ДополнительныеЗначенияДоступа");
385-
386-
assertThat(typeContains).isNotNull();
387-
// полученый тип относится к перечислению
388-
assertThat(typeContains.getKind()).isEqualTo(MDOType.ENUM);
389-
// тип не составной
390-
assertThat(typeContains.isComposite()).isFalse();
391-
// есть имя на английском
392-
assertThat(typeContains.getName()).isEqualTo("EnumRef.ДополнительныеЗначенияДоступа");
393-
// и русском
394-
assertThat(typeContains.getNameRu()).isEqualTo("ПеречислениеСсылка.ДополнительныеЗначенияДоступа");
395-
396-
// второй тип
397-
var typeNotContains = MetadataValueType.fromString("CatalogRef.Контрагенты");
398-
assertThat(typeNotContains).isNotNull();
399-
// убедимся, что первый тип входит в состав описания
400-
assertThat(definedType.getValueType().contains(typeContains)).isTrue();
401-
// убедимся, что второй тип нпе входит в состав
402-
assertThat(definedType.getValueType().contains(typeNotContains)).isFalse();
387+
System.out.println("Определяемый тип: " + definedType.getName());
388+
389+
ValueTypeDescription typeDescription = definedType.getValueType();
390+
System.out.println(" Составной тип: " + typeDescription.isComposite());
391+
System.out.println(" Количество типов в составе: " + typeDescription.getTypes().size());
392+
393+
// Анализ каждого типа в составе
394+
typeDescription.getTypes().forEach(type -> {
395+
if (type instanceof MetadataValueType metadataType) {
396+
System.out.println(" - " + metadataType.getName() + " (" + metadataType.getKind() + ")");
397+
}
398+
});
403399
}
404400
```
405401

@@ -450,7 +446,7 @@ objectsWithPrefix.forEach(obj -> {
450446
### Построение диаграммы зависимостей объектов
451447

452448
```java
453-
// Упрощенный пример построения графа зависимостей между объектами
449+
// Построение графа зависимостей с использованием нового функционала анализа типов
454450
Map<String, Set<String>> dependencies = new HashMap<>();
455451

456452
// Сбор зависимостей из типов реквизитов справочников
@@ -459,14 +455,15 @@ configuration.getCatalogs().forEach(catalog -> {
459455
dependencies.putIfAbsent(catalogKey, new HashSet<>());
460456

461457
catalog.getAttributes().forEach(attribute -> {
462-
if (attribute.getType() != null) {
463-
String typeDescription = attribute.getType().getDescription();
464-
// Проверяем, что тип ссылается на другой объект метаданных
465-
if (typeDescription != null && typeDescription.contains("CatalogRef.")) {
466-
String referencedObject = typeDescription.replace("CatalogRef.", "Catalog.");
458+
ValueTypeDescription typeDescription = attribute.getType();
459+
460+
// Анализ каждого типа в составе
461+
typeDescription.getTypes().forEach(type -> {
462+
if (type instanceof MetadataValueType metadataType) {
463+
String referencedObject = metadataType.getKind() + "." + metadataType.getName();
467464
dependencies.get(catalogKey).add(referencedObject);
468465
}
469-
}
466+
});
470467
});
471468
});
472469

docs/ru/features.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@
2525
На данный момент поддерживается загрузка всех видов метаданных, существующих в версиях платформы 1С до 8.5. В зависимости от типа объекта и потребностей, объем читаемой информации может различаться (реализация чтения дополнительной информации выполняется от задач).
2626
Актуальное содержимое того или иного вида объекта метаданных можно всегда находится в классе его реализации в пакете [mdo](com.github._1c_syntax.bsl.mdo).
2727

28+
## Чтение типов реквизитов и метаданных
29+
30+
Библиотека предоставляет расширенные возможности для работы с типами данных реквизитов и метаданных:
31+
32+
- **Полное описание типов**: Чтение составных типов данных, включая примитивные типы, ссылки на объекты метаданных и определяемые типы
33+
- **Квалификаторы типов**: Поддержка всех видов квалификаторов (строковые, числовые, дата и т.д.)
34+
- **Составные типы**: Работа с типами, содержащими несколько вариантов значений
35+
- **Строковое представление**: Получение понятное описания типа через метод `getDescription()`
36+
- **Анализ зависимостей**: Возможность извлечения ссылок на объекты метаданных из типов реквизитов
37+
2838
Немного о структуре пакета:
2939

3040
- в корне расположены классы видов объектов метаданных (Справочники, Документы, Перечисления и т.д.), базовые интерфейсы

0 commit comments

Comments
 (0)