Skip to content

feat(types): колонки динамического списка — из его основной таблицы - #4490

Closed
nixel2007 wants to merge 3 commits into
developfrom
claude/pr-4345-dynamic-lists-3wcutk
Closed

feat(types): колонки динамического списка — из его основной таблицы#4490
nixel2007 wants to merge 3 commits into
developfrom
claude/pr-4345-dynamic-lists-3wcutk

Conversation

@nixel2007

@nixel2007 nixel2007 commented Aug 24, 2026

Copy link
Copy Markdown
Member

Черновик: подход признан неверным, идёт переделка. MainTable записан на языке запросов, а резолвится в коде как имя типа BSL — по совпадению написания. Взамен проектируется резолвер «таблица языка запросов → её поля». Подробности ниже.

Описание

Элементы.Список.ТекущиеДанные отдавал обобщённую ДанныеФормыЭлементКоллекции без единой колонки, и цепочка Список.ТекущиеДанные.Артикул обрывалась. В снапшоте mdclasses появился источник данных списка (FormDynamicListAttribute: основная таблица, признак произвольного запроса, текст запроса) — на нём это и построено.

Что делает:

  • новый DynamicListTypesRegistrar заводит тип строки на конкретный реквизит-список (ДанныеФормыЭлементКоллекции.ДинамическийСписок.<форма>.<реквизит>). Расширяет он строку вида данных, так что «Расширение данных строки для динамического списка» сохраняется;
  • колонками становятся свойства ссылочного типа, найденного по имени основной таблицы. Читаются лениво: на регистрации формы обращение к членам сбивало бы epoch кэша членов;
  • ТекущиеДанные и ДанныеСтроки таблицы над списком отдают эту строку;
  • ссылочный тип даёт и идентификатор строки: ТекущаяСтрока, ТекущийРодитель и элементы ВыделенныеСтроки. Раньше типа у них не было вовсе (в TableDataKind стоял TODO именно на это).

Отдельно от разбора ниже: из бампа mdclasses приехали два новых вида элементов формы — контекстное меню и расширенная подсказка. На рантайме это обычные ГруппаФормы и ДекорацияФормы, а не ПолеФормы, куда их отправлял разбор по умолчанию. Эта часть верна независимо от судьбы остального.

Известный дефект подхода

MainTable — синтаксис языка запросов, а не имя типа. Catalog.Справочник1 там означает таблицу справочника. Код отдаёт эту строку в TypeRegistry.resolve, который ищет тип BSL, и попадание происходит по совпадению написания: алиас Справочник.XСправочникСсылка.X заведён для ссылок вида // См. Справочник.X.Реквизит в документирующих комментариях.

Два следствия, оба проверены прогоном по реестру:

  1. Нессылочные таблицы не разрешатся никогда. Catalog.Справочник1СправочникСсылка.Справочник1 и Document.Документ1ДокументСсылка.Документ1 разрешаются, а InformationRegister.РегистрСведений1, РегистрСведений.РегистрСведений1 и DocumentJournal.ЖурналДокументов1 — нет. У регистров, журналов и виртуальных таблиц ссылочного типа не существует.
  2. У ссылочных состав полей отличается от таблицы. Свойства ДокументСсылка.Документ1: ВерсияДанных, Дата, Номер, ОбщийРеквизит1, ПометкаУдаления, Проведен, Реквизит1..3, Ссылка. Ни МоментВремени, ни табличных частей — а в таблице Документ.Документ1 они есть, и это видно в БСП: у Обработка.ДоступныеАнкеты.Форма.АрхивАнкет с MainTable=Document.Анкета в составе полей стоят и МоментВремени, и Состав.

Правильная форма — резолвер по mdoRef и виду таблицы. Он же нужен для разбора queryText: источники в ИЗ — те же табличные имена.

Покрытие

MainTable БСП 3.1 cpm Разрешается
Ссылочные объекты 129 2055
Регистры сведений 91 768
Журналы документов 3 62
Регистры накопления 17
Перечисления 10
Критерии отбора 2
Виртуальные таблицы 2 19
Без MainTable 15 192
Битая ссылка 1:<uuid> 2

