feat(types): структуры-параметры обработчиков формы знают предопределённый платформой состав - #4366
Conversation
📝 WalkthroughWalkthroughThe 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. ChangesForm structure parameter enrichment
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
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
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. Comment |
|
Да, я не помню в реальном автокомплите платформы английских имён при русском script variant |
…бработчиков формы Тип у такой структуры объявлен как «Структура» — то есть не сказано ничего, а состав платформа называет прозой в описании параметра. Из-за этого ПараметрыЗаписи.РежимЗаписи не резолвился, автодополнение по точке не предлагало ничего, а 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>
Ключ структуры — строка, а не идентификатор: платформа кладёт её на языке конфигурации, и в русской конфигурации английского написания там не будет. Заводились оба, из-за чего `ПараметрыЗаписи.WriteMode` в русском проекте считался верным, хотя на выполнении не сработает. Теперь берётся одно написание — по варианту встроенного языка. Расчёт языка проекта не продублирован: он поднят из DocumentContext в ServerContext, где живёт конфигурация, — его спрашивают и там, где документа нет (регистрация типов). У документа осталась своя единственная поправка — OS-файл к конфигурации не относится. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
bb2edc4 to
6a82387
Compare
|
Согласен, поправил — теперь заводится одно написание, по варианту встроенного языка конфигурации ( Расчёт языка при этом не продублировался: он был у Тесты: у русской фикстуры ключи только русские и обращение по английскому написанию ловится Полный |
There was a problem hiding this comment.
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 winAssert 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
StructureParameterFieldsRegistrarattached each field to the matchingParameterDescriptor.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
📒 Files selected for processing (14)
src/main/java/com/github/_1c_syntax/bsl/languageserver/context/CLAUDE.mdsrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.mdsrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProvider.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrar.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormPlatformTypes.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormTypesProvider.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/StructureParameterFieldsRegistrar.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContextTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/types/FormModuleInferenceTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderHelpersTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrarHelpersTest.javasrc/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
| **`getScriptVariantLanguage()`** — язык исходников проекта (ScriptVariant конфигурации, | ||
| фолбэк на язык сервера). Единственное место этого расчёта: его спрашивают и там, где | ||
| документа нет (регистрация типов), а `DocumentContext` делегирует сюда, добавляя одну | ||
| свою поправку — OS-файл. |
There was a problem hiding this comment.
📐 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



Тип у структуры, которую платформа сама передаёт в обработчик, объявлен как
Структура— то есть не сказано ничего. Состав при этом платформа называет, но прозой, в описании параметра. Из-за этого вПередЗаписьюне работало ничего:ПараметрыЗаписи.не предлагал ключей,РежимЗаписиоставался невыведенным, а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
Bug Fixes
Tests