mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-13 23:13:22 +03:00
feat(mxl-compile): короткая форма строки — массив ячеек
Строка, записанная массивом ("rows": [["А","Б","В"]]), молча превращалась в
пустую строку в обоих портах. Форма не выдумана: ровно так документированы
макеты в skd-compile, и привычка естественно переносится на табличный документ.
Масштаб потери был виден в самом репозитории — ПЯТЬ кейсов семейства mxl-*
написаны в этой форме и потому проверяли пустые макеты: снэпшот
lenient-key-case содержал единственную строку <empty>true</empty>. После правки
все пять снэпшотов наполнились ячейками, которые терялись.
Семантика повторяет skd-compile: позиция ячейки — индекс в массиве, ">"
продолжает ячейку слева (span), "|" — сверху (rowspan), null пропускает
колонку, "{Имя}" даёт параметр. Элемент можно записать и объектом, когда нужен
style или detail; col в нём запрещён — это смешение двух способов адресации.
Разворот идёт отдельным пред-проходом в обычные строки с явными col/span/rowspan,
поэтому остальной компилятор о короткой форме не знает.
Форма документирована — в отличие от прощающего пропуска col: модель пишет канон
соседнего навыка, и выравнивание двух табличных DSL убирает развилку. По каскаду
в SKILL.md только правило и пример, подробности и таблица ошибок — в спеке
(обе копии: docs/ и reference/ навыка).
Правка на ps1, зазеркалена в py: вывод портов совпадает байт в байт, decompile →
compile возвращает исходный XML байт в байт.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ccbbecbcf2
commit
6719d7e647
@@ -64,3 +64,12 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J
|
|||||||
- Тип заполнения определяется автоматически: `param` → Parameter, `text` → Text, `template` → Template
|
- Тип заполнения определяется автоматически: `param` → Parameter, `text` → Text, `template` → Template
|
||||||
- `rowspan` — объединение строк вниз (rowStyle учитывает занятые ячейки)
|
- `rowspan` — объединение строк вниз (rowStyle учитывает занятые ячейки)
|
||||||
- `empty` в строке — шорткат для N подряд пустых строк (`{ "empty": 3 }` = три `{}`)
|
- `empty` в строке — шорткат для N подряд пустых строк (`{ "empty": 3 }` = три `{}`)
|
||||||
|
- Строку можно писать массивом ячеек — позиция из порядка, `col` не нужен: `"текст"`, `"{Имя}"` — параметр, `">"` — продолжить ячейку слева, `"|"` — сверху, `null` — пропуск колонки. Та же форма, что у макетов в `/skd-compile`
|
||||||
|
|
||||||
|
```json
|
||||||
|
"rows": [
|
||||||
|
["Вид", "Остаток", ">", "Итог"],
|
||||||
|
["|", "начало", "конец", "|"],
|
||||||
|
["{Вид}", "{Нач}", "{Кон}", "{Итог}"]
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|||||||
@@ -124,11 +124,47 @@
|
|||||||
|
|
||||||
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
|
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
|
||||||
|
|
||||||
|
### Короткая форма: строка массивом
|
||||||
|
|
||||||
|
Вместо объекта строка может быть массивом ячеек — позиция определяется порядком, `col` не указывается. Соглашения совпадают с макетами СКД (`/skd-compile`).
|
||||||
|
|
||||||
|
| Элемент | Значение |
|
||||||
|
|---------|----------|
|
||||||
|
| `"текст"` | Статический текст (`text`) |
|
||||||
|
| `"{Имя}"` | Параметр (`param`) |
|
||||||
|
| `">"` | Продолжение ячейки слева — увеличивает её `span` |
|
||||||
|
| `"|"` | Продолжение ячейки сверху — увеличивает её `rowspan` |
|
||||||
|
| `null` | Пустая колонка: позиция занята, ячейка не создаётся |
|
||||||
|
| `{ ... }` | Обычная ячейка **без** `col`; нужна для `style`, `detail`, `template` |
|
||||||
|
|
||||||
|
```json
|
||||||
|
"rows": [
|
||||||
|
["Вид", "Остаток", ">", "Итог"],
|
||||||
|
["|", "начало", "конец", "|"],
|
||||||
|
["{Вид}", "{Нач}", "{Кон}", "{Итог}"]
|
||||||
|
]
|
||||||
|
```
|
||||||
|
Здесь «Вид» и «Итог» объединены по вертикали на две строки, «Остаток» — по горизонтали на две колонки.
|
||||||
|
|
||||||
|
Ограничения короткой формы:
|
||||||
|
- не задать `height` и `rowStyle` — это свойства строки, а не ячейки;
|
||||||
|
- не выразить текст, совпадающий с `">"`, `"|"` или с шаблоном `"{...}"`;
|
||||||
|
- `"|"` продолжает ячейку из предыдущей строки, только если её позиция известна явно (`col` задан или строка записана массивом).
|
||||||
|
|
||||||
|
Ошибки короткой формы (stderr, код возврата 1):
|
||||||
|
|
||||||
|
| Условие | Сообщение |
|
||||||
|
|---------|-----------|
|
||||||
|
| `">"` без ячейки слева | `Row shorthand: '>' has no cell to the left: area "…", row N, cell M` |
|
||||||
|
| `"|"` без ячейки сверху | `Row shorthand: '|' has no cell above: area "…", row N, cell M` |
|
||||||
|
| объектный элемент с `col` | `Row shorthand: cell object must not carry 'col': area "…", row N, cell M` |
|
||||||
|
| элементов больше `columns` | `Row exceeds 'columns' (K): area "…", row N` |
|
||||||
|
|
||||||
## Ячейки (`cells[]`)
|
## Ячейки (`cells[]`)
|
||||||
|
|
||||||
| Поле | Обяз. | По умолч. | Описание |
|
| Поле | Обяз. | По умолч. | Описание |
|
||||||
|------|:-----:|-----------|----------|
|
|------|:-----:|-----------|----------|
|
||||||
| `col` | да | — | Позиция колонки (1-based) |
|
| `col` | да | — | Позиция колонки (1-based). В короткой форме строки не указывается — позиция берётся из порядка |
|
||||||
| `span` | нет | `1` | Объединение по горизонтали (количество колонок) |
|
| `span` | нет | `1` | Объединение по горизонтали (количество колонок) |
|
||||||
| `rowspan` | нет | `1` | Объединение по вертикали (количество строк) |
|
| `rowspan` | нет | `1` | Объединение по вертикали (количество строк) |
|
||||||
| `style` | нет | rowStyle | Стиль ячейки (переопределяет rowStyle) |
|
| `style` | нет | rowStyle | Стиль ячейки (переопределяет rowStyle) |
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# mxl-compile v1.15 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
# mxl-compile v1.16 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -520,6 +520,129 @@ function Register-CellFormat {
|
|||||||
return Register-Format -key $key -props $props
|
return Register-Format -key $key -props $props
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# --- 5.5. Шорткат строк: строка-массив ячеек ---
|
||||||
|
# Та же форма, что у макетов СКД (skd-compile): позиция ячейки = индекс в массиве,
|
||||||
|
# ">" продолжает ячейку слева, "|" — ячейку сверху, null — пустая колонка,
|
||||||
|
# "{Имя}" — параметр. Разворачиваем в обычную строку с явными col/span/rowspan,
|
||||||
|
# поэтому весь код ниже про шорткат не знает.
|
||||||
|
|
||||||
|
function Set-CellProp {
|
||||||
|
param($cell, [string]$name, $value)
|
||||||
|
$cell | Add-Member -NotePropertyName $name -NotePropertyValue $value -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
function Expand-ShorthandRow {
|
||||||
|
param($row, [string]$areaName, [int]$rowIdx, $openByCol)
|
||||||
|
|
||||||
|
$cells = @()
|
||||||
|
$placed = @{} # 1-based col -> ячейка, занимающая колонку в ЭТОЙ строке
|
||||||
|
$extended = @() # ячейки, чей rowspan уже нарастили в этой строке (span>1 даёт несколько "|")
|
||||||
|
$last = $null # последняя реальная ячейка слева — цель для ">"
|
||||||
|
$idx = 0
|
||||||
|
|
||||||
|
foreach ($el in $row) {
|
||||||
|
$idx++
|
||||||
|
# Внутри функции пишем в stderr напрямую: Write-Error приписал бы к сообщению имя
|
||||||
|
# функции, и текст перестал бы совпадать с py-портом.
|
||||||
|
if ($idx -gt $totalColumns) {
|
||||||
|
[Console]::Error.WriteLine("Row exceeds 'columns' ($totalColumns): area `"$areaName`", row $rowIdx")
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($null -eq $el) { $last = $null; continue }
|
||||||
|
|
||||||
|
if ($el -is [string] -and $el -eq '>') {
|
||||||
|
if ($null -eq $last) {
|
||||||
|
[Console]::Error.WriteLine("Row shorthand: '>' has no cell to the left: area `"$areaName`", row $rowIdx, cell $idx")
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
$span = if ($last.span) { [int]$last.span } else { 1 }
|
||||||
|
Set-CellProp $last 'span' ($span + 1)
|
||||||
|
$placed[$idx] = $last
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($el -is [string] -and $el -eq '|') {
|
||||||
|
$above = $openByCol[$idx]
|
||||||
|
if ($null -eq $above) {
|
||||||
|
[Console]::Error.WriteLine("Row shorthand: '|' has no cell above: area `"$areaName`", row $rowIdx, cell $idx")
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
if (-not ($extended -contains $above)) {
|
||||||
|
$rowspan = if ($above.rowspan) { [int]$above.rowspan } else { 1 }
|
||||||
|
Set-CellProp $above 'rowspan' ($rowspan + 1)
|
||||||
|
$extended += $above
|
||||||
|
}
|
||||||
|
$placed[$idx] = $above
|
||||||
|
$last = $null
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($el -is [string]) {
|
||||||
|
$cell = [PSCustomObject]@{ col = $idx; span = 1 }
|
||||||
|
$m = [regex]::Match($el, '^\{(.+)\}$')
|
||||||
|
if ($m.Success) { Set-CellProp $cell 'param' $m.Groups[1].Value }
|
||||||
|
else { Set-CellProp $cell 'text' $el }
|
||||||
|
} else {
|
||||||
|
# Объектный элемент — обычная ячейка mxl, позиция берётся из индекса.
|
||||||
|
if ($el.PSObject.Properties['col']) {
|
||||||
|
[Console]::Error.WriteLine("Row shorthand: cell object must not carry 'col': area `"$areaName`", row $rowIdx, cell $idx")
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
$cell = $el
|
||||||
|
Set-CellProp $cell 'col' $idx
|
||||||
|
if (-not $cell.span) { Set-CellProp $cell 'span' 1 }
|
||||||
|
}
|
||||||
|
|
||||||
|
$cells += $cell
|
||||||
|
$placed[$idx] = $cell
|
||||||
|
$last = $cell
|
||||||
|
}
|
||||||
|
|
||||||
|
# Колонки, не занятые в этой строке, теряют «ячейку сверху».
|
||||||
|
$openByCol.Clear()
|
||||||
|
foreach ($k in $placed.Keys) { $openByCol[$k] = $placed[$k] }
|
||||||
|
|
||||||
|
return [PSCustomObject]@{ cells = $cells }
|
||||||
|
}
|
||||||
|
|
||||||
|
# Карту занятых колонок ведём и по объектным строкам: "|" продолжает ту ячейку,
|
||||||
|
# которая реально стоит выше, независимо от того, какой формой её записали.
|
||||||
|
function Update-OpenByCol {
|
||||||
|
param($row, $openByCol)
|
||||||
|
$placed = @{}
|
||||||
|
if ($row.cells) {
|
||||||
|
foreach ($cell in $row.cells) {
|
||||||
|
# Ячейки без col (строка с автопотоком) на этом шаге ещё не разложены — позиция
|
||||||
|
# станет известна позже, поэтому «ячейку сверху» они не дают, и "|" под такой
|
||||||
|
# строкой честно скажет, что сверху ничего нет.
|
||||||
|
if (-not $cell.PSObject.Properties['col'] -or $null -eq $cell.col) { continue }
|
||||||
|
$col = [int]$cell.col
|
||||||
|
$span = if ($cell.span) { [int]$cell.span } else { 1 }
|
||||||
|
for ($c = $col; $c -lt ($col + $span); $c++) { $placed[$c] = $cell }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$openByCol.Clear()
|
||||||
|
foreach ($k in $placed.Keys) { $openByCol[$k] = $placed[$k] }
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($area in $def.areas) {
|
||||||
|
$areaName = $area.name
|
||||||
|
$openByCol = @{}
|
||||||
|
$rowIdx = 0
|
||||||
|
$expandedRows = @()
|
||||||
|
foreach ($row in $area.rows) {
|
||||||
|
$rowIdx++
|
||||||
|
if ($row -is [array]) {
|
||||||
|
$expandedRows += Expand-ShorthandRow -row $row -areaName $areaName -rowIdx $rowIdx -openByCol $openByCol
|
||||||
|
} else {
|
||||||
|
$expandedRows += $row
|
||||||
|
if ($row.empty) { $openByCol.Clear() } else { Update-OpenByCol -row $row -openByCol $openByCol }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$area.rows = $expandedRows
|
||||||
|
}
|
||||||
|
|
||||||
# Pre-register all formats from areas
|
# Pre-register all formats from areas
|
||||||
foreach ($area in $def.areas) {
|
foreach ($area in $def.areas) {
|
||||||
foreach ($row in $area.rows) {
|
foreach ($row in $area.rows) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# mxl-compile v1.15 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
# mxl-compile v1.16 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
@@ -585,12 +585,117 @@ def main():
|
|||||||
}
|
}
|
||||||
return register_format(key, props)
|
return register_format(key, props)
|
||||||
|
|
||||||
|
# --- 5.5. Шорткат строк: строка-массив ячеек ---
|
||||||
|
# Та же форма, что у макетов СКД (skd-compile): позиция ячейки = индекс в массиве,
|
||||||
|
# ">" продолжает ячейку слева, "|" — ячейку сверху, null — пустая колонка,
|
||||||
|
# "{Имя}" — параметр. Разворачиваем в обычную строку с явными col/span/rowspan,
|
||||||
|
# поэтому весь код ниже про шорткат не знает.
|
||||||
|
|
||||||
|
def expand_shorthand_row(row, area_name, row_idx, open_by_col):
|
||||||
|
cells = []
|
||||||
|
placed = {} # 1-based col -> ячейка, занимающая колонку в ЭТОЙ строке
|
||||||
|
extended = [] # ячейки, чей rowspan уже нарастили в этой строке (span>1 даёт несколько "|")
|
||||||
|
last = None # последняя реальная ячейка слева — цель для ">"
|
||||||
|
|
||||||
|
for idx, el in enumerate(row, start=1):
|
||||||
|
if idx > total_columns:
|
||||||
|
print(f'Row exceeds \'columns\' ({total_columns}): area "{area_name}",'
|
||||||
|
f' row {row_idx}', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if el is None:
|
||||||
|
last = None
|
||||||
|
continue
|
||||||
|
|
||||||
|
if isinstance(el, str) and el == '>':
|
||||||
|
if last is None:
|
||||||
|
print(f'Row shorthand: \'>\' has no cell to the left: area "{area_name}",'
|
||||||
|
f' row {row_idx}, cell {idx}', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
last['span'] = int(last.get('span', 1)) + 1
|
||||||
|
placed[idx] = last
|
||||||
|
continue
|
||||||
|
|
||||||
|
if isinstance(el, str) and el == '|':
|
||||||
|
above = open_by_col.get(idx)
|
||||||
|
if above is None:
|
||||||
|
print(f'Row shorthand: \'|\' has no cell above: area "{area_name}",'
|
||||||
|
f' row {row_idx}, cell {idx}', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
if not any(above is e for e in extended):
|
||||||
|
above['rowspan'] = int(above.get('rowspan', 1)) + 1
|
||||||
|
extended.append(above)
|
||||||
|
placed[idx] = above
|
||||||
|
last = None
|
||||||
|
continue
|
||||||
|
|
||||||
|
if isinstance(el, str):
|
||||||
|
cell = CIDict()
|
||||||
|
cell['col'] = idx
|
||||||
|
cell['span'] = 1
|
||||||
|
m = re.match(r'^\{(.+)\}$', el)
|
||||||
|
if m:
|
||||||
|
cell['param'] = m.group(1)
|
||||||
|
else:
|
||||||
|
cell['text'] = el
|
||||||
|
else:
|
||||||
|
# Объектный элемент — обычная ячейка mxl, позиция берётся из индекса.
|
||||||
|
if 'col' in el:
|
||||||
|
print(f'Row shorthand: cell object must not carry \'col\': area "{area_name}",'
|
||||||
|
f' row {row_idx}, cell {idx}', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
cell = el
|
||||||
|
cell['col'] = idx
|
||||||
|
if not cell.get('span'):
|
||||||
|
cell['span'] = 1
|
||||||
|
|
||||||
|
cells.append(cell)
|
||||||
|
placed[idx] = cell
|
||||||
|
last = cell
|
||||||
|
|
||||||
|
# Колонки, не занятые в этой строке, теряют «ячейку сверху».
|
||||||
|
open_by_col.clear()
|
||||||
|
open_by_col.update(placed)
|
||||||
|
|
||||||
|
out = CIDict()
|
||||||
|
out['cells'] = cells
|
||||||
|
return out
|
||||||
|
|
||||||
|
# Карту занятых колонок ведём и по объектным строкам: "|" продолжает ту ячейку,
|
||||||
|
# которая реально стоит выше, независимо от того, какой формой её записали.
|
||||||
|
def update_open_by_col(row, open_by_col):
|
||||||
|
placed = {}
|
||||||
|
for cell in (row.get('cells') or []):
|
||||||
|
# Ячейки без col (строка с автопотоком) на этом шаге ещё не разложены — позиция
|
||||||
|
# станет известна позже, поэтому «ячейку сверху» они не дают, и "|" под такой
|
||||||
|
# строкой честно скажет, что сверху ничего нет.
|
||||||
|
if cell.get('col') is None:
|
||||||
|
continue
|
||||||
|
col = int(cell['col'])
|
||||||
|
span = int(cell.get('span', 1))
|
||||||
|
for c in range(col, col + span):
|
||||||
|
placed[c] = cell
|
||||||
|
open_by_col.clear()
|
||||||
|
open_by_col.update(placed)
|
||||||
|
|
||||||
|
for area in defn['areas']:
|
||||||
|
area_name = area.get('name', '')
|
||||||
|
open_by_col = {}
|
||||||
|
expanded_rows = []
|
||||||
|
for row_idx, row in enumerate(area.get('rows', []), start=1):
|
||||||
|
if isinstance(row, list):
|
||||||
|
expanded_rows.append(expand_shorthand_row(row, area_name, row_idx, open_by_col))
|
||||||
|
else:
|
||||||
|
expanded_rows.append(row)
|
||||||
|
if row.get('empty'):
|
||||||
|
open_by_col.clear()
|
||||||
|
else:
|
||||||
|
update_open_by_col(row, open_by_col)
|
||||||
|
area['rows'] = expanded_rows
|
||||||
|
|
||||||
# Pre-register all formats from areas
|
# Pre-register all formats from areas
|
||||||
for area in defn['areas']:
|
for area in defn['areas']:
|
||||||
for row in area.get('rows', []):
|
for row in area.get('rows', []):
|
||||||
# Skip list-of-values shorthand rows (treated as empty rows like PS1)
|
|
||||||
if isinstance(row, list):
|
|
||||||
continue
|
|
||||||
# Skip empty row placeholder
|
# Skip empty row placeholder
|
||||||
if row.get('empty'):
|
if row.get('empty'):
|
||||||
continue
|
continue
|
||||||
@@ -668,9 +773,6 @@ def main():
|
|||||||
local_row = 0
|
local_row = 0
|
||||||
|
|
||||||
for row in area.get('rows', []):
|
for row in area.get('rows', []):
|
||||||
# List-of-values shorthand: treat as row with no properties (like PS1)
|
|
||||||
if isinstance(row, list):
|
|
||||||
row = {}
|
|
||||||
# Empty row placeholder: emit N empty rows
|
# Empty row placeholder: emit N empty rows
|
||||||
if row.get('empty'):
|
if row.get('empty'):
|
||||||
count = int(row['empty'])
|
count = int(row['empty'])
|
||||||
|
|||||||
+37
-1
@@ -124,11 +124,47 @@
|
|||||||
|
|
||||||
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
|
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
|
||||||
|
|
||||||
|
### Короткая форма: строка массивом
|
||||||
|
|
||||||
|
Вместо объекта строка может быть массивом ячеек — позиция определяется порядком, `col` не указывается. Соглашения совпадают с макетами СКД (`/skd-compile`).
|
||||||
|
|
||||||
|
| Элемент | Значение |
|
||||||
|
|---------|----------|
|
||||||
|
| `"текст"` | Статический текст (`text`) |
|
||||||
|
| `"{Имя}"` | Параметр (`param`) |
|
||||||
|
| `">"` | Продолжение ячейки слева — увеличивает её `span` |
|
||||||
|
| `"|"` | Продолжение ячейки сверху — увеличивает её `rowspan` |
|
||||||
|
| `null` | Пустая колонка: позиция занята, ячейка не создаётся |
|
||||||
|
| `{ ... }` | Обычная ячейка **без** `col`; нужна для `style`, `detail`, `template` |
|
||||||
|
|
||||||
|
```json
|
||||||
|
"rows": [
|
||||||
|
["Вид", "Остаток", ">", "Итог"],
|
||||||
|
["|", "начало", "конец", "|"],
|
||||||
|
["{Вид}", "{Нач}", "{Кон}", "{Итог}"]
|
||||||
|
]
|
||||||
|
```
|
||||||
|
Здесь «Вид» и «Итог» объединены по вертикали на две строки, «Остаток» — по горизонтали на две колонки.
|
||||||
|
|
||||||
|
Ограничения короткой формы:
|
||||||
|
- не задать `height` и `rowStyle` — это свойства строки, а не ячейки;
|
||||||
|
- не выразить текст, совпадающий с `">"`, `"|"` или с шаблоном `"{...}"`;
|
||||||
|
- `"|"` продолжает ячейку из предыдущей строки, только если её позиция известна явно (`col` задан или строка записана массивом).
|
||||||
|
|
||||||
|
Ошибки короткой формы (stderr, код возврата 1):
|
||||||
|
|
||||||
|
| Условие | Сообщение |
|
||||||
|
|---------|-----------|
|
||||||
|
| `">"` без ячейки слева | `Row shorthand: '>' has no cell to the left: area "…", row N, cell M` |
|
||||||
|
| `"|"` без ячейки сверху | `Row shorthand: '|' has no cell above: area "…", row N, cell M` |
|
||||||
|
| объектный элемент с `col` | `Row shorthand: cell object must not carry 'col': area "…", row N, cell M` |
|
||||||
|
| элементов больше `columns` | `Row exceeds 'columns' (K): area "…", row N` |
|
||||||
|
|
||||||
## Ячейки (`cells[]`)
|
## Ячейки (`cells[]`)
|
||||||
|
|
||||||
| Поле | Обяз. | По умолч. | Описание |
|
| Поле | Обяз. | По умолч. | Описание |
|
||||||
|------|:-----:|-----------|----------|
|
|------|:-----:|-----------|----------|
|
||||||
| `col` | да | — | Позиция колонки (1-based) |
|
| `col` | да | — | Позиция колонки (1-based). В короткой форме строки не указывается — позиция берётся из порядка |
|
||||||
| `span` | нет | `1` | Объединение по горизонтали (количество колонок) |
|
| `span` | нет | `1` | Объединение по горизонтали (количество колонок) |
|
||||||
| `rowspan` | нет | `1` | Объединение по вертикали (количество строк) |
|
| `rowspan` | нет | `1` | Объединение по вертикали (количество строк) |
|
||||||
| `style` | нет | rowStyle | Стиль ячейки (переопределяет rowStyle) |
|
| `style` | нет | rowStyle | Стиль ячейки (переопределяет rowStyle) |
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "Ошибка: > первым элементом строки — слева нет ячейки",
|
||||||
|
"input": {
|
||||||
|
"columns": 3,
|
||||||
|
"areas": [
|
||||||
|
{
|
||||||
|
"name": "Шапка",
|
||||||
|
"rows": [[">", "А"]]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"outputPath": "Template.xml"
|
||||||
|
},
|
||||||
|
"expectError": "Row shorthand: '>' has no cell to the left: area \"Шапка\", row 1, cell 1"
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "Ошибка: объектный элемент шортката несёт col",
|
||||||
|
"input": {
|
||||||
|
"columns": 3,
|
||||||
|
"areas": [
|
||||||
|
{
|
||||||
|
"name": "Шапка",
|
||||||
|
"rows": [["А", { "col": 2, "text": "Б" }]]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"outputPath": "Template.xml"
|
||||||
|
},
|
||||||
|
"expectError": "Row shorthand: cell object must not carry 'col': area \"Шапка\", row 1, cell 2"
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "Ошибка: | в первой строке области — сверху нет ячейки",
|
||||||
|
"input": {
|
||||||
|
"columns": 3,
|
||||||
|
"areas": [
|
||||||
|
{
|
||||||
|
"name": "Шапка",
|
||||||
|
"rows": [["А", "|"]]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"outputPath": "Template.xml"
|
||||||
|
},
|
||||||
|
"expectError": "Row shorthand: '|' has no cell above: area \"Шапка\", row 1, cell 2"
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "Шорткат строк: двухуровневая шапка через > и |",
|
||||||
|
"input": {
|
||||||
|
"columns": 4,
|
||||||
|
"areas": [
|
||||||
|
{
|
||||||
|
"name": "Шапка",
|
||||||
|
"rows": [
|
||||||
|
["Вид", "Остаток", ">", "Итог"],
|
||||||
|
["|", "начало", "конец", "|"],
|
||||||
|
["{Вид}", "{Нач}", "{Кон}", "{Итог}"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"outputPath": "Template.xml"
|
||||||
|
},
|
||||||
|
"validatePath": "Template.xml",
|
||||||
|
"expect": {
|
||||||
|
"files": ["Template.xml"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "Шорткат строк: текст, параметр, пропуск, объектный элемент",
|
||||||
|
"input": {
|
||||||
|
"columns": 4,
|
||||||
|
"styles": { "hdr": { "align": "center", "border": "all" } },
|
||||||
|
"areas": [
|
||||||
|
{
|
||||||
|
"name": "Таблица",
|
||||||
|
"rows": [
|
||||||
|
["Наименование", "Количество", "Сумма", "Примечание"],
|
||||||
|
["{Товар}", "{Кол}", null, { "text": "хвост", "style": "hdr" }]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"outputPath": "Template.xml"
|
||||||
|
},
|
||||||
|
"validatePath": "Template.xml",
|
||||||
|
"expect": {
|
||||||
|
"files": ["Template.xml"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,42 @@
|
|||||||
<rowsItem>
|
<rowsItem>
|
||||||
<index>0</index>
|
<index>0</index>
|
||||||
<row>
|
<row>
|
||||||
<empty>true</empty>
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Наименование</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Количество</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Сумма</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
</row>
|
</row>
|
||||||
</rowsItem>
|
</rowsItem>
|
||||||
<templateMode>true</templateMode>
|
<templateMode>true</templateMode>
|
||||||
@@ -36,4 +71,8 @@
|
|||||||
<format>
|
<format>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
</format>
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
</document>
|
</document>
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
<?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>4</size>
|
||||||
|
</columns>
|
||||||
|
<rowsItem>
|
||||||
|
<index>0</index>
|
||||||
|
<row>
|
||||||
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Вид</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Остаток</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>3</i>
|
||||||
|
<c>
|
||||||
|
<f>2</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>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>начало</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>конец</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
</row>
|
||||||
|
</rowsItem>
|
||||||
|
<rowsItem>
|
||||||
|
<index>2</index>
|
||||||
|
<row>
|
||||||
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>3</f>
|
||||||
|
<parameter>Вид</parameter>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>3</f>
|
||||||
|
<parameter>Нач</parameter>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>3</f>
|
||||||
|
<parameter>Кон</parameter>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>3</i>
|
||||||
|
<c>
|
||||||
|
<f>3</f>
|
||||||
|
<parameter>Итог</parameter>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
</row>
|
||||||
|
</rowsItem>
|
||||||
|
<templateMode>true</templateMode>
|
||||||
|
<defaultFormatIndex>1</defaultFormatIndex>
|
||||||
|
<height>3</height>
|
||||||
|
<vgRows>3</vgRows>
|
||||||
|
<merge>
|
||||||
|
<r>0</r>
|
||||||
|
<c>0</c>
|
||||||
|
<h>1</h>
|
||||||
|
<w>0</w>
|
||||||
|
</merge>
|
||||||
|
<merge>
|
||||||
|
<r>0</r>
|
||||||
|
<c>1</c>
|
||||||
|
<w>1</w>
|
||||||
|
</merge>
|
||||||
|
<merge>
|
||||||
|
<r>0</r>
|
||||||
|
<c>3</c>
|
||||||
|
<h>1</h>
|
||||||
|
<w>0</w>
|
||||||
|
</merge>
|
||||||
|
<namedItem xsi:type="NamedItemCells">
|
||||||
|
<name>Шапка</name>
|
||||||
|
<area>
|
||||||
|
<type>Rows</type>
|
||||||
|
<beginRow>0</beginRow>
|
||||||
|
<endRow>2</endRow>
|
||||||
|
<beginColumn>-1</beginColumn>
|
||||||
|
<endColumn>-1</endColumn>
|
||||||
|
</area>
|
||||||
|
</namedItem>
|
||||||
|
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
|
||||||
|
<format>
|
||||||
|
<width>10</width>
|
||||||
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Parameter</fillType>
|
||||||
|
</format>
|
||||||
|
</document>
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
<?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>4</size>
|
||||||
|
</columns>
|
||||||
|
<rowsItem>
|
||||||
|
<index>0</index>
|
||||||
|
<row>
|
||||||
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Наименование</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Количество</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Сумма</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>3</i>
|
||||||
|
<c>
|
||||||
|
<f>2</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>
|
||||||
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>3</f>
|
||||||
|
<parameter>Товар</parameter>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>3</f>
|
||||||
|
<parameter>Кол</parameter>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>3</i>
|
||||||
|
<c>
|
||||||
|
<f>4</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>хвост</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
</row>
|
||||||
|
</rowsItem>
|
||||||
|
<templateMode>true</templateMode>
|
||||||
|
<defaultFormatIndex>1</defaultFormatIndex>
|
||||||
|
<height>2</height>
|
||||||
|
<vgRows>2</vgRows>
|
||||||
|
<namedItem xsi:type="NamedItemCells">
|
||||||
|
<name>Таблица</name>
|
||||||
|
<area>
|
||||||
|
<type>Rows</type>
|
||||||
|
<beginRow>0</beginRow>
|
||||||
|
<endRow>1</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"/>
|
||||||
|
<format>
|
||||||
|
<width>10</width>
|
||||||
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Parameter</fillType>
|
||||||
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<leftBorder>0</leftBorder>
|
||||||
|
<topBorder>0</topBorder>
|
||||||
|
<rightBorder>0</rightBorder>
|
||||||
|
<bottomBorder>0</bottomBorder>
|
||||||
|
<horizontalAlignment>Center</horizontalAlignment>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
|
</document>
|
||||||
@@ -15,7 +15,42 @@
|
|||||||
<rowsItem>
|
<rowsItem>
|
||||||
<index>0</index>
|
<index>0</index>
|
||||||
<row>
|
<row>
|
||||||
<empty>true</empty>
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Наименование</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Количество</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Сумма</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
</row>
|
</row>
|
||||||
</rowsItem>
|
</rowsItem>
|
||||||
<templateMode>true</templateMode>
|
<templateMode>true</templateMode>
|
||||||
@@ -36,4 +71,8 @@
|
|||||||
<format>
|
<format>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
</format>
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
</document>
|
</document>
|
||||||
@@ -15,7 +15,42 @@
|
|||||||
<rowsItem>
|
<rowsItem>
|
||||||
<index>0</index>
|
<index>0</index>
|
||||||
<row>
|
<row>
|
||||||
<empty>true</empty>
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>A</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>B</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>C</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
</row>
|
</row>
|
||||||
</rowsItem>
|
</rowsItem>
|
||||||
<templateMode>true</templateMode>
|
<templateMode>true</templateMode>
|
||||||
@@ -36,4 +71,8 @@
|
|||||||
<format>
|
<format>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
</format>
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
</document>
|
</document>
|
||||||
@@ -15,7 +15,42 @@
|
|||||||
<rowsItem>
|
<rowsItem>
|
||||||
<index>0</index>
|
<index>0</index>
|
||||||
<row>
|
<row>
|
||||||
<empty>true</empty>
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>A</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>B</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>C</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
</row>
|
</row>
|
||||||
</rowsItem>
|
</rowsItem>
|
||||||
<templateMode>true</templateMode>
|
<templateMode>true</templateMode>
|
||||||
@@ -36,4 +71,8 @@
|
|||||||
<format>
|
<format>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
</format>
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
</document>
|
</document>
|
||||||
@@ -15,7 +15,42 @@
|
|||||||
<rowsItem>
|
<rowsItem>
|
||||||
<index>0</index>
|
<index>0</index>
|
||||||
<row>
|
<row>
|
||||||
<empty>true</empty>
|
<c>
|
||||||
|
<i>0</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>A</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>1</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>B</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
|
<c>
|
||||||
|
<i>2</i>
|
||||||
|
<c>
|
||||||
|
<f>2</f>
|
||||||
|
<tl>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>C</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</tl>
|
||||||
|
</c>
|
||||||
|
</c>
|
||||||
</row>
|
</row>
|
||||||
</rowsItem>
|
</rowsItem>
|
||||||
<templateMode>true</templateMode>
|
<templateMode>true</templateMode>
|
||||||
@@ -36,4 +71,8 @@
|
|||||||
<format>
|
<format>
|
||||||
<width>10</width>
|
<width>10</width>
|
||||||
</format>
|
</format>
|
||||||
|
<format>
|
||||||
|
<font>0</font>
|
||||||
|
<fillType>Text</fillType>
|
||||||
|
</format>
|
||||||
</document>
|
</document>
|
||||||
Reference in New Issue
Block a user