mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-13 22:35:16 +03:00
feat(meta-compile,meta-decompile): «Только обороты» как токен-признак субконто (v1.39/v0.28)
«Только обороты» (<Turnover>) — предопределённый (встроенный) признак учёта субконто. Теперь он
выражается токеном `Turnover` (синонимы ТолькоОбороты/«Только обороты») в том же списке признаков,
что и добавленные: "Номенклатура | Turnover, Суммовой". Строковая форма стала полностью
самодостаточной — объектная {type, turnover?, flags?} остаётся принимаемым эквивалентом.
Компилятор вынимает токен turnover из списка flags (регистронезависимо) → <Turnover>true.
Декомпилятор всегда пишет строкой, ставя `Turnover` первым при Turnover=true (объектную форму
больше не порождает). Роундтрип 3/3 match; обе формы + смешанный массив проверены, ps1↔py identical.
Регресс 47/47 ps1+py. spec §7.2c.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# meta-compile v1.38 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.39 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -3809,6 +3809,9 @@ function Build-PredefinedXml {
|
||||
# --- Предопределённые СЧЕТА Плана счетов (отдельная грамматика: AccountType/OffBalance/Order/AccountingFlags/
|
||||
# ExtDimensionTypes/ChildItems). Флаги перечисляем по def-порядку списков признаков плана; в DSL — только TRUE. ---
|
||||
$script:predefAccGet = { param($o, [string[]]$keys) foreach ($k in $keys) { if ($o -is [System.Collections.IDictionary]) { if ($o.Contains($k)) { return $o[$k] } } elseif ($o.PSObject -and $o.PSObject.Properties[$k]) { return $o.$k } } return $null }
|
||||
# «Только обороты» (<Turnover>) — предопределённый признак учёта субконто. В DSL — токен в списке flags
|
||||
# наравне с добавленными признаками (ЛИБО отдельный ключ turnover). Распознаём по имени (регистронезависимо).
|
||||
$script:subcontoTurnoverTokens = @('turnover', 'толькообороты', 'только обороты', 'оборотный')
|
||||
function Emit-PredefAccountFlags {
|
||||
param($sb, [string]$indent, [string]$tag, [string]$refKind, [string]$objName, [string[]]$flagNames, $trueSet)
|
||||
if (-not $flagNames -or $flagNames.Count -eq 0) { [void]$sb.Append("$indent<$tag/>`n"); return }
|
||||
@@ -3861,7 +3864,11 @@ function Emit-PredefAccount {
|
||||
# Короткая запись: голое имя значения → префикс ПВХ видов субконто плана (extDimensionTypes); иначе резолв синонима.
|
||||
if (-not $scType.Contains('.')) { if ($extDimTypesRef) { $scType = "$extDimTypesRef.$scType" } }
|
||||
else { $scType = Resolve-TypePrefixSyn $scType }
|
||||
# «Только обороты» — токен в списке flags (или отдельный ключ turnover); вынимаем из настоящих признаков.
|
||||
$scTurn = if ($scTurnV -eq $true) { 'true' } else { 'false' }
|
||||
$scFlagsReal = @()
|
||||
foreach ($f in @($scFlags)) { if ("$f".Trim().ToLower() -in $script:subcontoTurnoverTokens) { $scTurn = 'true' } else { $scFlagsReal += $f } }
|
||||
$scFlags = $scFlagsReal
|
||||
[void]$sb.Append("$indent`t`t<ExtDimensionType name=`"$(Esc-Xml $scType)`">`n")
|
||||
[void]$sb.Append("$indent`t`t`t<Turnover>$scTurn</Turnover>`n")
|
||||
Emit-PredefAccountFlags $sb "$indent`t`t`t" 'AccountingFlags' 'ExtDimensionAccountingFlag' $objName $extDimFlagNames $scFlags
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-compile v1.38 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.39 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -662,6 +662,8 @@ fill_bool_true = ('true', 'истина', 'да')
|
||||
fill_bool_false = ('false', 'ложь', 'нет')
|
||||
# Значения платформенного перечисления ВидСчета (ent:AccountType) — FillValue реквизита Тип у Плана счетов.
|
||||
ACCOUNT_TYPE_VALUES = ('Active', 'Passive', 'ActivePassive')
|
||||
# «Только обороты» (<Turnover>) — предопределённый признак учёта субконто; токен в списке flags наравне с добавленными.
|
||||
SUBCONTO_TURNOVER_TOKENS = ('turnover', 'толькообороты', 'только обороты', 'оборотный')
|
||||
# XxxRef (тип реквизита) → корень DTR-пути (для разворота короткой записи значения).
|
||||
fill_ref_kind_root = {
|
||||
'catalogref': 'Catalog', 'documentref': 'Document', 'enumref': 'Enum',
|
||||
@@ -3718,7 +3720,15 @@ def emit_predef_account(out, val, indent, obj_nm, acct_flag_names, ext_dim_flag_
|
||||
sc_type = f'{ext_dim_types_ref}.{sc_type}'
|
||||
else:
|
||||
sc_type = resolve_type_prefix_syn(sc_type)
|
||||
# «Только обороты» — токен в списке flags (или отдельный ключ turnover); вынимаем из настоящих признаков.
|
||||
sc_turn = 'true' if sc_turn_v is True else 'false'
|
||||
real_flags = []
|
||||
for f in (sc_flags or []):
|
||||
if str(f).strip().lower() in SUBCONTO_TURNOVER_TOKENS:
|
||||
sc_turn = 'true'
|
||||
else:
|
||||
real_flags.append(f)
|
||||
sc_flags = real_flags
|
||||
out.append(f'{indent}\t\t<ExtDimensionType name="{esc_xml(sc_type)}">')
|
||||
out.append(f'{indent}\t\t\t<Turnover>{sc_turn}</Turnover>')
|
||||
emit_predef_account_flags(out, f'{indent}\t\t\t', 'AccountingFlags', 'ExtDimensionAccountingFlag', obj_nm, ext_dim_flag_names, sc_flags)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-decompile v0.27 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
|
||||
# meta-decompile v0.28 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
#
|
||||
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts. Инверс meta-compile (omit-on-default: ключ эмитим только
|
||||
@@ -808,27 +808,22 @@ if (Test-Path -LiteralPath $predefPath) {
|
||||
foreach ($fl in @($itemEl.SelectNodes("*[local-name()='AccountingFlags']/*[local-name()='Flag']"))) {
|
||||
if ($fl.InnerText -eq 'true') { $r = $fl.GetAttribute('ref'); $trueFlags += ($r -split '\.')[-1] }
|
||||
}
|
||||
# ExtDimensionTypes → subconto. Короткая запись: срезаем префикс ПВХ видов субконто плана (extDimensionTypes).
|
||||
# turnover=false → строка "Тип | Признак1, Признак2" (или "Тип" без признаков); turnover=true → объект.
|
||||
# ExtDimensionTypes → subconto. Короткая запись "Тип | Признак1, Признак2": срезаем префикс ПВХ видов субконто
|
||||
# плана (extDimensionTypes); «Только обороты» (Turnover=true) — предопределённый признак-токен `Turnover` первым
|
||||
# в списке (наравне с добавленными). Захватываем только TRUE-признаки (компилятор развернёт по def-порядку).
|
||||
$edtPfx = if ($dsl['extDimensionTypes']) { "$($dsl['extDimensionTypes'])." } else { $null }
|
||||
$subconto = [System.Collections.ArrayList]@()
|
||||
foreach ($edt in @($itemEl.SelectNodes("*[local-name()='ExtDimensionTypes']/*[local-name()='ExtDimensionType']"))) {
|
||||
$scT = $edt.GetAttribute('name')
|
||||
if ($edtPfx -and $scT.StartsWith($edtPfx)) { $scT = $scT.Substring($edtPfx.Length) }
|
||||
$tEl = $edt.SelectSingleNode("*[local-name()='Turnover']")
|
||||
$scTurn = ($tEl -and $tEl.InnerText -eq 'true')
|
||||
$stf = @()
|
||||
$scFlagsOut = @()
|
||||
if ($tEl -and $tEl.InnerText -eq 'true') { $scFlagsOut += 'Turnover' }
|
||||
foreach ($fl in @($edt.SelectNodes("*[local-name()='AccountingFlags']/*[local-name()='Flag']"))) {
|
||||
if ($fl.InnerText -eq 'true') { $r = $fl.GetAttribute('ref'); $stf += ($r -split '\.')[-1] }
|
||||
}
|
||||
if (-not $scTurn) {
|
||||
if ($stf.Count -gt 0) { [void]$subconto.Add("$scT | " + ($stf -join ', ')) }
|
||||
else { [void]$subconto.Add($scT) }
|
||||
} else {
|
||||
$so = [ordered]@{ type = $scT; turnover = $true }
|
||||
if ($stf.Count -gt 0) { $so['flags'] = [System.Collections.ArrayList]@($stf) }
|
||||
[void]$subconto.Add($so)
|
||||
if ($fl.InnerText -eq 'true') { $r = $fl.GetAttribute('ref'); $scFlagsOut += ($r -split '\.')[-1] }
|
||||
}
|
||||
if ($scFlagsOut.Count -gt 0) { [void]$subconto.Add("$scT | " + ($scFlagsOut -join ', ')) }
|
||||
else { [void]$subconto.Add($scT) }
|
||||
}
|
||||
$childContainer = $itemEl.SelectSingleNode("*[local-name()='ChildItems']")
|
||||
$kids = @(if ($childContainer) { $childContainer.SelectNodes("*[local-name()='Item']") } else { @() })
|
||||
|
||||
@@ -701,8 +701,9 @@ Split-CamelCase имени.
|
||||
**Субконто** (`subconto`) — короткая строка **`"Вид | Признак1, Признак2"`** (после `|` — включённые признаки учёта
|
||||
субконто): `type` — голое имя предопределённого значения ПВХ, компилятор разворачивает через `extDimensionTypes` плана
|
||||
(`Номенклатура` → `ChartOfCharacteristicTypes.ВидыСубконто.Номенклатура`); признаки — только TRUE, разворот по def-порядку
|
||||
`extDimensionAccountingFlags`. Объектная форма `{type, turnover?, flags?}` — когда нужен `turnover: true`
|
||||
(`<Turnover>` = «Только обороты»: субконто ведётся только по оборотам, без остатков; синоним `толькоОбороты`).
|
||||
`extDimensionAccountingFlags`. **«Только обороты»** (`<Turnover>` — субконто ведётся только по оборотам, без остатков) —
|
||||
предопределённый признак-токен **`Turnover`** (синонимы `ТолькоОбороты`/`Только обороты`) в том же списке признаков:
|
||||
`"Номенклатура | Turnover, Суммовой"`. Объектная форма `{type, turnover?, flags?}` тоже принимается (эквивалент).
|
||||
|
||||
```json
|
||||
"predefined": [
|
||||
|
||||
Reference in New Issue
Block a user