feat(mxl-compile,mxl-decompile): формат самой строки

У строки есть собственный формат: платформа хранит в нём скрытие (17 423 вхождения
в корпусе), шрифт (9 216), фон, выравнивания, защиту. Мы писали туда только высоту,
всё остальное теряли.

Разбор на контролируемом стенде показал, что это два разных случая, а не один.
Оформление, применённое к строке целиком, платформа пишет И строке, И каждой
ячейке (backColor: 13 899 ячеек повторяют против 96). Скрытие — только строке
(24 026 против 62 856). Поэтому одного правила «rowStyle красит ячейки» мало.

Теперь rowStyle — стиль строки: по умолчанию ложится и на строку, и на ячейки,
как это делает платформа. Объектная форма { style, apply } задаёт исключения:
"row" — только строке, "cells" — только ячейкам. Модификатор нужен раундтрипу,
в описании DSL его нет.

Скрытие и высота — собственные свойства строки, ключами рядом: у ячейки таких
свойств не бывает, и в её оформление они не попадают.

На пилоте категория row[].formatIndex упала с 1964 до 201 потерянного факта.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-11 18:36:41 +03:00
co-authored by Claude Opus 5
parent ccbd488d63
commit ba25aa4a00
25 changed files with 611 additions and 167 deletions
+3 -2
View File
@@ -58,7 +58,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J
fonts: { name: { face, size, bold, italic, underline, strikeout } },
styles: { name: { font, horizontalAlignment, verticalAlignment, textPlacement,
backColor, textColor, border, borderColor, format, hidden } },
areas: [{ name, columnSet, rows: [{ height, rowStyle, cells: [
areas: [{ name, columnSet, rows: [{ height, hidden, rowStyle, cells: [
{ col, span, rowspan, style, param, detail, text, template }
]}]}],
namedAreas: [{ name, rows, cols }],
@@ -73,7 +73,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J
- `columnSet` у области — ссылка на раскладку из `columnSets`, когда группе строк нужны свои ширины колонок; без него действует документная раскладка
- Ключ стиля — имя свойства как в выгрузке; `columnStyles` вешает стиль на колонку так же, как `style` на ячейку
- Рамка — `border` (все стороны) или `leftBorder`/`topBorder`/`rightBorder`/`bottomBorder`; значение `"Solid"` либо `{ style, width }`
- `rowStyle`автозаполнение пустот стилем (рамки по всей ширине)
- `rowStyle`стиль строки: ложится и на строку, и на все её колонки, заполняя пустоты (рамки по всей ширине)
- `height` и `hidden` — собственные свойства строки, у ячейки таких нет
- `empty` в строке — шорткат для N подряд пустых строк (`{ "empty": 3 }` = три `{}`)
- Строку можно писать массивом ячеек — позиция из порядка, `col` не нужен: `"текст"`, `"{Имя}"` — параметр, `">"` — продолжить ячейку слева, `"|"` — сверху, `null` — пропуск колонки
- `col` — 1-based позиция колонки
@@ -127,12 +127,16 @@
| Поле | По умолч. | Описание |
|------|-----------|----------|
| `height` | — | Высота строки (если не задана, используется авто) |
| `rowStyle` | — | Стиль для ВСЕХ колонок (заполняет пустоты рамками) |
| `hidden` | `false` | Скрыть строку |
| `rowStyle` | — | Стиль строки: ложится и на саму строку, и на ВСЕ её колонки (заполняет пустоты рамками) |
| `cells` | `[]` | Массив ячеек |
| `empty` | — | Количество подряд идущих пустых строк (заменяет N отдельных `{}`) |
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
`height` и `hidden` — собственные свойства строки: у ячейки таких нет, и в её оформление они
не попадают. Всё остальное оформление строки задаётся через `rowStyle`.
### Короткая форма: строка массивом
Вместо объекта строка может быть массивом ячеек — позиция определяется порядком, `col` не указывается.
@@ -203,9 +207,11 @@
Пустая строка — это текст: ячейка с `"text": ""` даёт пустую надпись, а не ячейку без текста.
## `rowStyle` — автозаполнение
## `rowStyle` — оформление строки
Стиль применяется ко ВСЕЙ ширине строки: позиции без явных ячеек получают тот же стиль. Так в табличных строках получаются сплошные рамки.
Стиль применяется ко ВСЕЙ ширине строки: позиции без явных ячеек получают тот же стиль. Так в табличных строках получаются сплошные рамки. Он же становится оформлением самой строки — именно так платформа хранит строку, оформленную целиком.
Стиль конкретной ячейки (`style`) перекрывает `rowStyle` для этой ячейки.
Если в предыдущих строках той же области есть ячейки с `rowspan`, их колонки при автозаполнении пропускаются.
@@ -216,8 +222,6 @@ round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попа
XML не возвращается.
- ячейки-поля ввода (`containsValue` / `valueType` / `controlType`);
- оформление СТРОКИ помимо высоты: у строки задаётся только `height`, а скрытие,
шрифт и прочее платформа хранит и у неё тоже;
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды, и примечания к ячейкам;
- группировки строк и колонок;
@@ -1,4 +1,4 @@
# mxl-compile v1.32 — Compile 1C spreadsheet from JSON
# mxl-compile v1.33 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -474,6 +474,41 @@ function Get-ColorNamespace {
return ''
}
# Стиль строки: имя строкой либо объект { style, apply }. apply — куда лёг стиль:
# "both" (умолчание) — и в формат строки, и в форматы ячеек, как пишет платформа, когда
# автор оформляет строку целиком; "row" — только строке (так хранится, например, скрытие);
# "cells" — только ячейкам. Модификатор нужен раундтрипу, в описании DSL его нет.
function Get-RowStyleSpec {
param($val, [string]$where)
if ($null -eq $val) { return @{ Name = $null; Apply = 'both' } }
if ($val -is [string]) { return @{ Name = $val; Apply = 'both' } }
$name = "$($val.style)"
$apply = if ($val.apply) { "$($val.apply)".ToLower() } else { 'both' }
if ($apply -notin @('both', 'row', 'cells')) {
[Console]::Error.WriteLine("Unknown 'apply' value `"$($val.apply)`" ($where). Allowed: both, row, cells")
exit 1
}
if (-not $name) {
[Console]::Error.WriteLine("rowStyle object requires 'style' ($where)")
exit 1
}
return @{ Name = $name; Apply = $apply }
}
# Формат самой строки: собственные свойства строки (высота, скрытие) плюс стиль строки,
# если он ложится на строку. Пустой набор = у строки формата нет.
function Get-RowFormatProps {
param($row)
$props = @{}
$spec = Get-RowStyleSpec $row.rowStyle "row"
if ($spec.Name -and $spec.Apply -cne 'cells') {
$props = Resolve-Style -styleName $spec.Name -fillType "" -noDefaultFont
}
if ($row.height) { $props['height'] = [int]$row.height }
if ($row.hidden -eq $true) { $props['hidden'] = 'true' }
return $props
}
function Resolve-Style {
param([string]$styleName, [string]$fillType, [switch]$noDefaultFont)
@@ -957,20 +992,23 @@ foreach ($area in $def.areas) {
# Skip empty row placeholder
if ($row.empty) { continue }
# Row height format
if ($row.height) {
Register-Format @{ height = [int]$row.height } | Out-Null
}
# Формат САМОЙ строки: высота и скрытие — её собственные свойства (у ячейки таких
# нет), плюс стиль строки, если он ложится на строку.
$rowProps = Get-RowFormatProps $row
if ($rowProps.Count -gt 0) { Register-Format $rowProps | Out-Null }
$spec = Get-RowStyleSpec $row.rowStyle "row"
$cellsStyle = if ($spec.Apply -ceq 'row') { $null } else { $spec.Name }
# rowStyle gap-fill format (no content → no fillType)
if ($row.rowStyle) {
Register-CellFormat -styleName $row.rowStyle -fillType "" | Out-Null
if ($cellsStyle) {
Register-CellFormat -styleName $cellsStyle -fillType "" | Out-Null
}
# Explicit cell formats
if ($row.cells) {
foreach ($cell in $row.cells) {
$cellStyle = if ($cell.style) { $cell.style } elseif ($row.rowStyle) { $row.rowStyle } else { "default" }
$cellStyle = if ($cell.style) { $cell.style } elseif ($cellsStyle) { $cellsStyle } else { "default" }
$ft = Get-FillType $cell
Register-CellFormat -styleName $cellStyle -fillType $ft | Out-Null
}
@@ -1118,11 +1156,13 @@ foreach ($area in $def.areas) {
$rowHasContent = $false
$rowCells = @() # array of { Col(0-based), FormatIdx, Content }
# Determine row height format
# Формат самой строки — высота, скрытие и стиль строки, если он ложится на строку
$rowFormatIdx = 0
if ($row.height) {
$rowFormatIdx = Register-Format @{ height = [int]$row.height }
}
$rowProps = Get-RowFormatProps $row
if ($rowProps.Count -gt 0) { $rowFormatIdx = Register-Format $rowProps }
$spec = Get-RowStyleSpec $row.rowStyle "row"
$cellsStyle = if ($spec.Apply -ceq 'row') { $null } else { $spec.Name }
if ($row.cells -and $row.cells.Count -gt 0) {
$rowHasContent = $true
@@ -1186,7 +1226,7 @@ foreach ($area in $def.areas) {
$colStart = [int]$cell.col
$colSpan = if ($cell.span) { [int]$cell.span } else { 1 }
$rowspan = if ($cell.rowspan) { [int]$cell.rowspan } else { 1 }
$cellStyle = if ($cell.style) { $cell.style } elseif ($row.rowStyle) { $row.rowStyle } else { "default" }
$cellStyle = if ($cell.style) { $cell.style } elseif ($cellsStyle) { $cellsStyle } else { "default" }
$ft = Get-FillType $cell
$fmtIdx = Register-CellFormat -styleName $cellStyle -fillType $ft
@@ -1219,8 +1259,8 @@ foreach ($area in $def.areas) {
}
# Generate gap-fill cells for rowStyle
if ($row.rowStyle) {
$gapFmtIdx = Register-CellFormat -styleName $row.rowStyle -fillType ""
if ($cellsStyle) {
$gapFmtIdx = Register-CellFormat -styleName $cellsStyle -fillType ""
for ($c = 1; $c -le $totalColumns; $c++) {
if (-not $occupiedCols.ContainsKey($c)) {
$rowCells += @{
@@ -1238,10 +1278,10 @@ foreach ($area in $def.areas) {
# Sort cells by column
$rowCells = $rowCells | Sort-Object { $_.Col }
} elseif ($row.rowStyle) {
} elseif ($cellsStyle) {
# Row with only rowStyle, no explicit cells — fill non-rowspan columns
$rowHasContent = $true
$gapFmtIdx = Register-CellFormat -styleName $row.rowStyle -fillType ""
$gapFmtIdx = Register-CellFormat -styleName $cellsStyle -fillType ""
for ($c = 1; $c -le $totalColumns; $c++) {
if ($rowspanOccupied.ContainsKey($c)) { continue }
$rowCells += @{
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# mxl-compile v1.32 — Compile 1C spreadsheet from JSON
# mxl-compile v1.33 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import hashlib
@@ -669,6 +669,39 @@ def main():
sys.exit(1)
return {'Style': canon, 'Width': width, 'Gap': gap}
def row_style_spec(val, where):
"""Стиль строки: имя строкой либо объект { style, apply }. apply — куда лёг стиль:
"both" (умолчание) — и в формат строки, и в форматы ячеек, как пишет платформа, когда
автор оформляет строку целиком; "row" — только строке (так хранится, например,
скрытие); "cells" — только ячейкам. Модификатор нужен раундтрипу, в описании DSL его нет."""
if val is None:
return None, 'both'
if not isinstance(val, dict):
return str(val), 'both'
name = str(val.get('style') or '')
apply_to = str(val.get('apply') or 'both').lower()
if apply_to not in ('both', 'row', 'cells'):
print(f"Unknown 'apply' value \"{val.get('apply')}\" ({where})."
f" Allowed: both, row, cells", file=sys.stderr)
sys.exit(1)
if not name:
print(f"rowStyle object requires 'style' ({where})", file=sys.stderr)
sys.exit(1)
return name, apply_to
def row_format_props(row):
"""Формат самой строки: собственные свойства строки (высота, скрытие) плюс стиль
строки, если он ложится на строку. Пустой набор = у строки формата нет."""
props = {}
name, apply_to = row_style_spec(row.get('rowStyle'), 'row')
if name and apply_to != 'cells':
props = resolve_style(name, '', no_default_font=True)
if row.get('height'):
props['height'] = int(row['height'])
if row.get('hidden') is True:
props['hidden'] = 'true'
return props
def resolve_style(style_name, fill_type, no_default_font=False):
# Набор свойств формата — «тег платформы → значение», только заданные. Порядок вставки
# роли не играет: и ключ дедупликации, и эмиссия идут по каноническому порядку тегов.
@@ -986,18 +1019,23 @@ def main():
if row.get('empty'):
continue
# Row height format
if row.get('height'):
register_format({'height': int(row['height'])})
# Формат САМОЙ строки: высота и скрытие — её собственные свойства (у ячейки
# таких нет), плюс стиль строки, если он ложится на строку.
row_props = row_format_props(row)
if row_props:
register_format(row_props)
rs_name, rs_apply = row_style_spec(row.get('rowStyle'), 'row')
cells_style = None if rs_apply == 'row' else rs_name
# rowStyle gap-fill format
if row.get('rowStyle'):
register_cell_format(row['rowStyle'], '')
if cells_style:
register_cell_format(cells_style, '')
# Explicit cell formats
if row.get('cells'):
for cell in row['cells']:
cell_style = cell.get('style') or row.get('rowStyle') or 'default'
cell_style = cell.get('style') or cells_style or 'default'
ft = get_fill_type(cell)
register_cell_format(cell_style, ft)
@@ -1133,9 +1171,14 @@ def main():
row_cells = []
# Determine row height format
# Формат самой строки — высота, скрытие и стиль строки, если он ложится на строку
row_format_idx = 0
if row.get('height'):
row_format_idx = register_format({'height': int(row['height'])})
row_props = row_format_props(row)
if row_props:
row_format_idx = register_format(row_props)
rs_name, rs_apply = row_style_spec(row.get('rowStyle'), 'row')
cells_style = None if rs_apply == 'row' else rs_name
if row.get('cells') and len(row['cells']) > 0:
row_has_content = True
@@ -1185,7 +1228,7 @@ def main():
col_start = int(cell['col'])
col_span = int(cell.get('span', 1))
rowspan = int(cell.get('rowspan', 1))
cell_style = cell.get('style') or row.get('rowStyle') or 'default'
cell_style = cell.get('style') or cells_style or 'default'
ft = get_fill_type(cell)
fmt_idx = register_cell_format(cell_style, ft)
@@ -1216,8 +1259,8 @@ def main():
merges.append(merge)
# Generate gap-fill cells for rowStyle
if row.get('rowStyle'):
gap_fmt_idx = register_cell_format(row['rowStyle'], '')
if cells_style:
gap_fmt_idx = register_cell_format(cells_style, '')
for c in range(1, total_columns + 1):
if c not in occupied_cols:
row_cells.append({
@@ -1232,10 +1275,10 @@ def main():
# Sort cells by column
row_cells.sort(key=lambda x: x['Col'])
elif row.get('rowStyle'):
elif cells_style:
# Row with only rowStyle, no explicit cells
row_has_content = True
gap_fmt_idx = register_cell_format(row['rowStyle'], '')
gap_fmt_idx = register_cell_format(cells_style, '')
for c in range(1, total_columns + 1):
if c in rowspan_occupied:
continue
@@ -1,4 +1,4 @@
# mxl-decompile v1.12 — Decompile 1C spreadsheet to JSON
# mxl-decompile v1.13 — Decompile 1C spreadsheet to JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -499,6 +499,30 @@ foreach ($r in $rowData.Values) {
}
}
# Оформление строки без её собственных свойств: скрытие уезжает инлайном к height,
# поэтому в именованный стиль попадать не должно.
function Get-RowStyleFmt {
param($fmt)
if (-not $fmt) { return $null }
$props = Get-StyleProps $fmt
$props.Remove('hidden') | Out-Null
if ($props.Count -eq 0) { return $null }
$reduced = [ordered]@{}
foreach ($tag in $fmt.Props.Keys) {
if ($tag -cne 'hidden') { $reduced[$tag] = $fmt.Props[$tag] }
}
return @{ FontIdx = $fmt.FontIdx; Width = 0; Height = 0; FillType = ""; Props = $reduced }
}
# Строка — тоже владелец формата: её оформление становится именованным стилем.
foreach ($rd in $rowData.Values) {
if ($rd.FormatIdx -le 0) { continue }
$rf = Get-RowStyleFmt (Get-Format $rd.FormatIdx)
if (-not $rf) { continue }
$key = Get-StyleKey $rf
if (-not $styleKeys.Contains($key)) { $styleKeys[$key] = $rf }
}
# Колонка — третий владелец формата, её оформление тоже становится именованным стилем.
foreach ($cs in $columnSets) {
foreach ($fi in $cs.FmtIdx.Values) {
@@ -740,11 +764,13 @@ foreach ($area in $blocks) {
$dslRow = [ordered]@{}
# Row height
if ($rd.FormatIdx -gt 0) {
$rowFmt = Get-Format $rd.FormatIdx
if ($rowFmt -and $rowFmt.Height -gt 0) { $dslRow["height"] = $rowFmt.Height }
}
# Формат самой строки: высота и скрытие — её собственные свойства (у ячейки таких
# нет), остальное — оформление, оно же может лежать и на ячейках.
$rowFmt = if ($rd.FormatIdx -gt 0) { Get-Format $rd.FormatIdx } else { $null }
$rowOwn = if ($rowFmt) { Get-StyleProps $rowFmt } else { [ordered]@{} }
$rowHidden = ($rowOwn['hidden'] -eq $true)
if ($rowFmt -and $rowFmt.Height -gt 0) { $dslRow["height"] = $rowFmt.Height }
if ($rowHidden) { $dslRow["hidden"] = $true }
# Separate content cells from gap-fill cells
$contentCells = @()
@@ -780,7 +806,25 @@ foreach ($area in $blocks) {
}
}
if ($rowStyleName -and $rowStyleName -ne "default") { $dslRow["rowStyle"] = $rowStyleName }
# Стиль строки и стиль ячеек — независимые вещи: платформа их часто, но не всегда
# пишет одинаковыми. Один ключ с модификатором apply покрывает все три случая.
$ownFmt = Get-RowStyleFmt $rowFmt
$ownKey = if ($ownFmt) { Get-StyleKey $ownFmt } else { $null }
$ownName = if ($ownKey -and $styleNames.Contains($ownKey)) { $styleNames[$ownKey] } else { $null }
$cellsName = if ($rowStyleName -and $rowStyleName -ne "default") { $rowStyleName } else { $null }
if ($ownName -and $cellsName -and $ownKey -ceq $rowStyleKey) {
$dslRow["rowStyle"] = $ownName
} elseif ($ownName -and -not $cellsName) {
$dslRow["rowStyle"] = [ordered]@{ style = $ownName; apply = "row" }
} elseif ($cellsName -and -not $ownName) {
$dslRow["rowStyle"] = [ordered]@{ style = $cellsName; apply = "cells" }
} elseif ($ownName -and $cellsName) {
# Стили разные — строке своё, ячейкам своё; ячейкам стиль раздаётся поячеечно.
$dslRow["rowStyle"] = [ordered]@{ style = $ownName; apply = "row" }
$rowStyleName = $null
$rowStyleKey = $null
}
# Build cell list
$dslCells = @()
@@ -938,7 +982,10 @@ foreach ($a in $dslAreas) {
# Строка может быть массивом (короткая форма) — у неё нет свойства cells, и без этой
# ветки стиль, использованный только внутри такой строки, вырезался как «неиспользуемый».
$cellList = if ($r -is [array]) { $r } else { $r.cells }
if ($r -isnot [array] -and $r.rowStyle) { $usedStyles[$r.rowStyle] = $true }
if ($r -isnot [array] -and $r.rowStyle) {
$rs = $r.rowStyle
$usedStyles[$(if ($rs -is [System.Collections.IDictionary]) { $rs['style'] } else { $rs })] = $true
}
if ($cellList) { foreach ($c in $cellList) { if ($c -isnot [string] -and $c.style) { $usedStyles[$c.style] = $true } } }
}
}
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# mxl-decompile v1.12 — Decompile 1C spreadsheet to JSON
# mxl-decompile v1.13 — Decompile 1C spreadsheet to JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -659,6 +659,31 @@ def main():
style_keys[key] = fmt
format_to_style_key[cell["FormatIdx"]] = key
def row_style_fmt(fmt):
"""Оформление строки без её собственных свойств: скрытие уезжает инлайном к height,
поэтому в именованный стиль попадать не должно."""
if not fmt:
return None
props = style_props(fmt)
props.pop("hidden", None)
if not props:
return None
reduced = OrderedDict()
for tag, raw in fmt["Props"].items():
if tag != "hidden":
reduced[tag] = raw
return {"FontIdx": fmt["FontIdx"], "Width": 0, "Height": 0,
"FillType": "", "Props": reduced}
# Строка — тоже владелец формата: её оформление становится именованным стилем.
for rd in row_data.values():
rf = row_style_fmt(get_format(rd["FormatIdx"])) if rd["FormatIdx"] > 0 else None
if not rf:
continue
key = get_style_key(rf)
if key not in style_keys:
style_keys[key] = rf
# Колонка — третий владелец формата, её оформление тоже становится именованным стилем.
for cs in column_sets:
for fi in cs["FmtIdx"].values():
@@ -870,11 +895,15 @@ def main():
dsl_row = OrderedDict()
# Row height
if rd["FormatIdx"] > 0:
row_fmt = get_format(rd["FormatIdx"])
if row_fmt and row_fmt["Height"] > 0:
dsl_row["height"] = row_fmt["Height"]
# Формат самой строки: высота и скрытие — её собственные свойства (у ячейки
# таких нет), остальное — оформление, оно же может лежать и на ячейках.
row_fmt = get_format(rd["FormatIdx"]) if rd["FormatIdx"] > 0 else None
row_own = style_props(row_fmt) if row_fmt else OrderedDict()
row_hidden = row_own.pop("hidden", False)
if row_fmt and row_fmt["Height"] > 0:
dsl_row["height"] = row_fmt["Height"]
if row_hidden:
dsl_row["hidden"] = True
# Separate content cells from gap-fill cells
content_cells = []
@@ -904,8 +933,25 @@ def main():
if row_style_key in style_names:
row_style_name = style_names[row_style_key]
if row_style_name and row_style_name != "default":
dsl_row["rowStyle"] = row_style_name
# Стиль строки и стиль ячеек — независимые вещи: платформа их часто, но не всегда
# пишет одинаковыми. Один ключ с модификатором apply покрывает все три случая.
own_fmt = row_style_fmt(row_fmt)
own_key = get_style_key(own_fmt) if own_fmt else None
own_name = style_names.get(own_key) if own_key else None
cells_name = row_style_name if row_style_name and row_style_name != "default" else None
if own_name and cells_name and own_key == row_style_key:
dsl_row["rowStyle"] = own_name
elif own_name and not cells_name:
dsl_row["rowStyle"] = OrderedDict([("style", own_name), ("apply", "row")])
elif cells_name and not own_name:
dsl_row["rowStyle"] = OrderedDict([("style", cells_name), ("apply", "cells")])
elif own_name and cells_name:
# Стили разные — строке своё, ячейкам своё; ячейкам стиль раздаётся ниже
# поячеечно, поэтому здесь пишем только строку.
dsl_row["rowStyle"] = OrderedDict([("style", own_name), ("apply", "row")])
row_style_name = None
row_style_key = None
# Build cell list
dsl_cells = []
@@ -1075,7 +1121,8 @@ def main():
cell_list = r
else:
if "rowStyle" in r:
used_styles.add(r["rowStyle"])
rs = r["rowStyle"]
used_styles.add(rs["style"] if isinstance(rs, dict) else rs)
cell_list = r.get("cells") or []
# Список ячеек может быть позиционным: строки, None и маркеры стиля не несут,
# стиль бывает только у объектного элемента.
+9 -5
View File
@@ -127,12 +127,16 @@
| Поле | По умолч. | Описание |
|------|-----------|----------|
| `height` | — | Высота строки (если не задана, используется авто) |
| `rowStyle` | — | Стиль для ВСЕХ колонок (заполняет пустоты рамками) |
| `hidden` | `false` | Скрыть строку |
| `rowStyle` | — | Стиль строки: ложится и на саму строку, и на ВСЕ её колонки (заполняет пустоты рамками) |
| `cells` | `[]` | Массив ячеек |
| `empty` | — | Количество подряд идущих пустых строк (заменяет N отдельных `{}`) |
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
`height` и `hidden` — собственные свойства строки: у ячейки таких нет, и в её оформление они
не попадают. Всё остальное оформление строки задаётся через `rowStyle`.
### Короткая форма: строка массивом
Вместо объекта строка может быть массивом ячеек — позиция определяется порядком, `col` не указывается.
@@ -203,9 +207,11 @@
Пустая строка — это текст: ячейка с `"text": ""` даёт пустую надпись, а не ячейку без текста.
## `rowStyle` — автозаполнение
## `rowStyle` — оформление строки
Стиль применяется ко ВСЕЙ ширине строки: позиции без явных ячеек получают тот же стиль. Так в табличных строках получаются сплошные рамки.
Стиль применяется ко ВСЕЙ ширине строки: позиции без явных ячеек получают тот же стиль. Так в табличных строках получаются сплошные рамки. Он же становится оформлением самой строки — именно так платформа хранит строку, оформленную целиком.
Стиль конкретной ячейки (`style`) перекрывает `rowStyle` для этой ячейки.
Если в предыдущих строках той же области есть ячейки с `rowspan`, их колонки при автозаполнении пропускаются.
@@ -216,8 +222,6 @@ round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попа
XML не возвращается.
- ячейки-поля ввода (`containsValue` / `valueType` / `controlType`);
- оформление СТРОКИ помимо высоты: у строки задаётся только `height`, а скрытие,
шрифт и прочее платформа хранит и у неё тоже;
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды, и примечания к ячейкам;
- группировки строк и колонок;
@@ -0,0 +1,38 @@
{
"name": "Формат строки: скрытие, высота и режимы применения стиля",
"input": {
"columns": 3,
"defaultWidth": 20,
"fonts": {
"default": { "face": "Arial", "size": 10 },
"bold": { "face": "Arial", "size": 10, "bold": true }
},
"styles": {
"фон": { "backColor": "#EBEBEB" },
"рамка": { "border": "Solid" },
"жирный": { "font": "bold" }
},
"areas": [
{
"name": "Тело",
"rows": [
{ "height": 20, "hidden": true, "cells": [
{ "col": 1, "text": "скрытая строка" }
]},
{ "rowStyle": "фон", "cells": [
{ "col": 1, "text": "и строке, и ячейкам" }
]},
{ "rowStyle": { "style": "жирный", "apply": "row" }, "cells": [
{ "col": 1, "text": "только строке" }
]},
{ "rowStyle": { "style": "рамка", "apply": "cells" }, "cells": [
{ "col": 1, "text": "только ячейкам" }
]}
]
}
]
},
"params": { "outputPath": "Template.xml" },
"validatePath": "Template.xml",
"expect": { "files": ["Template.xml"] }
}
@@ -51,9 +51,10 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>5</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -64,7 +65,7 @@
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -75,7 +76,7 @@
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -86,7 +87,7 @@
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -97,7 +98,7 @@
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -108,7 +109,7 @@
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -149,6 +150,9 @@
<format>
<width>30</width>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -38,21 +38,22 @@
<rowsItem>
<index>3</index>
<row>
<formatIndex>3</formatIndex>
<c>
<c>
<f>4</f>
<f>5</f>
<parameter>Код</parameter>
</c>
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<parameter>Имя</parameter>
</c>
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<parameter>Значение</parameter>
</c>
</c>
@@ -99,6 +100,9 @@
<font>1</font>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -15,9 +15,10 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>2</f>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +29,7 @@
</c>
<c>
<c>
<f>2</f>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +40,7 @@
</c>
<c>
<c>
<f>2</f>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -50,7 +51,7 @@
</c>
<c>
<c>
<f>2</f>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -64,27 +65,28 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>4</f>
<f>6</f>
<parameter>Дата</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>7</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>8</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>8</f>
<parameter>Цена</parameter>
</c>
</c>
@@ -121,11 +123,18 @@
<format>
<width>10</width>
</format>
<format>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<font>0</font>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -15,9 +15,10 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>3</f>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +29,7 @@
</c>
<c>
<c>
<f>3</f>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -40,7 +41,7 @@
<c>
<i>3</i>
<c>
<f>3</f>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -54,10 +55,11 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>2</formatIndex>
<c>
<i>1</i>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -68,7 +70,7 @@
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -82,27 +84,28 @@
<rowsItem>
<index>2</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Наименование</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Артикул</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Итого</parameter>
</c>
</c>
@@ -157,6 +160,9 @@
<format>
<width>10</width>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -27,9 +27,10 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -40,7 +41,7 @@
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -51,7 +52,7 @@
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -62,7 +63,7 @@
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -76,28 +77,29 @@
<rowsItem>
<index>2</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Товар</parameter>
<detailParameter>Номенклатура</detailParameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -109,7 +111,7 @@
<c>
<i>2</i>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -120,7 +122,7 @@
</c>
<c>
<c>
<f>8</f>
<f>9</f>
<parameter>Всего</parameter>
</c>
</c>
@@ -192,6 +194,9 @@
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -45,6 +45,7 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>3</formatIndex>
<c>
<c>
<f>3</f>
@@ -105,33 +106,34 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Описание</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>ЕдИзм</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -177,6 +179,9 @@
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -69,21 +69,22 @@
<rowsItem>
<index>2</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Позиция</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Цена</parameter>
</c>
</c>
@@ -138,6 +139,9 @@
<font>0</font>
<fillType>Template</fillType>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -139,9 +139,10 @@
<rowsItem>
<index>4</index>
<row>
<formatIndex>6</formatIndex>
<c>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -152,7 +153,7 @@
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -164,7 +165,7 @@
<c>
<i>6</i>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -175,7 +176,7 @@
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -186,7 +187,7 @@
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -197,7 +198,7 @@
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -211,15 +212,16 @@
<rowsItem>
<index>5</index>
<row>
<formatIndex>6</formatIndex>
<c>
<c>
<f>8</f>
<f>9</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<c>
<f>9</f>
<f>10</f>
<parameter>Товар</parameter>
<detailParameter>Номенклатура</detailParameter>
</c>
@@ -227,25 +229,25 @@
<c>
<i>6</i>
<c>
<f>8</f>
<f>9</f>
<parameter>ЕдИзм</parameter>
</c>
</c>
<c>
<c>
<f>10</f>
<f>11</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>10</f>
<f>11</f>
<parameter>Цена</parameter>
</c>
</c>
<c>
<c>
<f>10</f>
<f>11</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -257,7 +259,7 @@
<c>
<i>7</i>
<c>
<f>11</f>
<f>12</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -269,7 +271,7 @@
<c>
<i>9</i>
<c>
<f>12</f>
<f>13</f>
<parameter>ИтогоСумма</parameter>
</c>
</c>
@@ -281,7 +283,7 @@
<c>
<i>7</i>
<c>
<f>11</f>
<f>12</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -293,7 +295,7 @@
<c>
<i>9</i>
<c>
<f>12</f>
<f>13</f>
<parameter>ИтогоНДС</parameter>
</c>
</c>
@@ -323,7 +325,7 @@
<c>
<i>3</i>
<c>
<f>13</f>
<f>14</f>
<parameter>Отпустил</parameter>
</c>
</c>
@@ -335,7 +337,7 @@
<c>
<i>3</i>
<c>
<f>14</f>
<f>15</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -369,7 +371,7 @@
<c>
<i>3</i>
<c>
<f>13</f>
<f>14</f>
<parameter>Получил</parameter>
</c>
</c>
@@ -381,7 +383,7 @@
<c>
<i>3</i>
<c>
<f>14</f>
<f>15</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -546,6 +548,9 @@
<font>0</font>
<fillType>Parameter</fillType>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://v8.1c.ru/8.2/data/spreadsheet" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<languageSettings>
<currentLanguage>ru</currentLanguage>
<defaultLanguage>ru</defaultLanguage>
<languageInfo>
<id>ru</id>
<code>Русский</code>
<description>Русский</description>
</languageInfo>
</languageSettings>
<columns>
<size>3</size>
</columns>
<rowsItem>
<index>0</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>скрытая строка</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>1</index>
<row>
<formatIndex>3</formatIndex>
<c>
<c>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>и строке, и ячейкам</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>4</f>
</c>
</c>
<c>
<c>
<f>4</f>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>2</index>
<row>
<formatIndex>5</formatIndex>
<c>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>только строке</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>3</index>
<row>
<c>
<c>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>только ячейкам</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>6</f>
</c>
</c>
<c>
<c>
<f>6</f>
</c>
</c>
</row>
</rowsItem>
<templateMode>true</templateMode>
<defaultFormatIndex>1</defaultFormatIndex>
<height>4</height>
<vgRows>4</vgRows>
<namedItem xsi:type="NamedItemCells">
<name>Тело</name>
<area>
<type>Rows</type>
<beginRow>0</beginRow>
<endRow>3</endRow>
<beginColumn>-1</beginColumn>
<endColumn>-1</endColumn>
</area>
</namedItem>
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Solid</v8ui:style>
</line>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<font faceName="Arial" height="10" bold="true" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format>
<width>20</width>
</format>
<format>
<height>20</height>
<hidden>true</hidden>
</format>
<format>
<backColor>#EBEBEB</backColor>
</format>
<format>
<font>0</font>
<backColor>#EBEBEB</backColor>
</format>
<format>
<font>1</font>
</format>
<format>
<font>0</font>
<border>0</border>
</format>
</document>
@@ -55,6 +55,7 @@
<rowsItem>
<index>2</index>
<row>
<formatIndex>6</formatIndex>
<c>
<c>
<f>6</f>
@@ -115,33 +116,34 @@
<rowsItem>
<index>3</index>
<row>
<formatIndex>7</formatIndex>
<c>
<c>
<f>8</f>
<f>9</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<c>
<f>9</f>
<f>10</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<c>
<f>10</f>
<f>11</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>10</f>
<f>11</f>
<parameter>Цена</parameter>
</c>
</c>
<c>
<c>
<f>10</f>
<f>11</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -153,7 +155,7 @@
<c>
<i>3</i>
<c>
<f>11</f>
<f>12</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -164,7 +166,7 @@
</c>
<c>
<c>
<f>12</f>
<f>13</f>
<parameter>Всего</parameter>
</c>
</c>
@@ -175,7 +177,7 @@
<row>
<c>
<c>
<f>13</f>
<f>14</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -304,6 +306,9 @@
<font>1</font>
<border>1</border>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -15,9 +15,10 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>3</f>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +29,7 @@
</c>
<c>
<c>
<f>3</f>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -42,10 +43,11 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>2</formatIndex>
<c>
<i>1</i>
<c>
<f>2</f>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -56,7 +58,7 @@
</c>
<c>
<c>
<f>2</f>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -100,6 +102,9 @@
<format>
<width>10</width>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -27,27 +27,28 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -59,7 +60,7 @@
<c>
<i>2</i>
<c>
<f>7</f>
<f>8</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -70,7 +71,7 @@
</c>
<c>
<c>
<f>8</f>
<f>9</f>
<parameter>Всего</parameter>
</c>
</c>
@@ -130,6 +131,9 @@
<font>0</font>
<fillType>Parameter</fillType>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -50,34 +50,35 @@
<rowsItem>
<index>2</index>
<row>
<formatIndex>3</formatIndex>
<c>
<c>
<f>4</f>
<f>5</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<parameter>Товар</parameter>
<detailParameter>Номенклатура</detailParameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Цена</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -89,7 +90,7 @@
<c>
<i>3</i>
<c>
<f>6</f>
<f>7</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -100,7 +101,7 @@
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<parameter>Всего</parameter>
</c>
</c>
@@ -177,6 +178,9 @@
<font>0</font>
<fillType>Parameter</fillType>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -15,22 +15,23 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>3</f>
<f>4</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<c>
<f>3</f>
<f>4</f>
<parameter>Товар</parameter>
<detailParameter>Номенклатура</detailParameter>
</c>
</c>
<c>
<c>
<f>3</f>
<f>4</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -57,6 +58,9 @@
<format>
<width>10</width>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -26,6 +26,7 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>3</formatIndex>
<c>
<c>
<f>3</f>
@@ -65,10 +66,11 @@
<rowsItem>
<index>2</index>
<row>
<formatIndex>4</formatIndex>
<c>
<i>1</i>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -79,7 +81,7 @@
</c>
<c>
<c>
<f>4</f>
<f>5</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -93,27 +95,28 @@
<rowsItem>
<index>3</index>
<row>
<formatIndex>4</formatIndex>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Имя</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Код</parameter>
</c>
</c>
<c>
<c>
<f>5</f>
<f>6</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -194,6 +197,9 @@
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -57,33 +57,34 @@
<rowsItem>
<index>1</index>
<row>
<formatIndex>5</formatIndex>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<f>7</f>
<parameter>ЕдИзм</parameter>
</c>
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<parameter>Кол</parameter>
</c>
</c>
<c>
<c>
<f>7</f>
<f>8</f>
<parameter>Сумма</parameter>
</c>
</c>
@@ -95,7 +96,7 @@
<c>
<i>3</i>
<c>
<f>8</f>
<f>9</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -106,7 +107,7 @@
</c>
<c>
<c>
<f>9</f>
<f>10</f>
<parameter>Всего</parameter>
</c>
</c>
@@ -171,6 +172,9 @@
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>
@@ -15,15 +15,16 @@
<rowsItem>
<index>0</index>
<row>
<formatIndex>2</formatIndex>
<c>
<c>
<f>3</f>
<f>4</f>
<parameter>Ключ</parameter>
</c>
</c>
<c>
<c>
<f>3</f>
<f>4</f>
<parameter>Значение</parameter>
</c>
</c>
@@ -50,6 +51,9 @@
<format>
<width>10</width>
</format>
<format>
<border>0</border>
</format>
<format>
<font>0</font>
<border>0</border>