С учётом того, что списки с произвольным запросом код пропускает: покрыто 49 из 240 в БСП (20 %) и 1094 из 3127 в cpm (35 %).

Что измерено про состав полей

Замеры по XML-выгрузкам, с исключением двух систематических помех: запросов со звёздочкой (Таблица.* выбирает всё) и разного написания одного поля (Ref против Ссылка — поэтому сверка идёт только по собственным реквизитам объекта, где написание одно).

Поле основной таблицы — законное поле списка с произвольным запросом. Три канала по cpm:

Канал Найдено
Выведенная колонка таблицы формы 0 (при 9657 положительных совпадений — конвейер проверен)
«Использовать всегда» 1
Состав полей списка 6650 записей в 283 формах по 228 таблицам

Решающим оказался третий канал вместе с меткой ~: она означает битое поле, то есть конфигуратор умеет помечать то, что не разрешает, — и среди 6650 записей помеченных нет ни одной. Единственный случай второго канала это подтверждает наглядно: в Обработка.РаботаСРезультатамиОбмена.Форма.ОбъектыТребующиеПолучения в одном блоке UseAlways стоят ~Список.ИмяОбъектаФормата (забраковано) и Список.ПравилоКонвертации (принято) — второе это измерение регистра, которого в запросе нет.

Прочее:

  • DynamicDataRead с наличием полей вне запроса не связан — они есть и при false;
  • состав полей лежит в XML: блок Field с xsi:type="dcssch:DataSetFieldField" внутри настроек списка. В БСП 803 описания в 36 списках; dcssch:valueType там не встречается ни разу, но в cpm встречается 42 раза — типы в этом блоке бывают;
  • галка «использовать всегда» — блок UseAlways, 517 полей в 171 списке БСП. 10 из них отсутствуют в блоке описаний полей, значит тот не полный состав;
  • существует поле, которого нет ни в запросе, ни среди реквизитов таблицы: DefaultPicture (используется как RowPictureDataPath);
  • 1:<uuid> в MainTable — битая ссылка на таблицу.

Из настроек списка mdclasses читает только MainTable, ManualQuery и QueryText; UseAlways, KeyField и блок описаний полей пропускает. При этом узел Columns у динамического списка бывает — 1 случай из 3127 в cpm, там внутри AdditionalColumns вложенной таблицы списка; то есть getColumns() работает штатно, и класть состав полей туда нельзя.

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

Closes

Чеклист

Общие

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

Для диагностик

Диагностик не добавлялось.

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

./gradlew check локально зелёный целиком; gradlew precommit прогонялся. CI на head зелёный.

Полигон #4345. Пункты 3.31-3.33 после этого PR становятся зелёными; сверку имён типов в них уже перевели на вхождение.

claude added 2 commits August 24, 2026 10:19
В снапшоте появился источник данных динамического списка
(FormDynamicListAttribute: основная таблица, признак произвольного запроса,
текст запроса) и два новых вида элементов формы.

Контекстное меню и расширенная подсказка — не самостоятельные виды, а части
чужого элемента: на рантайме это обычные ГруппаФормы и ДекорацияФормы, а не
ПолеФормы, куда их отправлял разбор по умолчанию. Своего расширения у них нет —
вид, которым они на самом деле являются, в Form.xml не записан.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cahj3rSEFT21HnukHP9vxb
За динамическим списком стоит основная таблица (`Catalog.Номенклатура`), и колонки
его строки — это её поля. Раньше их взять было неоткуда, и `Список.ТекущиеДанные`
отдавал обобщённую строку без единой колонки; теперь источник данных приходит из
mdclasses, и строка заводится на конкретный реквизит-список с полями его таблицы.

Ссылочная основная таблица даёт и идентификатор строки: `ТекущаяСтрока`,
`ТекущийРодитель` и элементы `ВыделенныеСтроки` — это ссылка, а не «неизвестно что».

У списка с произвольным запросом колонок по-прежнему нет: там поля выборки запроса,
а не поля таблицы — разбор текста запроса это отдельная задача. Виртуальные таблицы
регистров своего имени в реестре не имеют и тоже остаются без колонок.

