fix(types): обратное преобразование данных формы сохраняет колонки - #4405
Conversation
`РеквизитФормыВЗначение("Таблица")` отдавал объявленный тип реквизита голым,
хотя колонки таблицы (дерева) значений объявлены в самой форме (`<Columns>`):
на сервер приезжала таблица без единой колонки.
Колонки кладутся в объявленный тип полями строки — тем же представлением,
в котором их видит таблица, собранная в коде. Его уже читают обход коллекции,
`Колонки`, `Выгрузить` и `ВыгрузитьКолонку`, поэтому чинить каждого
потребителя отдельно не понадобилось. Дерево значений — тот же код,
обход через `Строки`.
Тем же путём закрыты два соседних случая:
- явный второй параметр (`Тип("ТаблицаЗначений")`) больше не отменяет
уточнения — набор сужается до названного типа;
- у `ДанныеФормыВЗначение` объявления нет вовсе, поэтому колонки берутся
у самих преобразуемых данных.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
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 ignored due to path filters (1)
📒 Files selected for processing (7)
📝 WalkthroughWalkthroughForm type registration now preserves declared table and tree columns. Conversion inference derives columns from form data and narrows results to explicit types. Table collection inference constructs typed row collections, with tests covering tables, trees, iteration, and column access. ChangesForm collection inference
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant ExpressionTypeInferencer
participant FormExpressionInference
participant TableCollectionInference
ExpressionTypeInferencer->>FormExpressionInference: convertedValueType(..., inferInternal)
FormExpressionInference->>ExpressionTypeInferencer: infer the first conversion argument
FormExpressionInference->>TableCollectionInference: columnsOf(source type)
TableCollectionInference-->>FormExpressionInference: source columns
FormExpressionInference-->>ExpressionTypeInferencer: narrowed table or tree type
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 |
|
Test Results 3 996 files 3 996 suites 51m 27s ⏱️ Results for commit af7a2fc. ♻️ This comment has been updated with latest results. |
|
javadoc упал? |
Угу, сокет таймаут |



Проблема
РеквизитФормыВЗначение("Таблица")отдавал объявленный тип реквизита голым — простоТаблицаЗначений. Колонки такого реквизита объявлены в самой форме (блок<Columns>)и до сих пор попадали только на форменную сторону, в строку
ДанныеФормыКоллекция.На сервере получалась таблица без единой колонки: ни обхода с полями строки, ни
Колонки, ниВыгрузитьКолонку.Решение
Колонки кладутся в объявленный тип полями строки — тем же представлением, в котором
их видит таблица значений, собранная в коде (
Новый ТаблицаЗначений+Колонки.Добавить).Это представление уже читают обход коллекции,
Колонки,ВыгрузитьиВыгрузитьКолонку,поэтому чинить каждого потребителя отдельно не понадобилось. Дерево значений закрывается
тем же кодом — отличается только обход, через
Строки.Тем же путём закрыты два соседних случая, где дефект тот же:
РеквизитФормыВЗначение("Таблица", Тип("ТаблицаЗначений"))брал названный тип голым и уточнения терял. Теперь набор сужается до названного типа,
а уточнения остаются. Если названный тип другой — поведение прежнее;
ДанныеФормыВЗначение(Данные, Тип("ТаблицаЗначений")): объявления реквизита тут нетвовсе, поэтому колонки берутся у самих преобразуемых данных
(
TableCollectionInference.columnsOfчитает и накопленные поля, и членызарегистрированного типа строки). Таблица и дерево — оба.
Расчёт колонок для
ДанныеФормыВЗначениеидёт только когда преобразуют именно в таблицуили дерево значений: иначе на каждом вызове зря выводился бы тип первого аргумента.
Проверка
Тесты в
FormModuleInferenceTest— на реальной фикстуре конфигурации(
initServerContext(PATH_TO_METADATA)), а не на одиночном inline-модуле: проверяются самнабор типов, обход с обращением к колонке, та же таблица через переменную, вариант с явным
типом, дерево через
Строкии оба вариантаДанныеФормыВЗначение. В фикстуру формыдобавлен реквизит-дерево
ДеревоПодбора— проверять дерево раньше было не на чем.Полный
checkзелёный: 666 классов, 4142 теста, 0 падений.🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes