Skip to content

Conversation

theshadowco
Copy link
Member

@theshadowco theshadowco commented Oct 6, 2025

Описание

  1. реализовано чтение информации о стандартных реквизитах
  2. прочие мелкие исправление

Связанные задачи

Closes: #114

Чеклист

Общие

  • Ветка PR обновлена из develop
  • Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
  • Изменения покрыты тестами
  • Обязательные действия перед коммитом выполнены (запускал команду gradlew precommit)

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

Copy link

coderabbitai bot commented Oct 6, 2025

Walkthrough

Добавлены стандартные реквизиты: новый value‑type StandardAttribute, десериализация/парсинг XML для стандартных реквизитов, описание StdAtrInfo, автоматическое наполнение StdAttributeFiller, кеш в AbstractReaderContext и изменения в MDReaderContext; обновлены читатели Designer/EDT и тесты под увеличившиеся коллекции.

Changes

Cohort / File(s) Summary
Новый тип: StandardAttribute
src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java
Новый public value‑type StandardAttribute (реализует Attribute, AccessRightsOwner) с полями, builder, методами possibleRights(), getObjectBelonging(), getIndexing(), getName(), getValueType(), getDescription(String) и дефолтами.
Контекст чтения и кэш
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/AbstractReaderContext.java, src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java
В AbstractReaderContext добавлен per‑context cache, метод getFromCache, кэширование в setValue, Lombok‑геттеры для supportVariant и mdoReference; в MDReaderContext — новый конструктор, childrenContexts с геттером, отложенная инициализация mdoReference, вызов StdAttributeFiller.fill(this) при сборке если применимо.
Описатели стандартных реквизитов
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java, src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/package-info.java
Новый StdAtrInfo с множеством публичных статических дескрипторов (PREDEFINED, REF, CODE, DESCRIPTION, и т.д.), хранит nameEn, nameRu, valueType или computeValueType и набор compute* функций для вычисления ValueTypeDescription. Добавлен package-info.
Наполнение стандартных реквизитов
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java
Новый StdAttributeFiller с реестром MDOType → List<StdAtrInfo> и методом fill(MDReaderContext) для создания/привязки child‑контекстов, установки nameRu, type, mdoReference, обработки существующих атрибутов.
Designer: регистрация и конвертеры
src/main/java/com/github/_1c_syntax/bsl/reader/designer/DesignerReader.java, src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/MDChildConverter.java, src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java, src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/Unmarshaller.java
Зарегистрирован XStream‑алиас для StandardAttribute; MDChildConverter исключает StandardAttribute; добавлен StandardAttributeConverter для десериализации полей; Unmarshaller расширен для обработки узлов StandardAttributes/StandardAttribute.
EDT: регистрация и unmarshaller
src/main/java/com/github/_1c_syntax/bsl/reader/edt/EDTReader.java, src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java
Добавлен алиас/поддержка standardAttributes; Unmarshaller обновлён для обработки STANDARD_ATTRIBUTES_NODE, уточнена логика чтения типов/значений.
Форматные правки (без логики)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/EnumConverter.java, src/main/java/com/github/_1c_syntax/bsl/mdo/support/ReturnValueReuse.java
Реформатирование/реорганизация импортов и оформления; семантика не изменилась.
Тесты: обновлённые ожидания
src/test/java/.../ConfigurationTest.java, ExternalDataProcessorTest.java, ExternalReportTest.java, .../mdo/*Test.java, .../smoke/RightTest.java
Обновлены ожидаемые размеры коллекций и проверки в тестах из‑за добавления стандартных реквизитов; добавлены проверки AttributeKind.STANDARD и детальные проверки StandardAttribute в отдельных тестах; @Slf4j добавлен в один тест.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant XML as XML (Designer/EDT)
  participant Reader as Reader
  participant Unm as Unmarshaller
  participant Ctx as MDReaderContext
  participant Filler as StdAttributeFiller
  participant SA as StandardAttribute

  XML->>Reader: встречает узлы standardAttributes
  Reader->>Unm: делегирует чтение узлов
  Unm->>Ctx: создаёт/настраивает MDReaderContext для атрибута
  Unm->>SA: десериализует поля через StandardAttributeConverter
  Note right of Unm: чтение полей по ожидаемым типам из контекста
  Reader->>Ctx: вызывает build()
  Ctx->>Filler: если realClass реализует AttributeOwner → fill(this)
  Filler->>Ctx: создаёт/настраивает дочерние контексты, устанавливает nameRu, type, mdoReference
  Ctx-->>Reader: возвращает собранную структуру с заполненными стандартными реквизитами
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60–90 minutes

Possibly related PRs

Poem

Я кролик в коде, норка — XML,
Стандартный реквизит я нашёл, как дел.
Контекст закэшировал — и не дрожу,
Filler пришил имя, тип, ссылку — тужу.
Прыг‑скок, метаданные снова в порядке. 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title Check ❓ Inconclusive Заголовок частично отражает внедрение стандартных реквизитов, но содержит обобщённое «небольшие правки» и использует термин «хранение» вместо ключевого «чтение» или «заполнение» стандартных реквизитов, что делает его недостаточно конкретным. Пожалуйста, уточните заголовок, чтобы он чётко отражал основное изменение, например «Реализация чтения и заполнения стандартных реквизитов» и удалите расплывчатое «небольшие правки».
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues Check ✅ Passed В PR добавлены классы StandardAttribute, StdAtrInfo и StdAttributeFiller, обновлён MDReaderContext для вызова fill, что реализует чтение и заполнение стандартных реквизитов, а также введён флаг стандартного атрибута через StandardAttribute, что полностью соответствует задачам #114.
Out of Scope Changes Check ✅ Passed Все изменения либо реализуют поддержку чтения и заполнения стандартных реквизитов, либо попадают под «прочие мелкие исправления» из описания PR, не выявлено нерелевантных участков кода.
Description Check ✅ Passed Описание соответствует ключевым изменениям, упоминая реализацию чтения стандартных реквизитов и мелкие исправления, и связано с фактическим содержимым PR.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/stdAttr

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@theshadowco theshadowco marked this pull request as ready for review October 6, 2025 12:37
Copy link
Contributor

github-actions bot commented Oct 6, 2025

Test Results

  522 files  ± 0    522 suites  ±0   7m 0s ⏱️ +3s
  225 tests + 4    225 ✅ + 4  0 💤 ±0  0 ❌ ±0 
2 043 runs  +36  2 043 ✅ +36  0 💤 ±0  0 ❌ ±0 

Results for commit 0b11df3. ± Comparison against base commit 7341412.

♻️ This comment has been updated with latest results.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (15)
src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (1)

60-61: Проверьте ясность именования констант.

Добавлены новые константы для обработки стандартных реквизитов. Однако, TYPE_FIELD может вызвать путаницу с уже существующей константой VALUE_TYPE_FIELD (строка 59). Рассмотрите возможность использования более конкретного имени, например ELEMENT_TYPE_FIELD или FORM_ELEMENT_TYPE_FIELD.

src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/Unmarshaller.java (1)

61-66: StandardAttributes: проверьте корректность маппинга имени поля и отсутствие дублей

Сейчас для узла StandardAttribute устанавливается значение в поле "Attribute". Это выбивается из принятой схемы (обычно используем имя узла/коллекции) и может:

  • положить элементы не в ту коллекцию;
  • перетирать предыдущее значение при многократных вызовах сеттера;
  • дублировать элементы вместе с наполнением через StdAttributeFiller.

Рекомендации:

  • Убедиться, что у владельца действительно есть сеттер/коллекция с именем "Attribute" для стандартных реквизитов. Иначе используйте "StandardAttribute" (или "StandardAttributes") для консистентности с моделью/билдером.
  • Рассмотреть унификацию через readItemNode для узла StandardAttributes, если fieldType("StandardAttribute") возвращает StandardAttribute.class.
  • Проверьте отсутствия дублей при одновременном чтении из Designer и автодобавлении в MDReaderContext (StdAttributeFiller.fill).

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

Also applies to: 162-166

src/test/java/com/github/_1c_syntax/bsl/mdclasses/ConfigurationTest.java (2)

35-36: @slf4j в тесте не используется

Если логгер не планируется, можно убрать аннотацию/импорт, чтобы не раздувать поверхность. Нит.

Also applies to: 44-44


86-87: Жёсткие константы размеров делают тесты хрупкими

После добавления стандартных реквизитов значения выросли, но такие ассёрты будут часто ломаться при эволюции фикстур. Рассмотрите:

  • проверять нижнюю границу (isGreaterThan/Between);
  • или вычислять ожидание как сумму по группам (как сделано ниже для children), чтобы тест валидировал инвариант, а не «магическое число».

Also applies to: 199-201, 236-238

src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java (2)

137-139: Мелкая стилистика ассерта на тип значения

Можно упростить: assertThat(attribute.getValueType()).contains(ValueTypes.get("CatalogRef.Пользователи")) — читается проще.


156-165: testSSLFixture сейчас почти пустой

Имеет смысл добавить хотя бы базовые проверки (кол-во атрибутов/наличие конкретного StandardAttribute), чтобы тест приносил пользу, либо объединить с существующим сценарием SSL.

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java (3)

105-112: Новый конструктор для StandardAttribute: проверьте область видимости

Конструктор нужен для динамического создания контекстов стандартных реквизитов, но «public» расширяет API. Если используется только внутри ридеров/filler’а, рассмотрите package‑private или javadoc с назначением.


142-145: StdAttributeFiller.fill в build(): добавьте идемпотентность

build() может вызываться повторно; без защиты наполнение стандартных реквизитов потенциально приведёт к дублям в childrenContexts и росту коллекций. Рекомендация — локальный флаг:

+  private volatile boolean stdAttrsFilled;
...
-  if (AttributeOwner.class.isAssignableFrom(realClass)) {
-    StdAttributeFiller.fill(this);
-  }
+  if (AttributeOwner.class.isAssignableFrom(realClass) && !stdAttrsFilled) {
+    StdAttributeFiller.fill(this);
+    stdAttrsFilled = true;
+  }

Либо обеспечить идемпотентность внутри StdAttributeFiller (проверять наличие контекстов до добавления).


72-74: Публичный getter для childrenContexts раскрывает внутренности

Лучше предоставить целевой метод наподобие addChildContext(String, MDReaderContext) и скрыть саму Map, чтобы не нарушить инварианты и снизить связность.

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/AbstractReaderContext.java (2)

119-124: Кэш контекста: ок, но стоит слегка укрепить API

  • Идея с case‑insensitive ключами и ConcurrentHashMap — удачна.
  • Рекомендуется добавить null‑guard для key в getFromCache и перегрузку без default (например, Optional) для читаемости.
  • setValue записывает в кэш даже для «служебных» полей (например, name/nameRu), что используется далее — это ок. Важно подтвердить, что TransformationUtils.setValue безошибочно игнорирует неизвестные поля (иначе вызовы setValue("nameRu")/setValue("name") могут падать).

Пример точечной доработки:

   @SuppressWarnings("unchecked")
-  public <T> T getFromCache(String key, T defaultValue) {
-    return (T) cache.getOrDefault(key.toLowerCase(Locale.ROOT), defaultValue);
-  }
+  public <T> T getFromCache(String key, T defaultValue) {
+    var k = java.util.Objects.requireNonNull(key, "key");
+    return (T) cache.getOrDefault(k.toLowerCase(Locale.ROOT), defaultValue);
+  }
+
+  public <T> java.util.Optional<T> getFromCache(String key) {
+    var k = java.util.Objects.requireNonNull(key, "key");
+    return java.util.Optional.ofNullable((T) cache.get(k.toLowerCase(Locale.ROOT)));
+  }

И просьба подтвердить: TransformationUtils.setValue не бросает при неизвестном имени поля? Если да — можно оставить текущие вызовы setValue("name"/"nameRu"); если нет — лучше предварительно проверять fieldType != null.

Also applies to: 129-137, 146-149, 169-172


207-208: Детерминированная сортировка модулей

Сортировка по Module::toString может зависеть от реализации toString/локали. Лучше явный ключ: тип + URI.

-    modules.sort(Comparator.comparing(Module::toString));
+    modules.sort(
+      Comparator.comparing(Module::getModuleType)
+        .thenComparing(m -> m.getUri().toString())
+    );
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java (1)

38-55: Упростить за счёт повторного использования общего Unmarshaller

Сейчас парсинг StandardAttribute реализован вручную. Можно переиспользовать общий путь (super.read), а атрибут name подхватить из XML‑атрибута до чтения:

   @Override
   public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-    var readerContext = new MDReaderContext(reader);
-    var attributeName = reader.getAttribute("name");
-    readerContext.setName(attributeName);
-    readerContext.setValue("name", attributeName);
-    while (reader.hasMoreChildren()) {
-      reader.moveDown();
-      var name = reader.getNodeName();
-      var fieldClass = readerContext.fieldType(name);
-      if (fieldClass != null) {
-        var value = ExtendXStream.readValue(context, fieldClass);
-        readerContext.setValue(name, value);
-      }
-      reader.moveUp();
-    }
-    return readerContext;
+    // читаем имя до прохода Unmarshaller
+    var attrName = reader.getAttribute("name");
+    var ctx = (MDReaderContext) super.read(reader, context);
+    if (attrName != null) {
+      ctx.setName(attrName);
+      ctx.setValue("name", attrName);
+    }
+    return ctx;
   }

Дополнительно просьба подтвердить: TransformationUtils.setValue безопасен при setValue("name") для StandardAttribute (такого поля нет в модели, используется только кэш). Если нет — оградить установку проверкой fieldType("name") или try/catch.

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (2)

58-62: Громкость лога при отсутствии реестра стандартных реквизитов

WARN для штатной ситуации шумит. Предлагаю DEBUG/INFO.

-    if (stdAttributes.isEmpty()) {
-      LOGGER.warn("Для {} нет настроенных стандартных реквизитов", parentContext.getMdoType());
-    }
+    if (stdAttributes.isEmpty()) {
+      LOGGER.debug("Для {} нет настроенных стандартных реквизитов", parentContext.getMdoType());
+    }

87-96: Кейс‑инсенситивность кэша: использовать getFromCache вместо прямого map.get

Для единообразия и устойчивости к регистру ключей лучше не обращаться к raw map.

-    var nameRu = stdAttribute.getFromCache("nameRu", "");
+    var nameRu = stdAttribute.getFromCache("nameRu", "");

И аналогично в местах прямого доступа в StdAtrInfo (см. computeOwner).

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1)

159-172: Доступ к кэшу: избегать прямого get для устойчивости к регистру

Сейчас используется parentContext.getCache().get("owners"). Кэш кейс‑инсенситивный, но напрямую это неочевидно. Лучше через getFromCache.

-    var owners = parentContext.getCache().get("owners");
+    var owners = parentContext.getFromCache("owners", null);

С последующей проверкой на null. Это выровняет стиль с остальным кодом и снизит риск регистровых ошибок.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7341412 and 338e9d3.

⛔ Files ignored due to path filters (60)
  • src/test/resources/fixtures/external/ТестоваяВнешняяОбработка.json is excluded by !**/*.json
  • src/test/resources/fixtures/external/ТестоваяВнешняяОбработка_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/external/ТестовыйВнешнийОтчет.json is excluded by !**/*.json
  • src/test/resources/fixtures/external/ТестовыйВнешнийОтчет_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/AccountingRegisters.РегистрБухгалтерии1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/AccumulationRegisters.РегистрНакопления1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/BusinessProcesses.БизнесПроцесс1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/BusinessProcesses.БизнесПроцесс1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/CalculationRegisters.РегистрРасчета1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/CalculationRegisters.РегистрРасчета1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Catalogs.Справочник1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Catalogs.Справочник1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ChartsOfAccounts.ПланСчетов1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ChartsOfAccounts.ПланСчетов1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ChartsOfCalculationTypes.ПланВидовРасчета1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ChartsOfCharacteristicTypes.ПланВидовХарактеристик1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ChartsOfCharacteristicTypes.ПланВидовХарактеристик1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Configuration.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Configuration_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Documents.Документ1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Documents.Документ1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Enums.Перечисление1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Enums.Перечисление1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ExchangePlans.ПланОбмена1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ExchangePlans.ПланОбмена1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ExternalDataSources.ТекущаяСУБД.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/ExternalDataSources.ТекущаяСУБД_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/InformationRegisters.РегистрСведений1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/InformationRegisters.РегистрСведений1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Reports.Отчет1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Reports.Отчет1_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses/Tasks.Задача1.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses_3_18/Configuration.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses_3_18/Configuration_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses_3_24/Configuration_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses_5_1/Configuration.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses_ext/Configuration.json is excluded by !**/*.json
  • src/test/resources/fixtures/mdclasses_ext/Configuration_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/BusinessProcesses.Задание.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/BusinessProcesses.Задание_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Catalogs.ВерсииФайлов.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Catalogs.ВерсииФайлов_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Catalogs.Заметки.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Catalogs.Заметки_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/ChartsOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/ChartsOfCharacteristicTypes.ДополнительныеРеквизитыИСведения_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/DataProcessors.ЗагрузкаКурсовВалют.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/DataProcessors.ЗагрузкаКурсовВалют_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Documents.Анкета.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Documents.Анкета_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Enums.СтатусыОбработчиковОбновления.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Enums.СтатусыОбработчиковОбновления_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/ExchangePlans.ОбновлениеИнформационнойБазы.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/ExchangePlans.ОбновлениеИнформационнойБазы_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/InformationRegisters.СклоненияПредставленийОбъектов.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/InformationRegisters.СклоненияПредставленийОбъектов_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/InformationRegisters.ЭлектронныеПодписи.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/InformationRegisters.ЭлектронныеПодписи_edt.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Tasks.ЗадачаИсполнителя.json is excluded by !**/*.json
  • src/test/resources/fixtures/ssl_3_1/Tasks.ЗадачаИсполнителя_edt.json is excluded by !**/*.json
