From 74e88e75c25eaf4e619f43664912de679eeea002 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 20 Sep 2026 17:34:39 +0300 Subject: [PATCH] =?UTF-8?q?feat(meta-compile,meta-edit,form-compile,form-e?= =?UTF-8?q?dit,mxl-compile,skd-compile,skd-edit):=20=D0=B2=D1=8B=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=20meta-info=20=D0=BF=D1=80=D0=B8=D0=BD=D0=B8=D0=BC?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=20=D0=B2=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вывод читающего навыка модель несёт обратно в компилятор, а тот его не понимал. Из 41 метки, которую печатает meta-info, в словаре typeSynonyms не было 33: «ДокументОбъект.Заказ» из источников подписки meta-compile отвергал с «Неизвестный тип», хотя сам же печатал эту форму через meta-info. Не принимались и «ПВХСсылка.ВидыСубконто», и «Характеристика.Виды» — при том что Characteristic.Xxx описан в спеке как штатная форма DSL. Добавлены русские имена объектных типов, менеджеров и наборов записей. Аббревиатуры (ПВХ/ПВР, РС/РН/РБ/РР) приняты наравне с полными именами: вывод навыка сокращает долгие виды, чтобы в списке на сорок реквизитов не терялось имя объекта, и раз он их печатает — обязан принимать. В Resolve-TypeStr снимаются хвосты, которые дописывает глоссарий meta-info: суффикс «(все)», счётчик «— типов: N» и раскрытие после стрелки. Срезаются только эти известные формы — круглые скобки заняты параметризованными типами вроде Число(15,2), слепой срез сломал бы их. Функция под гардом check-inline-drift, поэтому правка синхронна во всех семи навыках и обоих портах. Co-Authored-By: Claude Opus 5 (1M context) --- .../form-compile/scripts/form-compile.ps1 | 13 +++- .../form-compile/scripts/form-compile.py | 16 ++++- .../skills/form-edit/scripts/form-edit.ps1 | 13 +++- .claude/skills/form-edit/scripts/form-edit.py | 14 ++++- .../meta-compile/scripts/meta-compile.ps1 | 55 ++++++++++++++++- .../meta-compile/scripts/meta-compile.py | 59 ++++++++++++++++++- .../skills/meta-edit/scripts/meta-edit.ps1 | 55 ++++++++++++++++- .claude/skills/meta-edit/scripts/meta-edit.py | 59 ++++++++++++++++++- .../mxl-compile/scripts/mxl-compile.ps1 | 13 +++- .../skills/mxl-compile/scripts/mxl-compile.py | 14 ++++- .../skd-compile/scripts/skd-compile.ps1 | 13 +++- .../skills/skd-compile/scripts/skd-compile.py | 16 ++++- .claude/skills/skd-edit/scripts/skd-edit.ps1 | 13 +++- .claude/skills/skd-edit/scripts/skd-edit.py | 14 ++++- 14 files changed, 349 insertions(+), 18 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 9497f2075..7b1691cb4 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.198 — Compile 1C managed form from JSON or object metadata (гвард на группу additionalColumns без ключа columns) +# form-compile v1.199 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -2496,6 +2496,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 47525409c..7513379a3 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python3 -# form-compile v1.198 — Compile 1C managed form from JSON or object metadata (гвард на группу additionalColumns без ключа columns) +#!/usr/bin/env python3 +# form-compile v1.199 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -3908,6 +3908,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) if m: diff --git a/.claude/skills/form-edit/scripts/form-edit.ps1 b/.claude/skills/form-edit/scripts/form-edit.ps1 index 8118c188e..9bb9ff78f 100644 --- a/.claude/skills/form-edit/scripts/form-edit.ps1 +++ b/.claude/skills/form-edit/scripts/form-edit.ps1 @@ -1,4 +1,4 @@ -# form-edit v1.18 — Edit 1C managed form elements (+esc_xml/esc_xml_text: разное экранирование атрибута и текста) +# form-edit v1.19 — Edit 1C managed form elements # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -403,6 +403,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/form-edit/scripts/form-edit.py b/.claude/skills/form-edit/scripts/form-edit.py index 88271d536..7e2539583 100644 --- a/.claude/skills/form-edit/scripts/form-edit.py +++ b/.claude/skills/form-edit/scripts/form-edit.py @@ -1,4 +1,4 @@ -# form-edit v1.18 — Edit 1C managed form elements (Python port) (+esc_xml/esc_xml_text: разное экранирование атрибута и текста) +# form-edit v1.19 — Edit 1C managed form elements (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -530,6 +530,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) if m: diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index aeae59548..79c0c72f1 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -1,4 +1,4 @@ -# meta-compile v1.112 — Compile 1C metadata object from JSON +# meta-compile v1.113 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -668,6 +668,48 @@ $script:typeSynonyms["бизнеспроцессссылка"] = "Bus $script:typeSynonyms["задачассылка"] = "TaskRef" $script:typeSynonyms["определяемыйтип"] = "DefinedType" $script:typeSynonyms["definedtype"] = "DefinedType" +# Русские имена объектных типов, менеджеров и наборов записей — те самые метки, которые печатает +# meta-info. Без них раундтрип «прочитал вывод → подал на вход» рвался: `ДокументОбъект.Заказ` из +# источников подписки компилятор отвергал с «Неизвестный тип», хотя сам же печатал эту форму +# через meta-info. Аббревиатуры (ПВХ/ПВР, РС/РН/РБ/РР) приняты наравне с полными именами: вывод +# навыка сокращает долгие виды, чтобы в списке на сорок реквизитов не терялось имя объекта. +# Состав держит гард tests/skills/check-typeset-coverage.mjs. +$script:typeSynonyms["бизнеспроцессменеджер"] = "BusinessProcessManager" +$script:typeSynonyms["бизнеспроцессобъект"] = "BusinessProcessObject" +$script:typeSynonyms["документменеджер"] = "DocumentManager" +$script:typeSynonyms["документобъект"] = "DocumentObject" +$script:typeSynonyms["журналдокументовменеджер"] = "DocumentJournalManager" +$script:typeSynonyms["задачаменеджер"] = "TaskManager" +$script:typeSynonyms["задачаобъект"] = "TaskObject" +$script:typeSynonyms["константаменеджерзначения"] = "ConstantValueManager" +$script:typeSynonyms["любаяссылка"] = "AnyRef" +$script:typeSynonyms["любаяссылкаиб"] = "AnyIBRef" +$script:typeSynonyms["наборзаписейперерасчета"] = "RecalculationRecordSet" +$script:typeSynonyms["наборзаписейпоследовательности"] = "SequenceRecordSet" +$script:typeSynonyms["наборзаписейрб"] = "AccountingRegisterRecordSet" +$script:typeSynonyms["наборзаписейрн"] = "AccumulationRegisterRecordSet" +$script:typeSynonyms["наборзаписейрр"] = "CalculationRegisterRecordSet" +$script:typeSynonyms["наборзаписейрс"] = "InformationRegisterRecordSet" +$script:typeSynonyms["обработкаменеджер"] = "DataProcessorManager" +$script:typeSynonyms["отчетменеджер"] = "ReportManager" +$script:typeSynonyms["пврменеджер"] = "ChartOfCalculationTypesManager" +$script:typeSynonyms["пвробъект"] = "ChartOfCalculationTypesObject" +$script:typeSynonyms["пврссылка"] = "ChartOfCalculationTypesRef" +$script:typeSynonyms["пвхменеджер"] = "ChartOfCharacteristicTypesManager" +$script:typeSynonyms["пвхобъект"] = "ChartOfCharacteristicTypesObject" +$script:typeSynonyms["пвхссылка"] = "ChartOfCharacteristicTypesRef" +$script:typeSynonyms["перечислениеменеджер"] = "EnumManager" +$script:typeSynonyms["планобменаменеджер"] = "ExchangePlanManager" +$script:typeSynonyms["планобменаобъект"] = "ExchangePlanObject" +$script:typeSynonyms["плансчетовменеджер"] = "ChartOfAccountsManager" +$script:typeSynonyms["плансчетовобъект"] = "ChartOfAccountsObject" +$script:typeSynonyms["регистрбухгалтериименеджер"] = "AccountingRegisterManager" +$script:typeSynonyms["регистрнакопленияменеджер"] = "AccumulationRegisterManager" +$script:typeSynonyms["регистррасчетаменеджер"] = "CalculationRegisterManager" +$script:typeSynonyms["регистрсведенийменеджер"] = "InformationRegisterManager" +$script:typeSynonyms["справочникменеджер"] = "CatalogManager" +$script:typeSynonyms["справочникобъект"] = "CatalogObject" +$script:typeSynonyms["характеристика"] = "Characteristic" # English lowercase ref synonyms $script:typeSynonyms["catalogref"] = "CatalogRef" $script:typeSynonyms["documentref"] = "DocumentRef" @@ -690,6 +732,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 580958563..ad9006509 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python3 -# meta-compile v1.112 — Compile 1C metadata object from JSON +#!/usr/bin/env python3 +# meta-compile v1.113 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -775,6 +775,49 @@ type_synonyms = { 'задачассылка': 'TaskRef', 'определяемыйтип': 'DefinedType', 'definedtype': 'DefinedType', + # Русские имена объектных типов, менеджеров и наборов записей — те самые метки, которые + # печатает meta-info. Без них раундтрип «прочитал вывод → подал на вход» рвался: + # `ДокументОбъект.Заказ` из источников подписки компилятор отвергал с «Неизвестный тип», + # хотя сам же печатал эту форму через meta-info. Аббревиатуры (ПВХ/ПВР, РС/РН/РБ/РР) приняты + # наравне с полными именами: вывод навыка сокращает долгие виды, чтобы в списке на сорок + # реквизитов не терялось имя объекта. + # Состав держит гард tests/skills/check-typeset-coverage.mjs. + 'бизнеспроцессменеджер': 'BusinessProcessManager', + 'бизнеспроцессобъект': 'BusinessProcessObject', + 'документменеджер': 'DocumentManager', + 'документобъект': 'DocumentObject', + 'журналдокументовменеджер': 'DocumentJournalManager', + 'задачаменеджер': 'TaskManager', + 'задачаобъект': 'TaskObject', + 'константаменеджерзначения': 'ConstantValueManager', + 'любаяссылка': 'AnyRef', + 'любаяссылкаиб': 'AnyIBRef', + 'наборзаписейперерасчета': 'RecalculationRecordSet', + 'наборзаписейпоследовательности': 'SequenceRecordSet', + 'наборзаписейрб': 'AccountingRegisterRecordSet', + 'наборзаписейрн': 'AccumulationRegisterRecordSet', + 'наборзаписейрр': 'CalculationRegisterRecordSet', + 'наборзаписейрс': 'InformationRegisterRecordSet', + 'обработкаменеджер': 'DataProcessorManager', + 'отчетменеджер': 'ReportManager', + 'пврменеджер': 'ChartOfCalculationTypesManager', + 'пвробъект': 'ChartOfCalculationTypesObject', + 'пврссылка': 'ChartOfCalculationTypesRef', + 'пвхменеджер': 'ChartOfCharacteristicTypesManager', + 'пвхобъект': 'ChartOfCharacteristicTypesObject', + 'пвхссылка': 'ChartOfCharacteristicTypesRef', + 'перечислениеменеджер': 'EnumManager', + 'планобменаменеджер': 'ExchangePlanManager', + 'планобменаобъект': 'ExchangePlanObject', + 'плансчетовменеджер': 'ChartOfAccountsManager', + 'плансчетовобъект': 'ChartOfAccountsObject', + 'регистрбухгалтериименеджер': 'AccountingRegisterManager', + 'регистрнакопленияменеджер': 'AccumulationRegisterManager', + 'регистррасчетаменеджер': 'CalculationRegisterManager', + 'регистрсведенийменеджер': 'InformationRegisterManager', + 'справочникменеджер': 'CatalogManager', + 'справочникобъект': 'CatalogObject', + 'характеристика': 'Characteristic', # English lowercase ref synonyms 'catalogref': 'CatalogRef', 'documentref': 'DocumentRef', @@ -826,6 +869,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) if m: diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index dc1afc499..521198dcc 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.ps1 +++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1 @@ -1,4 +1,4 @@ -# meta-edit v1.52 — Edit existing 1C metadata object XML +# meta-edit v1.53 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -498,6 +498,48 @@ $script:typeSynonyms["бизнеспроцессссылка"] = "Bus $script:typeSynonyms["задачассылка"] = "TaskRef" $script:typeSynonyms["определяемыйтип"] = "DefinedType" $script:typeSynonyms["definedtype"] = "DefinedType" +# Русские имена объектных типов, менеджеров и наборов записей — те самые метки, которые печатает +# meta-info. Без них раундтрип «прочитал вывод → подал на вход» рвался: `ДокументОбъект.Заказ` из +# источников подписки компилятор отвергал с «Неизвестный тип», хотя сам же печатал эту форму +# через meta-info. Аббревиатуры (ПВХ/ПВР, РС/РН/РБ/РР) приняты наравне с полными именами: вывод +# навыка сокращает долгие виды, чтобы в списке на сорок реквизитов не терялось имя объекта. +# Состав держит гард tests/skills/check-typeset-coverage.mjs. +$script:typeSynonyms["бизнеспроцессменеджер"] = "BusinessProcessManager" +$script:typeSynonyms["бизнеспроцессобъект"] = "BusinessProcessObject" +$script:typeSynonyms["документменеджер"] = "DocumentManager" +$script:typeSynonyms["документобъект"] = "DocumentObject" +$script:typeSynonyms["журналдокументовменеджер"] = "DocumentJournalManager" +$script:typeSynonyms["задачаменеджер"] = "TaskManager" +$script:typeSynonyms["задачаобъект"] = "TaskObject" +$script:typeSynonyms["константаменеджерзначения"] = "ConstantValueManager" +$script:typeSynonyms["любаяссылка"] = "AnyRef" +$script:typeSynonyms["любаяссылкаиб"] = "AnyIBRef" +$script:typeSynonyms["наборзаписейперерасчета"] = "RecalculationRecordSet" +$script:typeSynonyms["наборзаписейпоследовательности"] = "SequenceRecordSet" +$script:typeSynonyms["наборзаписейрб"] = "AccountingRegisterRecordSet" +$script:typeSynonyms["наборзаписейрн"] = "AccumulationRegisterRecordSet" +$script:typeSynonyms["наборзаписейрр"] = "CalculationRegisterRecordSet" +$script:typeSynonyms["наборзаписейрс"] = "InformationRegisterRecordSet" +$script:typeSynonyms["обработкаменеджер"] = "DataProcessorManager" +$script:typeSynonyms["отчетменеджер"] = "ReportManager" +$script:typeSynonyms["пврменеджер"] = "ChartOfCalculationTypesManager" +$script:typeSynonyms["пвробъект"] = "ChartOfCalculationTypesObject" +$script:typeSynonyms["пврссылка"] = "ChartOfCalculationTypesRef" +$script:typeSynonyms["пвхменеджер"] = "ChartOfCharacteristicTypesManager" +$script:typeSynonyms["пвхобъект"] = "ChartOfCharacteristicTypesObject" +$script:typeSynonyms["пвхссылка"] = "ChartOfCharacteristicTypesRef" +$script:typeSynonyms["перечислениеменеджер"] = "EnumManager" +$script:typeSynonyms["планобменаменеджер"] = "ExchangePlanManager" +$script:typeSynonyms["планобменаобъект"] = "ExchangePlanObject" +$script:typeSynonyms["плансчетовменеджер"] = "ChartOfAccountsManager" +$script:typeSynonyms["плансчетовобъект"] = "ChartOfAccountsObject" +$script:typeSynonyms["регистрбухгалтериименеджер"] = "AccountingRegisterManager" +$script:typeSynonyms["регистрнакопленияменеджер"] = "AccumulationRegisterManager" +$script:typeSynonyms["регистррасчетаменеджер"] = "CalculationRegisterManager" +$script:typeSynonyms["регистрсведенийменеджер"] = "InformationRegisterManager" +$script:typeSynonyms["справочникменеджер"] = "CatalogManager" +$script:typeSynonyms["справочникобъект"] = "CatalogObject" +$script:typeSynonyms["характеристика"] = "Characteristic" $script:typeSynonyms["catalogref"] = "CatalogRef" $script:typeSynonyms["documentref"] = "DocumentRef" $script:typeSynonyms["enumref"] = "EnumRef" @@ -576,6 +618,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py index 3c7722995..31d025a59 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.py +++ b/.claude/skills/meta-edit/scripts/meta-edit.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python3 -# meta-edit v1.52 — Edit existing 1C metadata object XML +#!/usr/bin/env python3 +# meta-edit v1.53 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -537,6 +537,49 @@ type_synonyms = { "задачассылка": "TaskRef", "определяемыйтип": "DefinedType", "definedtype": "DefinedType", + # Русские имена объектных типов, менеджеров и наборов записей — те самые метки, которые + # печатает meta-info. Без них раундтрип «прочитал вывод → подал на вход» рвался: + # `ДокументОбъект.Заказ` из источников подписки компилятор отвергал с «Неизвестный тип», + # хотя сам же печатал эту форму через meta-info. Аббревиатуры (ПВХ/ПВР, РС/РН/РБ/РР) приняты + # наравне с полными именами: вывод навыка сокращает долгие виды, чтобы в списке на сорок + # реквизитов не терялось имя объекта. + # Состав держит гард tests/skills/check-typeset-coverage.mjs. + "бизнеспроцессменеджер": "BusinessProcessManager", + "бизнеспроцессобъект": "BusinessProcessObject", + "документменеджер": "DocumentManager", + "документобъект": "DocumentObject", + "журналдокументовменеджер": "DocumentJournalManager", + "задачаменеджер": "TaskManager", + "задачаобъект": "TaskObject", + "константаменеджерзначения": "ConstantValueManager", + "любаяссылка": "AnyRef", + "любаяссылкаиб": "AnyIBRef", + "наборзаписейперерасчета": "RecalculationRecordSet", + "наборзаписейпоследовательности": "SequenceRecordSet", + "наборзаписейрб": "AccountingRegisterRecordSet", + "наборзаписейрн": "AccumulationRegisterRecordSet", + "наборзаписейрр": "CalculationRegisterRecordSet", + "наборзаписейрс": "InformationRegisterRecordSet", + "обработкаменеджер": "DataProcessorManager", + "отчетменеджер": "ReportManager", + "пврменеджер": "ChartOfCalculationTypesManager", + "пвробъект": "ChartOfCalculationTypesObject", + "пврссылка": "ChartOfCalculationTypesRef", + "пвхменеджер": "ChartOfCharacteristicTypesManager", + "пвхобъект": "ChartOfCharacteristicTypesObject", + "пвхссылка": "ChartOfCharacteristicTypesRef", + "перечислениеменеджер": "EnumManager", + "планобменаменеджер": "ExchangePlanManager", + "планобменаобъект": "ExchangePlanObject", + "плансчетовменеджер": "ChartOfAccountsManager", + "плансчетовобъект": "ChartOfAccountsObject", + "регистрбухгалтериименеджер": "AccountingRegisterManager", + "регистрнакопленияменеджер": "AccumulationRegisterManager", + "регистррасчетаменеджер": "CalculationRegisterManager", + "регистрсведенийменеджер": "InformationRegisterManager", + "справочникменеджер": "CatalogManager", + "справочникобъект": "CatalogObject", + "характеристика": "Characteristic", "catalogref": "CatalogRef", "documentref": "DocumentRef", "enumref": "EnumRef", @@ -602,6 +645,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) if m: diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 index 905a56c71..27b94a256 100644 --- a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 +++ b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 @@ -1,4 +1,4 @@ -# mxl-compile v1.55 — Compile 1C spreadsheet from JSON +# mxl-compile v1.56 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -776,6 +776,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.py b/.claude/skills/mxl-compile/scripts/mxl-compile.py index 6610d4b5d..294f4a7f4 100644 --- a/.claude/skills/mxl-compile/scripts/mxl-compile.py +++ b/.claude/skills/mxl-compile/scripts/mxl-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# mxl-compile v1.55 — Compile 1C spreadsheet from JSON +# mxl-compile v1.56 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import hashlib @@ -573,6 +573,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index 7821f77df..da1bb2d7e 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.ps1 +++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1 @@ -1,4 +1,4 @@ -# skd-compile v1.122 — Compile 1C DCS from JSON (+write_xml_file/write_utf8_bom: общий эталон записи) +# skd-compile v1.123 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -436,6 +436,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 124e826cc..3e84d4cfd 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.py +++ b/.claude/skills/skd-compile/scripts/skd-compile.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python3 -# skd-compile v1.122 — Compile 1C DCS from JSON (+write_xml_file/write_utf8_bom: общий эталон записи) +#!/usr/bin/env python3 +# skd-compile v1.123 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -423,6 +423,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) if m: diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index 64a1523cc..f7deec875 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.ps1 +++ b/.claude/skills/skd-edit/scripts/skd-edit.ps1 @@ -1,4 +1,4 @@ -# skd-edit v1.40 — Atomic 1C DCS editor +# skd-edit v1.41 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: парный .py собирает выражения автодат вне f-string ради совместимости с python 3.9 (PEP 701). [CmdletBinding(PositionalBinding=$false)] @@ -267,6 +267,17 @@ function Resolve-TypeStr { $typeStr = $typeStr.Substring($typeStr.IndexOf(':') + 1) } + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + $typeStr = ($typeStr -replace '\s*\((?:все|all)\)\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '').Trim() + $typeStr = ($typeStr -replace '\s*\((?:типов|types):\s*\d+\)\s*$', '').Trim() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + if ($typeStr -match '^(.+?)\s*(?:→|->)\s*.+$') { $typeStr = $Matches[1].Trim() } + # Параметризованные типы: Number(15,2), Строка(100) if ($typeStr -match '^([^(]+)\((.+)\)$') { $baseName = $Matches[1].Trim() diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index ba20fb754..e0c550680 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.py +++ b/.claude/skills/skd-edit/scripts/skd-edit.py @@ -1,4 +1,4 @@ -# skd-edit v1.40 — Atomic 1C DCS editor (Python port) +# skd-edit v1.41 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -382,6 +382,18 @@ def resolve_type_str(type_str): type_str = type_str[4:] elif '.' in type_str and re.match(r'^d\d+p\d+:', type_str): type_str = type_str[type_str.index(':') + 1:] + # Хвосты, которые дописывает вывод meta-info к множествам типов: суффикс обобщённого метатипа + # и счётчик состава. Копипаста строки оттуда — обычный путь, поэтому хвост снимаем молча. + # Срезаем ТОЛЬКО эти известные формы: круглые скобки заняты параметризованными типами + # (Число(15,2)), слепой срез скобок сломал бы их. + type_str = re.sub(r'\s*\((?:все|all)\)\s*$', '', type_str).strip() + type_str = re.sub(r'\s*[—-]\s*(?:типов|types):\s*\d+\s*$', '', type_str).strip() + type_str = re.sub(r'\s*\((?:типов|types):\s*\d+\)\s*$', '', type_str).strip() + # Строка глоссария целиком: «ОпределяемыйТип.X -> Число(15,2)». Имя множества стоит слева, + # раскрытие справа — берём левую часть, она и есть тип. + m = re.match(r'^(.+?)\s*(?:→|->)\s*.+$', type_str) + if m: + type_str = m.group(1).strip() # Параметризованные типы: Number(15,2), Строка(100) m = re.match(r'^([^(]+)\((.+)\)$', type_str) if m: