fix(mxl-compile): писать номер колонки и пустые строки как платформа

Две правки эмиссии, обе выведены из корпуса erp_8.3.24 (10924 макета,
15.2 млн ячеек) и проверены на нём же без единого контрпримера.

Номер колонки <i> платформа пишет только при разрыве последовательности:
подряд идущая ячейка его не несёт, читатель ведёт счётчик сам. Мы писали
всегда — из 1.2 млн записанных платформой номеров ни один не избыточен.

Подряд идущие одинаковые ПУСТЫЕ строки платформа хранит одним rowsItem
с indexTo; непустые не схлопывает, даже когда они совпадают (98153 таких
случая в корпусе). Мы не эмитили indexTo вовсе.

На пилоте (40 макетов) доля строк документа, совпавших с оригиналом
байт в байт, выросла с 0.3% до 16.7%; все 9 диапазонов indexTo оригинала
воспроизведены точно.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-11 13:04:59 +03:00
co-authored by Claude Opus 5
parent 3e7e105c43
commit cd9a800f8b
25 changed files with 141 additions and 209 deletions
@@ -1,4 +1,4 @@
# mxl-compile v1.26 — Compile 1C spreadsheet from JSON
# mxl-compile v1.27 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -870,6 +870,35 @@ $merges = @()
$namedItems = @()
$totalRowCount = 0
# Копилка подряд идущих одинаковых пустых строк — пишется одним rowsItem с indexTo.
$pendingGap = $null
function Add-GapRow {
param([string]$key, [int]$row, [string]$columnSet, [int]$formatIdx)
$gap = $script:pendingGap
# -ceq: ключ несёт GUID раскладки, а обычное -eq в PowerShell регистр не различает.
if ($gap -and $gap.Key -ceq $key -and $gap.End -eq ($row - 1)) {
$gap.End = $row
return
}
Flush-Gap
$script:pendingGap = @{ Key = $key; Start = $row; End = $row
ColumnSet = $columnSet; FormatIdx = $formatIdx }
}
function Flush-Gap {
if (-not $script:pendingGap) { return }
$gap = $script:pendingGap
$script:pendingGap = $null
X "`t<rowsItem>"
X "`t`t<index>$($gap.Start)</index>"
if ($gap.End -gt $gap.Start) { X "`t`t<indexTo>$($gap.End)</indexTo>" }
X "`t`t<row>"
if ($gap.ColumnSet) { X "`t`t`t<columnsID>$($gap.ColumnSet)</columnsID>" }
if ($gap.FormatIdx -gt 0) { X "`t`t`t<formatIndex>$($gap.FormatIdx)</formatIndex>" }
X "`t`t`t<empty>true</empty>"
X "`t`t</row>"
X "`t</rowsItem>"
}
foreach ($area in $def.areas) {
$areaStartRow = $globalRow
$areaName = $area.name
@@ -904,12 +933,7 @@ foreach ($area in $def.areas) {
if ($row.empty) {
$count = [int]$row.empty
for ($ei = 0; $ei -lt $count; $ei++) {
X "`t<rowsItem>"
X "`t`t<index>$globalRow</index>"
X "`t`t<row>"
X "`t`t`t<empty>true</empty>"
X "`t`t</row>"
X "`t</rowsItem>"
Add-GapRow -key '|0' -row $globalRow -columnSet '' -formatIdx 0
$globalRow++; $localRow++
}
continue
@@ -1071,7 +1095,19 @@ foreach ($area in $def.areas) {
}
}
# Emit rowsItem
# Emit rowsItem.
# Подряд идущие ОДИНАКОВЫЕ пустые строки платформа хранит одним элементом с indexTo;
# непустые не схлопывает, даже когда они совпадают. Поэтому пустую строку не пишем
# сразу, а копим в пробеле и сбрасываем, когда он оборвался.
if (-not $rowHasContent) {
Add-GapRow -key "$areaColumnSet|$rowFormatIdx" -row $globalRow `
-columnSet $areaColumnSet -formatIdx $rowFormatIdx
$localRow++
$globalRow++
continue
}
Flush-Gap
X "`t<rowsItem>"
X "`t`t<index>$globalRow</index>"
X "`t`t<row>"
@@ -1084,31 +1120,34 @@ foreach ($area in $def.areas) {
X "`t`t`t<formatIndex>$rowFormatIdx</formatIndex>"
}
if (-not $rowHasContent) {
X "`t`t`t<empty>true</empty>"
} else {
foreach ($cellInfo in $rowCells) {
X "`t`t`t<c>"
# Номер колонки платформа пишет только при разрыве: подряд идущая ячейка его не
# несёт, читатель ведёт счётчик сам. Начальное значение счётчика -1, то есть у
# ячейки в колонке 0 номера тоже нет.
$prevCol = -1
foreach ($cellInfo in $rowCells) {
X "`t`t`t<c>"
if ($cellInfo.Col -ne ($prevCol + 1)) {
X "`t`t`t`t<i>$($cellInfo.Col)</i>"
X "`t`t`t`t<c>"
X "`t`t`t`t`t<f>$($cellInfo.FormatIdx)</f>"
if ($cellInfo.Param) {
X "`t`t`t`t`t<parameter>$($cellInfo.Param)</parameter>"
if ($cellInfo.Detail) {
X "`t`t`t`t`t<detailParameter>$($cellInfo.Detail)</detailParameter>"
}
}
# Проверяем НАЛИЧИЕ ключа, а не истинность: пустая строка — это текст, платформа
# такие ячейки пишет с пустым <tl>, и по истинности он терялся.
if ($null -ne $cellInfo.Text) { Emit-CellText $cellInfo.Text }
if ($null -ne $cellInfo.Template) { Emit-CellText $cellInfo.Template }
X "`t`t`t`t</c>"
X "`t`t`t</c>"
}
$prevCol = $cellInfo.Col
X "`t`t`t`t<c>"
X "`t`t`t`t`t<f>$($cellInfo.FormatIdx)</f>"
if ($cellInfo.Param) {
X "`t`t`t`t`t<parameter>$($cellInfo.Param)</parameter>"
if ($cellInfo.Detail) {
X "`t`t`t`t`t<detailParameter>$($cellInfo.Detail)</detailParameter>"
}
}
# Проверяем НАЛИЧИЕ ключа, а не истинность: пустая строка — это текст, платформа
# такие ячейки пишет с пустым <tl>, и по истинности он терялся.
if ($null -ne $cellInfo.Text) { Emit-CellText $cellInfo.Text }
if ($null -ne $cellInfo.Template) { Emit-CellText $cellInfo.Template }
X "`t`t`t`t</c>"
X "`t`t`t</c>"
}
X "`t`t</row>"
@@ -1132,6 +1171,7 @@ foreach ($area in $def.areas) {
}
}
}
Flush-Gap
$totalRowCount = $globalRow
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# mxl-compile v1.26 — Compile 1C spreadsheet from JSON
# mxl-compile v1.27 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import hashlib
@@ -882,6 +882,36 @@ def main():
named_items = []
active_rowspans = [] # list of {ColStart, ColEnd, StartLocalRow, EndLocalRow}
# Копилка подряд идущих одинаковых пустых строк — пишется одним rowsItem с indexTo.
pending_gap = [None]
def flush_gap():
gap = pending_gap[0]
if gap is None:
return
pending_gap[0] = None
lines.append('\t<rowsItem>')
lines.append(f'\t\t<index>{gap["Start"]}</index>')
if gap['End'] > gap['Start']:
lines.append(f'\t\t<indexTo>{gap["End"]}</indexTo>')
lines.append('\t\t<row>')
if gap['ColumnSet']:
lines.append(f'\t\t\t<columnsID>{gap["ColumnSet"]}</columnsID>')
if gap['FormatIdx'] > 0:
lines.append(f'\t\t\t<formatIndex>{gap["FormatIdx"]}</formatIndex>')
lines.append('\t\t\t<empty>true</empty>')
lines.append('\t\t</row>')
lines.append('\t</rowsItem>')
def add_gap_row(key, row, column_set, format_idx):
gap = pending_gap[0]
if gap is not None and gap['Key'] == key and gap['End'] == row - 1:
gap['End'] = row
return
flush_gap()
pending_gap[0] = {'Key': key, 'Start': row, 'End': row,
'ColumnSet': column_set, 'FormatIdx': format_idx}
for area in defn['areas']:
area_start_row = global_row
area_name = area.get('name', '')
@@ -914,12 +944,7 @@ def main():
if row.get('empty'):
count = int(row['empty'])
for ei in range(count):
lines.append('\t<rowsItem>')
lines.append(f'\t\t<index>{global_row}</index>')
lines.append('\t\t<row>')
lines.append('\t\t\t<empty>true</empty>')
lines.append('\t\t</row>')
lines.append('\t</rowsItem>')
add_gap_row('|0', global_row, '', 0)
global_row += 1
local_row += 1
continue
@@ -1052,7 +1077,18 @@ def main():
'Template': None,
})
# Emit rowsItem
# Emit rowsItem.
# Подряд идущие ОДИНАКОВЫЕ пустые строки платформа хранит одним элементом с indexTo;
# непустые не схлопывает, даже когда они совпадают. Поэтому пустую строку не пишем
# сразу, а копим в пробеле и сбрасываем, когда он оборвался.
if not row_has_content:
add_gap_row(f'{area_column_set}|{row_format_idx}', global_row,
area_column_set, row_format_idx)
local_row += 1
global_row += 1
continue
flush_gap()
lines.append('\t<rowsItem>')
lines.append(f'\t\t<index>{global_row}</index>')
lines.append('\t\t<row>')
@@ -1063,30 +1099,33 @@ def main():
if row_format_idx > 0:
lines.append(f'\t\t\t<formatIndex>{row_format_idx}</formatIndex>')
if not row_has_content:
lines.append('\t\t\t<empty>true</empty>')
else:
for cell_info in row_cells:
lines.append('\t\t\t<c>')
# Номер колонки платформа пишет только при разрыве: подряд идущая ячейка его не
# несёт, читатель ведёт счётчик сам. Начальное значение счётчика -1, то есть у
# ячейки в колонке 0 номера тоже нет.
prev_col = -1
for cell_info in row_cells:
lines.append('\t\t\t<c>')
if cell_info['Col'] != prev_col + 1:
lines.append(f'\t\t\t\t<i>{cell_info["Col"]}</i>')
lines.append('\t\t\t\t<c>')
lines.append(f'\t\t\t\t\t<f>{cell_info["FormatIdx"]}</f>')
prev_col = cell_info['Col']
lines.append('\t\t\t\t<c>')
lines.append(f'\t\t\t\t\t<f>{cell_info["FormatIdx"]}</f>')
if cell_info['Param']:
lines.append(f'\t\t\t\t\t<parameter>{cell_info["Param"]}</parameter>')
if cell_info['Detail']:
lines.append(f'\t\t\t\t\t<detailParameter>{cell_info["Detail"]}</detailParameter>')
if cell_info['Param']:
lines.append(f'\t\t\t\t\t<parameter>{cell_info["Param"]}</parameter>')
if cell_info['Detail']:
lines.append(f'\t\t\t\t\t<detailParameter>{cell_info["Detail"]}</detailParameter>')
# Проверяем НАЛИЧИЕ ключа, а не истинность: пустая строка — это текст,
# платформа такие ячейки пишет с пустым <tl>, и по истинности он терялся.
if cell_info['Text'] is not None:
emit_cell_text(lines, cell_info['Text'])
# Проверяем НАЛИЧИЕ ключа, а не истинность: пустая строка — это текст,
# платформа такие ячейки пишет с пустым <tl>, и по истинности он терялся.
if cell_info['Text'] is not None:
emit_cell_text(lines, cell_info['Text'])
if cell_info['Template'] is not None:
emit_cell_text(lines, cell_info['Template'])
if cell_info['Template'] is not None:
emit_cell_text(lines, cell_info['Template'])
lines.append('\t\t\t\t</c>')
lines.append('\t\t\t</c>')
lines.append('\t\t\t\t</c>')
lines.append('\t\t\t</c>')
lines.append('\t\t</row>')
lines.append('\t</rowsItem>')
@@ -1107,6 +1146,8 @@ def main():
'EndCol': -1,
})
flush_gap()
total_row_count = global_row
# 7d-bis. Именованные области, заданные координатами (namedAreas).
@@ -56,7 +56,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -68,7 +67,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -80,7 +78,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -98,21 +95,18 @@
<row>
<columnsID>12320174-2b07-3806-9f7f-ec3834007fdb</columnsID>
<c>
<i>0</i>
<c>
<f>4</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>4</f>
<parameter>Кол</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>4</f>
<parameter>Сумма</parameter>
@@ -52,7 +52,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>5</f>
<tl>
@@ -64,7 +63,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>5</f>
<tl>
@@ -76,7 +74,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>5</f>
<tl>
@@ -88,7 +85,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>5</f>
<tl>
@@ -100,7 +96,6 @@
</c>
</c>
<c>
<i>4</i>
<c>
<f>5</f>
<tl>
@@ -112,7 +107,6 @@
</c>
</c>
<c>
<i>5</i>
<c>
<f>5</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<tl>
@@ -31,12 +30,7 @@
</rowsItem>
<rowsItem>
<index>1</index>
<row>
<empty>true</empty>
</row>
</rowsItem>
<rowsItem>
<index>2</index>
<indexTo>2</indexTo>
<row>
<empty>true</empty>
</row>
@@ -45,21 +39,18 @@
<index>3</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<parameter>Код</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>4</f>
<parameter>Имя</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>4</f>
<parameter>Значение</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>3</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>2</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>2</f>
<tl>
@@ -52,7 +49,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>2</f>
<tl>
@@ -69,28 +65,24 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<parameter>Дата</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>5</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>6</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>6</f>
<parameter>Цена</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -57,7 +54,6 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -69,7 +65,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -81,7 +76,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -110,7 +104,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -127,7 +120,6 @@
<index>3</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>3</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>3</f>
<tl>
@@ -69,7 +67,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>4</f>
<tl>
@@ -86,28 +83,24 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>5</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>6</f>
<parameter>Наименование</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>6</f>
<parameter>Артикул</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>6</f>
<parameter>Итого</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -17,7 +17,6 @@
<row>
<formatIndex>2</formatIndex>
<c>
<i>0</i>
<c>
<f>3</f>
<parameter>ТекстЗаголовка</parameter>
@@ -29,7 +28,6 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<tl>
@@ -41,7 +39,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>4</f>
<tl>
@@ -53,7 +50,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>4</f>
<tl>
@@ -65,7 +61,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>4</f>
<tl>
@@ -82,14 +77,12 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>5</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>5</f>
<parameter>Товар</parameter>
@@ -97,14 +90,12 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>6</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>6</f>
<parameter>Сумма</parameter>
@@ -128,7 +119,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>8</f>
<parameter>Всего</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -52,7 +49,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>1</f>
<tl>
@@ -69,28 +65,24 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<parameter>П1</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>2</f>
<parameter>П2</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>2</f>
<parameter>П3</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>2</f>
<parameter>П4</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -46,7 +46,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>3</f>
<tl>
@@ -58,7 +57,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>3</f>
<tl>
@@ -70,7 +68,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>3</f>
<tl>
@@ -82,7 +79,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>3</f>
<tl>
@@ -94,7 +90,6 @@
</c>
</c>
<c>
<i>4</i>
<c>
<f>3</f>
<tl>
@@ -111,35 +106,30 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>5</f>
<parameter>Номер</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>6</f>
<parameter>Описание</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>5</f>
<parameter>ЕдИзм</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>5</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<i>4</i>
<c>
<f>6</f>
<parameter>Сумма</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>3</f>
<tl>
@@ -45,7 +43,6 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<tl>
@@ -57,7 +54,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>3</f>
<tl>
@@ -74,21 +70,18 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>5</f>
<parameter>Позиция</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>5</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>5</f>
<parameter>Цена</parameter>
@@ -77,7 +77,6 @@
<row>
<formatIndex>2</formatIndex>
<c>
<i>0</i>
<c>
<f>3</f>
<parameter>ТекстЗаголовка</parameter>
@@ -95,7 +94,6 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<tl>
@@ -119,7 +117,6 @@
<index>3</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<tl>
@@ -143,7 +140,6 @@
<index>4</index>
<row>
<c>
<i>0</i>
<c>
<f>7</f>
<tl>
@@ -155,7 +151,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>7</f>
<tl>
@@ -179,7 +174,6 @@
</c>
</c>
<c>
<i>7</i>
<c>
<f>7</f>
<tl>
@@ -191,7 +185,6 @@
</c>
</c>
<c>
<i>8</i>
<c>
<f>7</f>
<tl>
@@ -203,7 +196,6 @@
</c>
</c>
<c>
<i>9</i>
<c>
<f>7</f>
<tl>
@@ -220,14 +212,12 @@
<index>5</index>
<row>
<c>
<i>0</i>
<c>
<f>8</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>9</f>
<parameter>Товар</parameter>
@@ -242,21 +232,18 @@
</c>
</c>
<c>
<i>7</i>
<c>
<f>10</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<i>8</i>
<c>
<f>10</f>
<parameter>Цена</parameter>
</c>
</c>
<c>
<i>9</i>
<c>
<f>10</f>
<parameter>Сумма</parameter>
@@ -314,12 +301,7 @@
</rowsItem>
<rowsItem>
<index>8</index>
<row>
<empty>true</empty>
</row>
</rowsItem>
<rowsItem>
<index>9</index>
<indexTo>9</indexTo>
<row>
<empty>true</empty>
</row>
@@ -328,7 +310,6 @@
<index>10</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<tl>
@@ -375,7 +356,6 @@
<index>13</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -69,7 +67,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -86,28 +83,24 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<parameter>Вид</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>2</f>
<parameter>Нач</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>2</f>
<parameter>Кон</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>2</f>
<parameter>Итог</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -52,7 +49,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>1</f>
<tl>
@@ -69,14 +65,12 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>2</f>
<parameter>Кол</parameter>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -17,7 +17,6 @@
<row>
<formatIndex>2</formatIndex>
<c>
<i>0</i>
<c>
<f>3</f>
<tl>
@@ -34,7 +33,6 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>4</f>
<tl>
@@ -58,7 +56,6 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>6</f>
<tl>
@@ -70,7 +67,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>6</f>
<tl>
@@ -82,7 +78,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>6</f>
<tl>
@@ -94,7 +89,6 @@
</c>
</c>
<c>
<i>3</i>
<c>
<f>6</f>
<tl>
@@ -106,7 +100,6 @@
</c>
</c>
<c>
<i>4</i>
<c>
<f>6</f>
<tl>
@@ -123,35 +116,30 @@
<index>3</index>
<row>
<c>
<i>0</i>
<c>
<f>8</f>
<parameter>НомерСтроки</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>9</f>
<parameter>Товар</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>10</f>
<parameter>Количество</parameter>
</c>
</c>
<c>
<i>3</i>
<c>
<f>10</f>
<parameter>Цена</parameter>
</c>
</c>
<c>
<i>4</i>
<c>
<f>10</f>
<parameter>Сумма</parameter>
@@ -175,7 +163,6 @@
</c>
</c>
<c>
<i>4</i>
<c>
<f>12</f>
<parameter>Всего</parameter>
@@ -187,7 +174,6 @@
<index>5</index>
<row>
<c>
<i>0</i>
<c>
<f>13</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -32,7 +31,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -44,7 +42,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>2</f>
<tl>
@@ -16,7 +16,6 @@
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -28,7 +27,6 @@
</c>
</c>
<c>
<i>1</i>
<c>
<f>1</f>
<tl>
@@ -40,7 +38,6 @@
</c>
</c>
<c>
<i>2</i>
<c>
<f>1</f>
<tl>
@@ -57,7 +54,6 @@
<index>1</index>
<row>
<c>
<i>0</i>
<c>
<f>1</f>
<tl>
@@ -74,21 +70,18 @@
<index>2</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<parameter>П1</parameter>
</c>
</c>
<c>
<i>1</i>
<c>
<f>2</f>
<parameter>П2</parameter>
</c>
</c>
<c>
<i>2</i>
<c>
<f>2</f>
<parameter>П3</parameter>