Skip to content

feat(types): структуры-параметры обработчиков формы знают предопределённый платформой состав - #4366

Merged
nixel2007 merged 4 commits into
developfrom
feat/form-handler-structure-parameters
Aug 2, 2026
Merged

feat(types): структуры-параметры обработчиков формы знают предопределённый платформой состав#4366
nixel2007 merged 4 commits into
developfrom
feat/form-handler-structure-parameters

Conversation

@sfaqer

@sfaqer sfaqer commented Aug 2, 2026

Copy link
Copy Markdown
Member

Тип у структуры, которую платформа сама передаёт в обработчик, объявлен как Структура — то есть не сказано ничего. Состав при этом платформа называет, но прозой, в описании параметра. Из-за этого в ПередЗаписью не работало ничего: ПараметрыЗаписи. не предлагал ключей, РежимЗаписи оставался невыведенным, а UnknownMember считал предопределённый ключ опечаткой.

Состав переписан из синтакс-помощника в FormPlatformTypes.PREDEFINED_STRUCTURE_PARAMETERS и навешивается StructureParameterFieldsRegistrar.

Владелец Параметр Ключи
Расширение …для документа ПараметрыЗаписи РежимЗаписи: РежимЗаписиДокумента, РежимПроведения: РежимПроведенияДокумента
…для задачи ПараметрыЗаписи ВыполнитьЗадачу: Булево
…для бизнес-процесса ПараметрыЗаписи Старт: Булево
Расширение поля формы для поля ввода ПараметрыПолученияДанных СтрокаПоиска, Отбор, ВыборГруппИЭлементов, СпособПоискаСтроки, ПолнотекстовыйПоиск, РежимПолученияДанныхВыбора

У форм задачи и бизнес-процесса блок «Тип» у параметра отсутствует вовсе — тот же дефект СП, что у бестиповых свойств элементов; там этой же правкой появляется и сам тип.

Решения, которые стоит посмотреть

Ключ закреплён за параметром, а не за событием. Платформа кладёт одну и ту же структуру во все пять событий записи и принимает её же методом Записать, поэтому и правка одна на всех. Ложится она на тип, где параметр объявлен (расширение формы, расширение элемента) — формы наследуют его через registerExtension, так что работают и обработчик с каноническим именем события, и переименованный в Form.xml.

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

Оба написания имени ключа заводятся отдельными полями. Ключ структуры — строка, а не идентификатор: за ним не стоит MemberDescriptor с двумя написаниями, сопоставление идёт голой строкой. Платформа документирует оба (СтрокаПоиска (SearchString)), а какое кладёт на конкретном проекте — не говорит, поэтому заводятся оба. Цена — в ховере и автодополнении видно оба написания. Если считаешь, что надо одно по ScriptVariant конфигурации, это снятие одной строки в fieldsOf.

Что сознательно не вошло

  • Состав, зависящий от источника события: ДополнительныеПараметры у событий поля табличного документа несут Дата только когда событие породила диаграмма Ганта, а у диаграммы набор другой. «Предопределённым» такой состав назвать нельзя.
  • ОбработкаПолученияДанныхВыбора и ПолучитьДанныеВыбора модулей менеджера: состав тот же, что у поля ввода, но объявлены они на generic-типах (СправочникМенеджер.<Имя справочника>), и до специализаций правка члена доходит другим путём — отдельная работа.
  • Проброс ключей, которые кладёт прикладной код (Записать(Новый Структура("ЗакрытьПослеЗаписи", Истина))), — это обогащение контекстом конфигурации, а не платформы; тоже отдельно.

Оба пункта описаны в javadoc словаря, чтобы не искать заново.

Вторым коммитом — независимая правка рядом

TYPELESS_MEMBER_TYPES был единственным словарём в FormPlatformTypes, который сопоставлялся не через matches, а точным попаданием в ключ карты (typeByMember.get(member.name())) — с учётом регистра и только по primary-написанию. Живой ошибки не было (у членов из СП русское написание есть всегда), но правило там отличалось от соседних словарей того же вида. Отдельным реквестом не выносил: поведение для пользователя не меняется, отдельной строки в changelog не заслуживает — скажи, если всё же надо разделить.