Этим закрываются пункты 3.31-3.33 методической рекомендации «Типизация кода»
(полигон сверки — #4345).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cahj3rSEFT21HnukHP9vxb
@coderabbitai

coderabbitai Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ad0efbc0-483b-4a68-b129-fe897f2e4485

📥 Commits

Reviewing files that changed from the base of the PR and between d79a372 and 801396b.

📒 Files selected for processing (5)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/DynamicListTypesRegistrar.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/TableDataMembers.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/DynamicListTypesRegistrarTest.java
💤 Files with no reviewable changes (1)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/DynamicListTypesRegistrarTest.java

Included review availability: Your plan provides up to 2 included reviews per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

Dynamic lists now register source-specific row types from known main tables. Form tables use these types and expose source fields, row identifiers, parent identifiers, and selected-row arrays. Context menus and extended tooltips receive explicit runtime type mappings. Tests and documentation were updated.

Changes

Dynamic list type system

Layer / File(s) Summary
Dynamic list row registration
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/DynamicListTypesRegistrar.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/DynamicListTypesRegistrarTest.java
Known dynamic-list sources now produce source-specific row types with lazy column members. Custom queries, unknown sources, and non-list attributes are excluded.
Form table integration
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/TableDataMembers.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormItemTypesRegistrar.java, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/*, src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/*
FormItemTypesRegistrar delegates shared member construction to TableDataMembers. Dynamic-list tables use registered row types and expose main-table fields, current-row identifiers, parent identifiers, and selected-row arrays.
Platform mappings and supporting updates
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/FormPlatformTypes.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/TableDataKind.java, src/main/java/com/github/_1c_syntax/bsl/languageserver/types/CLAUDE.md, build.gradle.kts
Context menus map to form groups. Extended tooltips map to form decorations. Related documentation and the mdclasses snapshot version were updated.

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

Merge Risk: ⚪ Minimal · up to 80139

The PR adds type information for dynamic-list columns and row references while preserving explicit behavior for unsupported query-based lists; no actionable merge-blocking risk remains after normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant FormItemTypesRegistrar
  participant DynamicListTypesRegistrar
  participant TypeRegistry
  participant TableDataMembers
  FormItemTypesRegistrar->>DynamicListTypesRegistrar: prepareRows(form data)
  DynamicListTypesRegistrar->>TypeRegistry: resolve main table
  DynamicListTypesRegistrar->>TypeRegistry: register source-specific row type
  DynamicListTypesRegistrar-->>FormItemTypesRegistrar: return row metadata
  FormItemTypesRegistrar->>TableDataMembers: build table members
  TableDataMembers->>TypeRegistry: register specialized identifier arrays
Loading

Suggested reviewers: sfaqer

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring check was indeterminate for this PR — some files could not be analyzed in time. Not blocking.
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: deriving dynamic-list columns from the list's main table.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/pr-4345-dynamic-lists-3wcutk

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.

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Test Results

 4 122 files   4 122 suites   1h 1m 32s ⏱️
 4 272 tests  4 201 ✅  71 💤 0 ❌
25 632 runs  25 202 ✅ 430 💤 0 ❌

Results for commit 801396b.

♻️ This comment has been updated with latest results.

`ТекущиеДанные` с `ДанныеСтроки` и тройка про идентификатор строки собирались
дважды одинаково: на типе вида данных и на типе конкретной таблицы. Вынесены в
`TableDataMembers` — оба вызова теперь читают один и тот же код.

Заодно закрыты замечания Sonar на этом PR: дублирующие зависимости ушли из
`FormItemTypesRegistrar` (S1200), в разборе реквизитов формы остался один выход
из цикла (S135), убран неиспользуемый импорт в тесте (S1128).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cahj3rSEFT21HnukHP9vxb
@sonarqubecloud

Copy link
Copy Markdown

@nixel2007

Copy link
Copy Markdown
Member Author

Закрываю в пользу #4493: работа разъехалась по трём репозиториям (bsl-context, mdclasses, BSL LS), и описание здесь устарело — часть утверждений про состав полей я по ходу разбора снял.

Новые черновики:

Коммиты этой ветки перенесены в #4493 без изменений.

@nixel2007 nixel2007 closed this Aug 26, 2026
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