Repository navigation
fix(sdbl-hir): проверка полей, таблиц и параметров виртуальных таблиц регистров - #422
Open
flamber-dev wants to merge 2 commits into
Open
flamber-dev wants to merge 2 commits into
flamber-dev wants to merge 2 commits into
Conversation
…d on The query field names of an accounting register are not its metadata names: a correspondence register names a non-balance dimension or resource by its sides (<Измерение>Дт, <Ресурс>Кт), only non-balance resources have the correspondent-turnover fields (<Ресурс>КорОборот of a balance resource does not exist), and the number of Субконто<N> fields comes from the chart of accounts. None of that was parsed. Parsed now, all as "absent means unknown" (None), never as false: - Dimension / RegisterResource: Balance; - Register: Correspondence and ChartOfAccounts (accounting registers only); - MetadataObject: MaxExtDimensionCount of a chart of accounts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l tables `query validate` answered "no findings" on a non-existent field of a register virtual table, on any field of an accounting register (main table included), on a non-existent virtual table and on an argument list the platform rejects with «Неверные параметры». Only the top-level table was checked against metadata, while the answer read like a full check. Field models (all listed names a call may produce are offered; names that exist only for some arguments or settings are provisional, so the unknown-field rule stays silent on them and the ambiguity rule ignores them): - accumulation Остатки / Обороты / ОстаткиИОбороты: dimensions plus the derived resource families (Остаток, Оборот, Приход, Расход, Начальный / КонечныйОстаток) and the per-period breakdown (ПериодМесяц, ...); register attributes stay provisional in Обороты because code shipped in a typical configuration selects one; - information-register slices: Период, dimensions, resources, attributes; - accounting registers, main table and Остатки / Обороты / ОборотыДтКт / ОстаткиИОбороты / ДвиженияССубконто, built from the balance / correspondence / chart-of-accounts metadata; without the chart the Субконто<N> family cannot be bounded and the table stays incomplete. Common attributes follow the main table: a separator is a column of every table, a plain common attribute a column of the tables that carry register attributes, and an open common-attribute set leaves the table unchecked. Table classification is now root-aware: a suffix is a virtual table only under a register kind that owns it. The name-only test made a temporary table or a tabular section called «Остатки» a balance table (false VirtualTableCallWithoutParameters and JoinWithVirtualTable), never recognised ОборотыДтКт / ДвиженияССубконто (the list carried misspelt names), and treated the stored Субконто / Изменения tables as parameterised calls. A third segment a register kind does not own is QueryToMissingMetadata (not for calculation registers, whose base and recalculation tables are named by the configuration). New diagnostic InvalidVirtualTableParameters: more arguments than the table has parameters (a condition split by a comma instead of И), or a condition in a slot that takes a value (an account condition in the Субконто slot). Positions are read from the commas of the call; a call that did not parse cleanly (e.g. a template macro) is skipped. Scope fixes the better typing exposed: a virtual table's parameter list is an opaque frame (its condition speaks of the table's own fields only), and ИТОГИ / УПОРЯДОЧИТЬ ПО resolve bare names against the select outputs first — otherwise two joined balance tables made «Счет» falsely ambiguous. An output owns its name whatever its type: an output of unknown type (a parameter) or an output that is itself ambiguous must not send the name on to the sources, which reported an ambiguity with an empty list of tables. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
|
🤖 Начата автоматическая приёмка — этот pull request взят в работу ИИ-агентом: изменения переносятся на актуальную целевую ветку, проходят независимое ревью и соответствующие тесты, очевидные замечания правятся по ходу. Обновления появятся в этом треде; merge возможен только после завершения проверки. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблема
Проверка запроса (
UnknownFieldInQuery,query validate) сверяет с метаданными только таблицу верхнего уровня.На виртуальных таблицах регистров она молчит, и ответ «замечаний нет» выглядит как полная проверка, хотя
платформа такой запрос не выполнит:
На
develop(f63a2eb) молча проходят:Остатки,Обороты,ОстаткиИОбороты) и срезарегистра сведений (
СрезПоследних,СрезПервых);(небалансовое измерение или ресурс корреспондирующего регистра называется по сторонам -
<Измерение>Дт,<Ресурс>Кт; число полейСубконто<N>задаёт план счетов), а свойстваБалансовый,ПоддержкаКорреспонденции,ПланСчетовиМаксКоличествоСубконтоне читались;РегистрБухгалтерии.Бухгалтерия1.НетТакойТаблицы(...),РегистрСведений.Сведения1.Остатки(...),Остаткиу оборотного регистра накопления);И) и условие в позиции, которая принимаетзначение (условие по счёту в позиции
Субконто): параметры читаются строго по позиции.Обратная сторона - ложные находки. Виртуальная таблица определялась по последнему сегменту имени без учёта корня,
поэтому временная таблица
Остатки/Оборотыи табличная частьДокумент.X.ОстаткиполучалиVirtualTableCallWithoutParametersиJoinWithVirtualTable, хранимые таблицыРегистрБухгалтерии.X.Субконтои<Объект>.Изменения- тоже; при этомОборотыДтКтиДвиженияССубконтоне распознавались вовсе (в списке стоялиимена с опечатками). Аргумент системы компоновки (
СрезПоследних({&КонецПериода}, )) считался отсутствующим.Что меняется
Два коммита.
feat(bsl-metadata)- читаются свойства, от которых зависит форма таблиц регистра бухгалтерии:Balanceизмерения иресурса,
CorrespondenceиChartOfAccountsрегистра бухгалтерии,MaxExtDimensionCountплана счетов. Отсутствиесвойства -
None(«неизвестно»), неfalse.fix(sdbl-hir):Остаток,Оборот,Приход,Расход,НачальныйОстаток,КонечныйОстаток) + разбивка по периоду (ПериодМесяц, ...). Срез регистрасведений:
Период, измерения, ресурсы, реквизиты. Регистр бухгалтерии (новыйlower/register_tables.rs): главнаятаблица и
Остатки,Обороты,ОборотыДтКт,ОстаткиИОбороты,ДвиженияССубконто. Имена, которые естьтолько при некоторых аргументах вызова или настройках, помечены provisional (правило неизвестного поля на них молчит,
правило неоднозначности их не считает) - механизм, который в
developуже есть. Без плана счетов семействоСубконто<N>не ограничить - таблица остаётся неполной, и правило молчит;develop: разделитель - колонка каждой таблицы регистра, обычный общийреквизит - колонка таблиц, где есть реквизиты регистра; открытый набор общих реквизитов (
common_attributes_open)оставляет таблицу непроверяемой;
(
register_table_kinds); хранимыеСубконтоиИзмененияпараметров не принимают; неизвестный третий сегмент урегистра -
QueryToMissingMetadata(кроме регистра расчёта: имена его таблиц баз и перерасчётов задаётконфигурация);
InvalidVirtualTableParameters(Error / Blocker): аргументов больше, чем параметров утаблицы, или условие в позиции значения. Позиции берутся по запятым самого вызова; вызов, разобранный с ошибкой
(например, шаблон-макрос), пропускается. Списки параметров - для таблиц регистров сведений, накопления и
бухгалтерии; вид регистра виден из текста, метаданные не нужны. Документация
docs/{ru,en};только о полях этой таблицы (непрозрачный кадр), а
УПОРЯДОЧИТЬ ПОиИТОГИсначала ищут имя среди выходныхколонок запроса. Иначе две соединённые таблицы остатков давали ложную неоднозначность
Счет. Выходная колонкавладеет именем при любом своём типе: колонка неизвестного типа (параметр) или сама неоднозначная колонка не должна
отправлять имя дальше к источникам - так получалась неоднозначность с пустым списком таблиц
(
Возможные таблицы:).Доказательство
Тесты -
crates/sdbl-hir/src/lower/register_table_tests.rs(25 тестов, синтетические регистрыОстатки1,Обороты1,Сведения1,Бухгалтерия1на плане счетовПлан1), плюс вide-diagnostics:invalid_virtual_table_parameters::tests::*(4) иunknown_field_in_query::tests::positive_unknown_field_on_register_slice(бывший
negative_register_virtual_table_gate_off, который закреплял молчание).На
develop(f63a2eb), только файлы тестов:Упали 15: все модели полей регистров накопления, сведений и бухгалтерии, отсутствующая таблица, классификация
(
Документ.Документ1.Остаткии временнаяОстатки- ложноеVirtualTableCallWithoutParameters,ОборотыДтКт/ДвиженияССубконтоне распознаны), общие реквизиты, поле через псевдоним присоединённой виртуальной таблицы иan_ambiguous_output_is_reported_once_with_its_sources(наdevelopСчетв таблице остатков регистра бухгалтерии неизвестен вовсе). Проходят 10 контрольных: молчание без плана счетов и без метаданных, регистр расчёта, таблица
изменений, аргумент системы компоновки, реквизит в
Обороты, кадр параметров,ИТОГИ/УПОРЯДОЧИТЬ ПОи колонканеизвестного типа - на
developэти места молчат, потому что полей не знают; тесты защищают от ложных находок,которые точная модель иначе внесла бы.
ide-diagnosticsнаdevelop:На ветке:
Неоднозначность с пустым списком таблиц
Первая версия разрешения через выходные колонки пропускала колонку неизвестного типа и шла к источникам. Тесты
an_output_of_unknown_type_still_owns_its_name_in_order_byиan_ambiguous_output_is_reported_once_with_its_sourcesдо исправления (
Scope::push_outputs_frame):Рабочие конфигурации
Release-сборки
developи ветки,analyze --no-extensions --no-externals --format jsonlна двух рабочихконфигурациях с большим числом регистров: учётная (5407 модулей, 70 регистров накопления, регистр бухгалтерии,
~17 тыс. вхождений
ВЫБРАТЬ) и торговая (10145 модулей, 168 регистров накопления, ~48 тыс.ВЫБРАТЬ). Сравнениепострочное (файл, код, строка, колонка, текст):
UnknownFieldInQueryAmbiguousFieldInQueryVirtualTableCallWithoutParametersJoinWithVirtualTableUnlimitedLengthStringUsageInQueryInvalidVirtualTableParametersКаждая новая находка сверена с XML регистра:
UnknownFieldInQuery, 82 новых, все истинные: поля, которых у регистра нет ни измерением, ни ресурсом, ниреквизитом: оборот ресурса, которого у регистра нет; измерение, которого нет, в таблице
Остатки; ресурс,которого нет у регистра сведений, в срезе (в типовом коде регламентированных отчётов, в
обработке свёртки базы и др.);
JoinWithVirtualTable, 76 новых: соединения сОборотыДтКт,ДвиженияССубконтоиФактическийПериодДействиярегистра расчёта - виртуальные таблицы, которые раньше не распознавались; находки поправилу верные;
VirtualTableCallWithoutParameters, 2 новых:РегистрБухгалтерии.<Имя>.ДвиженияССубконтобез параметров - верные.Ушедшие - ложные:
AmbiguousFieldInQueryвУПОРЯДОЧИТЬ ПО/ИТОГИпо имени выходной колонки и в условиипараметров виртуальной таблицы;
VirtualTableCallWithoutParameters/JoinWithVirtualTableна временных таблицахОстатки/Обороты, табличных частях, хранимыхСубконто/Изменения, вызовах с аргументом системыкомпоновки;
UnknownFieldInQuery«Узелне найден в<Объект>.Изменения»;UnlimitedLengthStringUsageInQueryнаУПОРЯДОЧИТЬ ПОпо имени выходной колонки, которая уже приведенаВЫРАЗИТЬ(... КАК СТРОКА(1024)).Новых
InvalidVirtualTableParametersна этих двух конфигурациях нет; случаи покрыты тестами.Проверка
cargo test -p bsl-metadata -p sdbl-hir -p ide-diagnostics -p ide --no-fail-fast: списки упавших наdevelopи наветке совпадают (9 тестов, окружение Windows:
a_self_qualified_call_*,graph::tests::method_graph_id_*,name_lookup::tests::the_address_phases_observe_a_cancelled_requestи др.); прошедших 4126 наdevelop, 4160 наветке.
cargo fmt --checkпо затронутым крейтам: чисто.cargo clippy --all-targets -p bsl-metadata -p sdbl-hir -p ide-diagnostics -p ide: замечаний нет, как и наdevelop(сборочный скриптide-diagnosticsсообщает 200 кодов вместо 199).Поведение платформы
Запросы выполнены живьём на 8.3.17.1549 и 8.3.27.2214 (
Новый Запрос(Текст).Выполнить()); имена регистров и полейзаменены на нейтральные, текст ошибок - дословно. На обеих версиях ответ одинаковый:
Т.Ресурс1ОборотизРегистрНакопления.Обороты1.Обороты(контроль)Т.НетТакогоПоля123Оборотиз.ОборотыПоле не найдено "Т.НетТакогоПоля123Оборот".НетТаблицы()Таблица не найдена "РегистрНакопления.Обороты1.НетТаблицы".Обороты(, , , , )- пять параметровНеверные параметры "РегистрНакопления.Обороты1.Обороты".Остаткиу оборотного регистраТаблица не найдена "РегистрНакопления.Обороты1.Остатки"Т.Субконто1изРегистрБухгалтерии.Бухгалтерия1.Остатки(контроль)Т.Субконто4изРегистрБухгалтерии.Бухгалтерия1.Остатки(8.3.17; на 8.3.27 в проверочной базе нет регистра бухгалтерии)Поле не найдено "Т.Субконто4"Одна из 82 новых находок на рабочей конфигурации проверена тем же способом: поле, которого нет среди ресурсов
оборотного регистра, платформа отвергает
Поле не найдено, то есть находка указывает на запрос, который упадётпри выполнении.
Вне этого PR
БазаX,ДанныеГрафика,ФактическийПериодДействия, перерасчёты): поля немоделируются, таблица остаётся неполной; параметры не проверяются.
Узел,НомерСообщения) и таблицыСубконторегистра бухгалтерии не моделируются - наних правило молчит.
Регистратор/НомерСтрокив оборотах), считаютсясуществующими всегда; проверка «поле есть только при периодичности
Регистратор» не делается.Оборотыоставлены provisional: типовой код их выбирает, а поведениеплатформы здесь не сверялось.
Субконто<N>не выводится (неизвестен); проверяется только наличие имени.🤖 Generated with Claude Code