Проверки

  • FormModuleInferenceTest — четыре теста без СП, на фикстуре: состав виден в обработчике, предопределённый ключ резолвится и UnknownMember на нём молчит, опечатка по-прежнему ловится, свой ключ из Вставить живёт рядом с платформенными.
  • FormParametersHbkTest — пять тестов на реальном СП: типы значений, появление Структура там, где платформа тип не объявила, одинаковость состава по всем событиям записи и методу Записать, ключи поля ввода, плюс сверка словаря с платформой целиком — по образцу такой же сверки для бестиповых свойств.
  • FormItemTypesRegistrarHelpersTest — шесть случаев на сопоставление имени свойства, включая английское написание и регистр.
  • Полный cleanTest check локально зелёный.

Все имена и типы в словаре взяты из СП, а не выведены по смыслу: английские написания ключей (WriteMode, PostingMode, ExecuteTask, Start, SearchString, …) сняты обходом HBK по одноимённым членам и параметрам платформы.

Summary by CodeRabbit

  • New Features

    • Added predefined fields and type information for form-handler structure parameters.
    • Added support for Russian and English field names with case-insensitive matching.
    • Preserved custom structure keys alongside predefined fields.
    • Improved type inference for form parameters and input fields.
    • Form type information now reflects the project’s configured source language.
  • Bug Fixes

    • Corrected type resolution for bilingual form members and shared parameter definitions.
  • Tests

    • Added coverage for structure fields, multilingual keys, fallback types, and form-member inference.

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The registry now resolves the project language and enriches form structure parameters with predefined fields. Registration preserves existing metadata and supports bilingual member matching. Tests cover write parameters, choice-data parameters, aliases, unknown keys, and language fallback.

Changes

Form structure parameter enrichment

Layer / File(s) Summary
Project language resolution
src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProvider.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContextTest.java
ServerContext derives the project language from configuration metadata. DocumentContext and form registration use this language.
Platform metadata and bilingual matching
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormPlatformTypes.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrar.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrarHelpersTest.java
Shared constants and predefined parameter metadata define structure fields. Typeless member matching accepts Russian and English names.
Structure field registration
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/StructureParameterFieldsRegistrar.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormTypesProvider.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderHelpersTest.java
The registrar resolves structure and field types, preserves parameter metadata, adds predefined fields, and runs before form type registration.
Inference validation and documentation
src/test/java/com/github/_1c_syntax/bsl/languageserver/types/FormModuleInferenceTest.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormParametersHbkTest.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md
Tests cover predefined fields, localized keys, unknown keys, parameter composition, and field type resolution. Documentation describes registration and inheritance behavior.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ConfigurationTypesProvider
  participant ServerContext
  participant FormTypesProvider
  participant StructureParameterFieldsRegistrar
  participant FormTypeRegistry
  ConfigurationTypesProvider->>ServerContext: resolve project Language
  ConfigurationTypesProvider->>FormTypesProvider: register forms with Language
  FormTypesProvider->>StructureParameterFieldsRegistrar: register predefined structure fields
  StructureParameterFieldsRegistrar->>FormTypeRegistry: resolve and enrich parameter types
  FormTypesProvider->>FormTypeRegistry: register configuration forms
Loading

Possibly related PRs

Suggested reviewers: nixel2007

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.84% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: predefined platform fields are added to form-handler structure parameters.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/form-handler-structure-parameters

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.

@sonarqubecloud

sonarqubecloud Bot commented Aug 2, 2026

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Test Results

 3 942 files  + 6   3 942 suites  +6   1h 11m 55s ⏱️ + 6m 27s
 4 068 tests +15   3 997 ✅ +10   71 💤 + 5  0 ❌ ±0 
24 408 runs  +90  23 978 ✅ +60  430 💤 +30  0 ❌ ±0 

Results for commit bb2edc4. ± Comparison against base commit 50d66d6.

@nixel2007

Copy link
Copy Markdown
Member

Если считаешь, что надо одно по ScriptVariant конфигурации, это снятие одной строки в fieldsOf.

Да, я не помню в реальном автокомплите платформы английских имён при русском script variant