📒 Files selected for processing (22)
  • src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/mdo/support/ReturnValueReuse.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/AbstractReaderContext.java (7 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java (6 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/EnumConverter.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/designer/DesignerReader.java (2 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/MDChildConverter.java (2 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/Unmarshaller.java (4 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/edt/EDTReader.java (2 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (5 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdclasses/ConfigurationTest.java (5 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdclasses/ExternalDataProcessorTest.java (1 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdclasses/ExternalReportTest.java (1 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdo/AccumulationRegisterTest.java (2 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdo/CalculationRegisterTest.java (2 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java (5 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdo/ChartOfAccountsTest.java (2 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/mdo/InformationRegisterTest.java (1 hunks)
  • src/test/java/com/github/_1c_syntax/bsl/smoke/RightTest.java (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java (3)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/AbstractReaderContext.java (1)
  • AbstractReaderContext (52-210)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/AbstractReadConverter.java (1)
  • AbstractReadConverter (32-38)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/MDChildConverter.java (1)
  • DesignerConverter (45-87)
src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (2)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java (1)
  • EqualsAndHashCode (56-175)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1)
  • Value (39-224)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (2)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/Unmarshaller.java (1)
  • UtilityClass (44-224)
src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (1)
  • UtilityClass (45-155)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
  • GitHub Check: build (17, windows-latest)
  • GitHub Check: build (23, ubuntu-latest)
  • GitHub Check: build (17, macOS-latest)
  • GitHub Check: build (21, ubuntu-latest)
  • GitHub Check: build (23, macOS-latest)
  • GitHub Check: build (23, windows-latest)
  • GitHub Check: build (17, ubuntu-latest)
  • GitHub Check: build (21, windows-latest)
  • GitHub Check: QA
  • GitHub Check: build (21, macOS-latest)
  • GitHub Check: build (17, macOS-latest)
  • GitHub Check: build (23, macOS-latest)
  • GitHub Check: build (23, ubuntu-latest)
  • GitHub Check: build (21, windows-latest)
  • GitHub Check: build (17, ubuntu-latest)
  • GitHub Check: build (21, ubuntu-latest)
  • GitHub Check: build (23, windows-latest)
  • GitHub Check: build (17, windows-latest)
🔇 Additional comments (26)
src/test/java/com/github/_1c_syntax/bsl/mdo/CalculationRegisterTest.java (1)

24-24: Тест корректно обновлён под добавление стандартных реквизитов.

Изменения правильно отражают добавление стандартных атрибутов:

  • Общее количество атрибутов увеличилось с 2 до 14 (добавлено 12 стандартных)
  • Количество дочерних элементов увеличилось с 3 до 15
  • Метод getAttributes() теперь возвращает 12 стандартных атрибутов (ранее возвращал пустую коллекцию)

Проверка allMatch(attribute -> attribute.getKind() == AttributeKind.STANDARD) корректно верифицирует, что все возвращаемые атрибуты имеют тип STANDARD.

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

Also applies to: 44-45, 48-50

src/test/java/com/github/_1c_syntax/bsl/mdo/AccumulationRegisterTest.java (3)

24-24: Импорт необходим и корректно используется.

Импорт AttributeKind требуется для проверки типа атрибутов в строке 46.


44-46: Проверка стандартных атрибутов выглядит корректно.

Утверждение проверяет, что все 5 атрибутов имеют тип STANDARD, что соответствует целям PR по добавлению стандартных реквизитов. Убедитесь, что тестовые данные для РегистрНакопления1 действительно содержат именно 5 стандартных атрибутов и не предполагают пользовательских атрибутов.


52-52: Увеличение количества дочерних элементов согласуется с добавлением стандартных атрибутов.

Изменение с 2 на 7 дочерних элементов математически корректно: 1 ресурс + 1 измерение + 5 стандартных атрибутов = 7 элементов. Это подтверждает, что стандартные атрибуты теперь включаются в коллекцию getChildren().

src/test/java/com/github/_1c_syntax/bsl/mdo/ChartOfAccountsTest.java (2)

24-24: Импорт добавлен корректно.

Импорт AttributeKind необходим для новой проверки на строке 48, которая валидирует, что все атрибуты имеют вид STANDARD.


44-48: Семантика методов getAttributes() и getAllAttributes() подтверждена
getAttributes() используется исключительно в тестах, в продакшен-коде вызовов нет, изменение не нарушает обратную совместимость.

src/test/java/com/github/_1c_syntax/bsl/mdclasses/ExternalDataProcessorTest.java (1)

62-62: Корректное обновление теста.

Увеличение ожидаемого количества дочерних элементов с 6 до 7 соответствует добавлению стандартных реквизитов в объекты.

src/test/java/com/github/_1c_syntax/bsl/smoke/RightTest.java (1)

47-47: Корректное обновление теста.

Увеличение ожидаемого количества классов, реализующих AccessRightsOwner, с 43 до 44 соответствует добавлению класса StandardAttribute.

src/test/java/com/github/_1c_syntax/bsl/mdclasses/ExternalReportTest.java (1)

66-66: Корректное обновление теста.

Увеличение ожидаемого количества дочерних элементов с 9 до 10 соответствует добавлению стандартных реквизитов.

src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/EnumConverter.java (1)

1-76: Только форматирование кода.

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

src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/MDChildConverter.java (2)

29-29: LGTM!

Импорт класса StandardAttribute необходим для использования в методе canConvert.


69-69: Корректное исключение StandardAttribute из общего конвертера.

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

src/main/java/com/github/_1c_syntax/bsl/reader/edt/EDTReader.java (2)

46-46: LGTM!

Импорт класса StandardAttribute необходим для регистрации XML-алиаса.


248-248: Корректная регистрация XML-алиаса для стандартных реквизитов.

Регистрация алиаса standardAttributesStandardAttribute.class обеспечивает десериализацию стандартных реквизитов из формата EDT.

src/main/java/com/github/_1c_syntax/bsl/reader/designer/DesignerReader.java (2)

46-46: LGTM!

Импорт класса StandardAttribute необходим для регистрации XML-алиаса.


251-251: Корректная регистрация XML-алиаса для стандартных реквизитов.

Регистрация алиаса StandardAttributeStandardAttribute.class обеспечивает десериализацию стандартных реквизитов из формата Designer.

src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (4)

26-26: LGTM!

Импорт класса StandardAttribute необходим для обработки узлов стандартных реквизитов.


108-113: LGTM!

Рефакторинг с использованием локальной переменной value и динамического определения fieldClass улучшает читаемость и поддерживает обработку стандартных реквизитов.


125-125: Хорошее использование константы.

Замена магической строки "type" на константу TYPE_FIELD улучшает поддерживаемость кода.


89-92: Проверьте наличие поля или геттер/сеттер attributes в MDReaderContext или его супертипах — по результатам поиска в коде таких элементов не найдено, что может привести к ошибке десериализации XML-узла standardAttributes.

src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/Unmarshaller.java (1)

167-169: Fallback к String через Objects.requireNonNullElse — удачное упрощение

Хорошее улучшение читаемости и безопасности по null, поведение прежнее.

src/test/java/com/github/_1c_syntax/bsl/mdo/InformationRegisterTest.java (1)

37-38: Расширение кейсов CSV выглядит корректно

Добавление не‑EDT варианта и нового регистра повышает покрытие. Без замечаний.

src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java (2)

53-56: Обновлённые размеры коллекций каталога соответствуют добавлению стандартных реквизитов

Рост размеров children/plainChildren/attributes/storageFields ожидаем. Ассерты выглядят консистентно с остальными проверками.

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

Also applies to: 61-63, 73-81, 104-121


140-154: Проверки StandardAttribute.PredefinedDataName — отлично

Хорошо, что проверены имя, локали, MDO‑ссылка, kind и тип значения (STRING). Это подтверждает корректную десериализацию и наполнение.

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java (1)

125-129: Ленивая инициализация mdoReference — ок

Избегает повторного пересоздания при повторных сборках. Без замечаний.

src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (1)

48-55: Иммутабельная модель стандартного реквизита — выглядит корректно

  • Семантика @Value/@builder, кастомный getValueType и possibleRights — ок.
  • getDescription с fallback по синониму/полным именам — ожидаемо.

Also applies to: 157-166, 167-182

@theshadowco theshadowco changed the title Хранение стандартных реквизитов + фиксы Хранение стандартных реквизитов + небольшие правки Oct 6, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (1)

85-85: TODO: реализовать удаление ненужных стандартных реквизитов.

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

Хотите, чтобы я создал задачу для отслеживания этой доработки?

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (2)

131-156: Рассмотрите защиту от NumberFormatException.

Использование Integer.parseInt на значениях из кэша может вызвать NumberFormatException при некорректных данных. Хотя безопасные значения по умолчанию предоставлены через getFromCache, для большей надежности можно добавить обработку исключений или использовать более безопасные методы парсинга (например, NumberUtils.toInt из Apache Commons).

Пример с обработкой исключения:

 private static ValueTypeDescription computeDescription(MDReaderContext parentContext) {
-  var descriptionLength = Integer.parseInt(parentContext.getFromCache("descriptionLength", "100"));
+  int descriptionLength;
+  try {
+    descriptionLength = Integer.parseInt(parentContext.getFromCache("descriptionLength", "100"));
+  } catch (NumberFormatException e) {
+    LOGGER.debug("Неверный формат descriptionLength, используется значение по умолчанию", e);
+    descriptionLength = 100;
+  }
   return ValueTypeDescription.createString(descriptionLength);
 }

174-223: TODO: завершить реализацию вычислений типов.

Несколько методов вычисления типов (computeRecorder, computeRecordType, computeRoutePoint, computeBusinessProcess, computeType, computeCalculationType) возвращают EMPTY с комментариями TODO. Это приемлемо для начальной реализации, но требует дальнейшей доработки для полноценной функциональности.

Хотите, чтобы я помог реализовать эти методы или создал задачи для отслеживания этих доработок?

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 338e9d3 and 53c7997.

📒 Files selected for processing (6)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/AbstractReaderContext.java (7 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/package-info.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java (1 hunks)
  • src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (5 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (2)
src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (1)
  • UtilityClass (45-154)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/Unmarshaller.java (1)
  • UtilityClass (44-224)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java (2)
src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/AbstractReadConverter.java (1)
  • AbstractReadConverter (32-38)
src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/MDChildConverter.java (1)
  • DesignerConverter (45-87)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1)
src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (1)
  • Value (48-183)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
  • GitHub Check: QA
  • GitHub Check: build (23, windows-latest)
  • GitHub Check: build (23, ubuntu-latest)
  • GitHub Check: build (17, windows-latest)
  • GitHub Check: build (21, windows-latest)
  • GitHub Check: build (21, ubuntu-latest)
  • GitHub Check: build (17, macOS-latest)
  • GitHub Check: build (23, macOS-latest)
  • GitHub Check: build (17, ubuntu-latest)
  • GitHub Check: build (23, windows-latest)
  • GitHub Check: build (23, macOS-latest)
  • GitHub Check: build (17, macOS-latest)
  • GitHub Check: build (23, ubuntu-latest)
  • GitHub Check: build (17, ubuntu-latest)
  • GitHub Check: build (21, macOS-latest)
  • GitHub Check: build (21, windows-latest)
  • GitHub Check: build (21, ubuntu-latest)
  • GitHub Check: build (17, windows-latest)
🔇 Additional comments (12)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/package-info.java (1)

1-25: LGTM!

Файл документации пакета оформлен корректно с надлежащей лицензией и описанием.

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/AbstractReaderContext.java (4)

119-123: LGTM!

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


146-150: LGTM!

Кэширование значений с приведением ключей к нижнему регистру обеспечивает регистронезависимый доступ к данным.


169-172: LGTM!

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


207-207: Проверьте намеренность сортировки локального списка modules. Сортировка по Module::toString() изменяет исходный порядок элементов, сформированный moduleTypes. Убедитесь, что это не нарушит логику обработки и загрузки модулей.

src/main/java/com/github/_1c_syntax/bsl/reader/edt/converter/Unmarshaller.java (2)

88-91: LGTM!

Корректная обработка узла standardAttributes с маппингом на коллекцию attributes через класс StandardAttribute.


107-112: LGTM!

Улучшенная логика чтения значений с обработкой случаев, когда fieldClass равен null — значение читается как String.

src/main/java/com/github/_1c_syntax/bsl/reader/designer/converter/StandardAttributeConverter.java (1)

38-54: Проверьте: возврат контекста вместо построенного объекта.

Метод unmarshal возвращает MDReaderContext вместо вызова readerContext.build(). Убедитесь, что это соответствует общему паттерну десериализации в проекте, где построение объекта может происходить на более позднем этапе.

Проверка показывает, что AbstractReadConverter.read() также возвращает MDReaderContext (см. relevant_code_snippets для AbstractReadConverter.java), что подтверждает корректность этого подхода.

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAttributeFiller.java (3)

63-66: LGTM!

Проблема с направлением проверки isAssignableFrom исправлена. Теперь корректно используется StandardAttribute.class.isAssignableFrom(context.getRealClass()) для фильтрации существующих стандартных реквизитов.


277-284: LGTM!

Потокобезопасность обеспечена использованием Collections.synchronizedList(new ArrayList<>()) при создании новых коллекций дочерних контекстов.


98-271: LGTM!

Реестр стандартных реквизитов для различных типов метаданных заполнен корректно и покрывает основные типы объектов 1С (регистры, справочники, документы, планы счетов и т.д.).

src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1)

48-97: LGTM!

Статические дескрипторы стандартных реквизитов определены корректно с соответствующими типами данных и функциями вычисления.

Copy link

sonarqubecloud bot commented Oct 6, 2025

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (2)

76-80: Рассмотрите переименование поля type для ясности.

Поле type с аннотацией @Getter(AccessLevel.NONE) может вводить в заблуждение, поскольку:

  • Lombok не генерирует getter для этого поля
  • Вместо этого реализован явный метод getValueType() (строки 163-165)

Рассмотрите переименование поля в valueType или valueTypeDescription для соответствия имени метода и улучшения читаемости.

Применить этот diff:

   @Default
   @Getter(AccessLevel.NONE)
-  ValueTypeDescription type = ValueTypeDescription.EMPTY;
+  ValueTypeDescription valueType = ValueTypeDescription.EMPTY;

   ...

   @Override
   public ValueTypeDescription getValueType() {
-    return type;
+    return valueType;
   }

61-64: Документируйте в JavaDoc, что у всех стандартных атрибутов одного владельца одинаковый uuid, и fullName служит единственным различителем в equals/hashCode.

fullName подтверждён уникальным среди StdAtrInfo.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 53c7997 and 0b11df3.

📒 Files selected for processing (1)
  • src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (2)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/MDReaderContext.java (1)
  • EqualsAndHashCode (56-175)
src/main/java/com/github/_1c_syntax/bsl/reader/common/context/std_attributes/StdAtrInfo.java (1)
  • Value (39-224)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
  • GitHub Check: build (17, ubuntu-latest)
  • GitHub Check: QA
  • GitHub Check: build (21, ubuntu-latest)
  • GitHub Check: build (23, ubuntu-latest)
  • GitHub Check: build (23, windows-latest)
  • GitHub Check: build (17, macOS-latest)
  • GitHub Check: build (21, windows-latest)
  • GitHub Check: build (17, windows-latest)
  • GitHub Check: build (21, macOS-latest)
  • GitHub Check: build (17, macOS-latest)
  • GitHub Check: build (23, windows-latest)
  • GitHub Check: build (23, macOS-latest)
  • GitHub Check: build (23, ubuntu-latest)
  • GitHub Check: build (21, ubuntu-latest)
  • GitHub Check: build (21, macOS-latest)
  • GitHub Check: build (21, windows-latest)
  • GitHub Check: build (17, windows-latest)
  • GitHub Check: build (17, ubuntu-latest)
🔇 Additional comments (2)
src/main/java/com/github/_1c_syntax/bsl/mdo/children/StandardAttribute.java (2)

45-54: LGTM: Корректное объявление класса.

Использование Lombok-аннотаций (@value, @builder) и настройка toString/equals/hashCode на основе uuid и fullName выглядят правильно для value-type класса стандартного атрибута.


135-183: LGTM: Методы реализованы корректно.

Все методы имеют корректную реализацию:

  • possibleRights() возвращает фиксированный список прав (VIEW, EDIT)
  • getObjectBelonging() всегда возвращает OWN, что правильно для стандартных реквизитов
  • getIndexing() всегда возвращает DONT_INDEX, так как у стандартных реквизитов нет настроек индексирования
  • getDescription() имеет грамотную fallback-логику с приоритетом: synonym(code) → synonym(any) → fullName(code)

@theshadowco theshadowco merged commit 63733f7 into develop Oct 6, 2025
25 checks passed
@theshadowco theshadowco deleted the feature/stdAttr branch October 6, 2025 16:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Стандартные реквизиты

1 participant