feat(types): колонки динамического списка — из его основной таблицы - #4490
feat(types): колонки динамического списка — из его основной таблицы#4490nixel2007 wants to merge 3 commits into
Conversation
В снапшоте появился источник данных динамического списка (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
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
💤 Files with no reviewable changes (1)
Included review availability: Your plan provides up to 2 included reviews per hour; 0 remain after this review. 📝 WalkthroughWalkthroughDynamic 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. ChangesDynamic list type system
Estimated code review effort: 3 (Moderate) | ~25 minutes Merge Risk: ⚪ Minimal · up to 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
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 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 |
Test Results 4 122 files 4 122 suites 1h 1m 32s ⏱️ 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
|
|
Закрываю в пользу #4493: работа разъехалась по трём репозиториям (bsl-context, mdclasses, BSL LS), и описание здесь устарело — часть утверждений про состав полей я по ходу разбора снял. Новые черновики:
Коммиты этой ветки перенесены в #4493 без изменений. |



Описание
Элементы.Список.ТекущиеДанныеотдавал обобщённуюДанныеФормыЭлементКоллекциибез единой колонки, и цепочкаСписок.ТекущиеДанные.Артикулобрывалась. В снапшоте mdclasses появился источник данных списка (FormDynamicListAttribute: основная таблица, признак произвольного запроса, текст запроса) — на нём это и построено.Что делает:
DynamicListTypesRegistrarзаводит тип строки на конкретный реквизит-список (ДанныеФормыЭлементКоллекции.ДинамическийСписок.<форма>.<реквизит>). Расширяет он строку вида данных, так что «Расширение данных строки для динамического списка» сохраняется;ТекущиеДанныеиДанныеСтрокитаблицы над списком отдают эту строку;ТекущаяСтрока,ТекущийРодительи элементыВыделенныеСтроки. Раньше типа у них не было вовсе (вTableDataKindстоял TODO именно на это).Отдельно от разбора ниже: из бампа mdclasses приехали два новых вида элементов формы — контекстное меню и расширенная подсказка. На рантайме это обычные
ГруппаФормыиДекорацияФормы, а неПолеФормы, куда их отправлял разбор по умолчанию. Эта часть верна независимо от судьбы остального.Известный дефект подхода
MainTable— синтаксис языка запросов, а не имя типа.Catalog.Справочник1там означает таблицу справочника. Код отдаёт эту строку вTypeRegistry.resolve, который ищет тип BSL, и попадание происходит по совпадению написания: алиасСправочник.X→СправочникСсылка.Xзаведён для ссылок вида// См. Справочник.X.Реквизитв документирующих комментариях.Два следствия, оба проверены прогоном по реестру:
Catalog.Справочник1→СправочникСсылка.Справочник1иDocument.Документ1→ДокументСсылка.Документ1разрешаются, аInformationRegister.РегистрСведений1,РегистрСведений.РегистрСведений1иDocumentJournal.ЖурналДокументов1— нет. У регистров, журналов и виртуальных таблиц ссылочного типа не существует.ДокументСсылка.Документ1:ВерсияДанных, Дата, Номер, ОбщийРеквизит1, ПометкаУдаления, Проведен, Реквизит1..3, Ссылка. НиМоментВремени, ни табличных частей — а в таблицеДокумент.Документ1они есть, и это видно в БСП: уОбработка.ДоступныеАнкеты.Форма.АрхивАнкетсMainTable=Document.Анкетав составе полей стоят иМоментВремени, иСостав.Правильная форма — резолвер по mdoRef и виду таблицы. Он же нужен для разбора
queryText: источники вИЗ— те же табличные имена.Покрытие
MainTableMainTable1:<uuid>С учётом того, что списки с произвольным запросом код пропускает: покрыто 49 из 240 в БСП (20 %) и 1094 из 3127 в cpm (35 %).
Что измерено про состав полей
Замеры по XML-выгрузкам, с исключением двух систематических помех: запросов со звёздочкой (
Таблица.*выбирает всё) и разного написания одного поля (RefпротивСсылка— поэтому сверка идёт только по собственным реквизитам объекта, где написание одно).Поле основной таблицы — законное поле списка с произвольным запросом. Три канала по cpm:
Решающим оказался третий канал вместе с меткой
~: она означает битое поле, то есть конфигуратор умеет помечать то, что не разрешает, — и среди 6650 записей помеченных нет ни одной. Единственный случай второго канала это подтверждает наглядно: вОбработка.РаботаСРезультатамиОбмена.Форма.ОбъектыТребующиеПолученияв одном блокеUseAlwaysстоят~Список.ИмяОбъектаФормата(забраковано) иСписок.ПравилоКонвертации(принято) — второе это измерение регистра, которого в запросе нет.Прочее:
DynamicDataReadс наличием полей вне запроса не связан — они есть и приfalse;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
Чеклист
Общие
gradlew precommit)Для диагностик
Диагностик не добавлялось.
Дополнительно
./gradlew checkлокально зелёный целиком;gradlew precommitпрогонялся. CI на head зелёный.Полигон #4345. Пункты 3.31-3.33 после этого PR становятся зелёными; сверку имён типов в них уже перевели на вхождение.