sfaqer and others added 3 commits August 2, 2026 16:58
…бработчиков формы

Тип у такой структуры объявлен как «Структура» — то есть не сказано ничего,
а состав платформа называет прозой в описании параметра. Из-за этого
ПараметрыЗаписи.РежимЗаписи не резолвился, автодополнение по точке не
предлагало ничего, а UnknownMember считал предопределённый ключ опечаткой.

Состав переписан из синтакс-помощника в
FormPlatformTypes.PREDEFINED_STRUCTURE_PARAMETERS и навешивается
StructureParameterFieldsRegistrar на тип, где параметр объявлен, — формы
наследуют его через registerExtension. Ключ закреплён за параметром, а не за
событием: платформа кладёт одну и ту же структуру во все события записи и
принимает её же методом Записать.

У форм задачи и бизнес-процесса этой же правкой появляется и сам тип: блока
«Тип» у параметра в синтакс-помощнике нет вовсе.

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

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…аниям имени

TYPELESS_MEMBER_TYPES был единственным словарём FormPlatformTypes, который
искался точным попаданием в ключ карты (typeByMember.get(member.name())), а не
двуязычным matches: с учётом регистра и только по primary-написанию. Живой
ошибки не было — у членов из синтакс-помощника русское написание есть всегда, —
но правило отличалось от соседних словарей того же вида.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sonar java:S109 на множителе 2 в расчёте вместимости карты. Имя объясняет,
откуда двойка: у ключа структуры два написания, и каждое занимает своё место.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sfaqer sfaqer changed the title Структуры-параметры обработчиков формы знают предопределённый платформой состав feat(types): структуры-параметры обработчиков формы знают предопределённый платформой состав Aug 2, 2026
Ключ структуры — строка, а не идентификатор: платформа кладёт её на языке
конфигурации, и в русской конфигурации английского написания там не будет.
Заводились оба, из-за чего `ПараметрыЗаписи.WriteMode` в русском проекте
считался верным, хотя на выполнении не сработает. Теперь берётся одно
написание — по варианту встроенного языка.

Расчёт языка проекта не продублирован: он поднят из DocumentContext в
ServerContext, где живёт конфигурация, — его спрашивают и там, где документа
нет (регистрация типов). У документа осталась своя единственная поправка —
OS-файл к конфигурации не относится.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sfaqer
sfaqer force-pushed the feat/form-handler-structure-parameters branch from bb2edc4 to 6a82387 Compare August 2, 2026 07:14
@sfaqer

sfaqer commented Aug 2, 2026

Copy link
Copy Markdown
Member Author

Согласен, поправил — теперь заводится одно написание, по варианту встроенного языка конфигурации (ServerContext.getScriptVariantLanguage()). В русской конфигурации ПараметрыЗаписи.WriteMode снова считается неизвестным ключом, как и должно.

Расчёт языка при этом не продублировался: он был у DocumentContext, но регистратору нужен там, где документа нет вовсе — типы регистрируются на конфигурации. Поэтому поднял его в ServerContext (там и живёт конфигурация), а DocumentContext теперь делегирует, оставив себе единственную свою поправку — OS-файл. Реализация одна, вызовов два.

Тесты: у русской фикстуры ключи только русские и обращение по английскому написанию ловится UnknownMember; плюс два теста на сам расчёт в ServerContext (из ScriptVariant и фолбэк на язык сервера, когда конфы нет). Английской фикстуры в проекте нет ни одной, поэтому обратный случай проверяется на уровне ServerContext.

Полный check локально зелёный.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormParametersHbkTest.java (1)

502-523: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert the registered structure fields for every predefined parameter.

This test only verifies that the platform parameter and configured field type names exist. It does not verify that StructureParameterFieldsRegistrar attached each field to the matching ParameterDescriptor.

Collect the matching parameters and assert each configured Russian field name resolves to its configured type names. The fixture uses a Russian configuration. This will detect an omitted or incorrectly bound composition entry.

Proposed test extension
-      assertThat(typeRegistry.getMembers(ownerRef, FileType.BSL))
-        .as("параметр %s у членов %s", parameter.parameterName(), parameter.ownerTypeName())
-        .anyMatch(member -> member.signatures().stream()
+      var declaredParameters = typeRegistry.getMembers(ownerRef, FileType.BSL).stream()
           .flatMap(signature -> signature.parameters().stream())
-          .anyMatch(declared -> declared.matches(parameter.parameterName())));
+          .filter(declared -> declared.matches(parameter.parameterName()))
+          .toList();
+      assertThat(declaredParameters)
+        .as("параметр %s у членов %s", parameter.parameterName(), parameter.ownerTypeName())
+        .isNotEmpty();
       for (var field : parameter.fields()) {
         for (var typeName : field.typeNames()) {
           assertThat(typeRegistry.resolve(typeName))
             .as("тип значения %s (%s.%s)", typeName, parameter.parameterName(), field.name().ru())
             .isPresent();
         }
+        for (var declared : declaredParameters) {
+          assertThat(fieldTypeNames(declared, field.name().ru()))
+            .containsExactlyInAnyOrderElementsOf(field.typeNames());
+        }
       }

As per coding guidelines, “Always run tests before submitting changes and maintain or improve test coverage using appropriate test frameworks (JUnit, AssertJ, Mockito)”.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormParametersHbkTest.java`
around lines 502 - 523, Extend
everyPredefinedStructureParameterIsStillDeclaredThatWay to collect the matching
ParameterDescriptor for each predefined parameter and assert every configured
Russian field name resolves to the descriptor’s configured type names. Validate
the registered field composition itself, using the Russian fixture names and
failing when a field is omitted or bound to the wrong types; retain the existing
owner, parameter, and type-name checks.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/main/java/com/github/_1c_syntax/bsl/languageserver/context/CLAUDE.md`:
- Around line 16-19: Update the user-facing documentation corresponding to the
language-specific type registration and completion behavior in both docs/ and
docs/en/, keeping the localized and English versions consistent with the
implementation and the getScriptVariantLanguage() behavior.

---

Nitpick comments:
In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormParametersHbkTest.java`:
- Around line 502-523: Extend
everyPredefinedStructureParameterIsStillDeclaredThatWay to collect the matching
ParameterDescriptor for each predefined parameter and assert every configured
Russian field name resolves to the descriptor’s configured type names. Validate
the registered field composition itself, using the Russian fixture names and
failing when a field is omitted or bound to the wrong types; retain the existing
owner, parameter, and type-name checks.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: cfa9d59b-67c5-426c-afc3-93382d38341e

📥 Commits

Reviewing files that changed from the base of the PR and between bb2edc4 and 6a82387.

📒 Files selected for processing (14)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/context/CLAUDE.md
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrar.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormPlatformTypes.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormTypesProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/StructureParameterFieldsRegistrar.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContextTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/FormModuleInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderHelpersTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrarHelpersTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormParametersHbkTest.java
🚧 Files skipped from review as they are similar to previous changes (5)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrarHelpersTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderHelpersTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/FormModuleInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormPlatformTypes.java

Comment on lines +16 to +19
**`getScriptVariantLanguage()`** — язык исходников проекта (ScriptVariant конфигурации,
фолбэк на язык сервера). Единственное место этого расчёта: его спрашивают и там, где
документа нет (регистрация типов), а `DocumentContext` делегирует сюда, добавляя одну
свою поправку — OS-файл.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the paired user documentation.

This change modifies language-specific type registration and completion behavior. Update the related documentation in both docs/ and docs/en/.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/main/java/com/github/_1c_syntax/bsl/languageserver/context/CLAUDE.md`
around lines 16 - 19, Update the user-facing documentation corresponding to the
language-specific type registration and completion behavior in both docs/ and
docs/en/, keeping the localized and English versions consistent with the
implementation and the getScriptVariantLanguage() behavior.

Source: Coding guidelines

@nixel2007
nixel2007 enabled auto-merge August 2, 2026 07:35
@nixel2007
nixel2007 merged commit 6a7796c into develop Aug 2, 2026
37 checks passed
@nixel2007
nixel2007 deleted the feat/form-handler-structure-parameters branch August 2, 2026 08:19
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.

2 participants