Одна и та же картинка 25×30 вставлена в стенд дважды: без флажка «прозрачный фон» платформа пишет t="false", с флажком — tx="24" ty="29", то есть координату правого нижнего пикселя. Два способа записи исключают друг друга. Стенд с обоими случаями положен в фикстуры.
49 KiB
Спецификация XML-формата табличного документа (SpreadsheetDocument)
Формат файла Template.xml для макетов типа SpreadsheetDocument (табличный документ / MXL).
Namespace
<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">
Структура документа
Элементы внутри <document> идут в фиксированном порядке:
<document>
<languageSettings> — языковые настройки
<columns> ... — наборы колонок (один или несколько)
<rowsItem> ... — строки с данными (повторяются)
<drawing> ... — рисунки (опционально, повторяются)
<templateMode>true — признак макета
<defaultFormatIndex> — индекс формата по умолчанию
<height> — общее количество строк
<vgRows> — видимых строк (обычно = height)
<merge> ... — объединения ячеек (повторяются)
<verticalUnmerge> ... — отмена объединений (опционально)
<namedItem> ... — именованные области (повторяются)
<line> ... — стили линий (повторяются)
<font> ... — шрифты (опционально, повторяются)
<format> ... — форматы (повторяются)
<picture> ... — ресурсы картинок (опционально)
</document>
Индексация
Все палитры (линии, шрифты, форматы) — плоские массивы, на элементы которых ссылаются по индексу.
| Палитра | Индексация | Индекс 0 означает |
|---|---|---|
<line> |
0-based | Первый элемент <line> |
<font> |
0-based | Первый элемент <font> |
<format> |
1-based | 0 = «формат по умолчанию» (не задан) |
Формат с индексом N — это N-й элемент <format> в документе (считая от 1).
Языковые настройки
<languageSettings>
<currentLanguage>ru</currentLanguage>
<defaultLanguage>ru</defaultLanguage>
<languageInfo>
<id>ru</id>
<code>Русский</code>
<description>Русский</description>
</languageInfo>
</languageSettings>
Языков бывает несколько, и объявленный набор НЕ выводится из того, на каких языках лежит
текст ячеек: на корпусе ERP объявлен один ru у 10 753 макетов, при том что текст в них
лежит и под ru, и под en. Наборы: [ru] — 10 753, [ru,en] — 148, [en,ru] — 20.
id и code всегда со значением; description бывает пустым и тогда пишется
самозакрывающимся тегом <description/> (77 записей из 11 094). Из id эти поля не
выводятся: у en описание бывает «Английский», пустым и «English».
currentLanguage иногда отсутствует вовсе (3 макета), иногда указывает на необъявленный
язык (8 макетов с en при объявленном одном ru). defaultLanguage во всех четырёх
русских типовых равен ru, но это свойство конфигурации, а не формата.
Колонки
Основной набор
<columns>
<size>33</size> <!-- общее количество колонок -->
<columnsItem>
<index>1</index> <!-- индекс колонки (0-based) -->
<column>
<formatIndex>1</formatIndex> <!-- ссылка на format[] -->
</column>
</columnsItem>
...
</columns>
Перечисляются колонки, у которых есть собственный формат. Обычно это ширина (<width> в
палитре форматов), но формат колонки несёт и оформление: шрифт (3 006 форматов на корпусе),
выравнивания, рамки, hidden.
Два случая, которые легко упустить:
<formatIndex>0</formatIndex>— колонка перечислена, а формата у неё нет (ноль здесь не индекс записи). Встречается у 4% макетов;- индекс колонки бывает больше или равен
<size>— платформа описывает колонки за пределами объявленной ширины сетки (25% макетов).
Дополнительные наборы колонок
Некоторые строки документа могут использовать собственную сетку колонок, отличную от основной. Каждый дополнительный набор имеет UUID:
<columns>
<id>f01e015f-de4c-4f97-9fbe-a244c4c30c6c</id>
<size>17</size>
<columnsItem>
<index>0</index>
<column>
<formatIndex>12</formatIndex>
</column>
</columnsItem>
...
</columns>
- Первый
<columns>— основной набор (без<id>) - Дополнительные наборы — с
<id>(UUID), могут иметь другое количество и ширину колонок - Строки, merge и namedItem ссылаются на набор через
<columnsID>
Типичное применение: сложные печатные формы (УПД, УКД), где шапка/подвал/табличная часть имеют разную разбивку на колонки.
Именованная область тоже ссылается на набор — тегом <columnsID> внутри <area>, последним.
На корпусе привязку несут 913 483 прямоугольных области, 20 063 полосы строк и 743 полосы колонок;
висячих ссылок нет ни одной. Из накрытых строк она выводится не всегда: у областей типа Rows
13 623 повторяют раскладку строк, а 8 179 её не несут при тех же строках.
Строки и ячейки
Строка
<rowsItem>
<index>3</index> <!-- индекс строки (0-based) -->
<indexTo>5</indexTo> <!-- опц.: диапазон [index..indexTo] с одинаковым содержимым -->
<row>
<columnsID>f01e015f-...</columnsID> <!-- опц.: набор колонок (UUID) -->
<formatIndex>5</formatIndex> <!-- опц.: формат строки (определяет высоту) -->
<empty>true</empty> <!-- опц.: пустая строка -->
<c>...</c> <!-- ячейки (повторяются) -->
</row>
</rowsItem>
<indexTo>объединяет подряд идущие пустые строки. Одинаковые НЕпустые строки платформа не схлопывает никогда: на корпусе ERP (10 924 макета) схлопнутых непустых нет ни одной, несхлопнутых одинаковых непустых — 98 153; несхлопнутых одинаковых пустых — тоже ни одной<columnsID>привязывает строку к дополнительному набору колонок. Без него — используется основной набор<formatIndex>строки несёт не только высоту: в корпусе тамhidden(17 423 вхождения),font(9 216),backColor, выравнивания,protection, рамки
Ячейка
Ячейки внутри <row> — элементы <c> (cell group), каждый содержит <c> (cell content):
<c> <!-- cell group -->
<i>6</i> <!-- индекс колонки (0-based), опционален -->
<c> <!-- cell content -->
<f>9</f> <!-- индекс формата -->
<parameter>Имя</parameter> <!-- параметр для заполнения -->
<detailParameter>Расш</detailParameter> <!-- параметр расшифровки -->
<tl> <!-- текст (локализованная строка) -->
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Итого:</v8:content>
</v8:item>
</tl>
</c>
</c>
Правила позиционирования <i>:
- Если
<i>указан — ячейка в этой колонке - Если
<i>не указан — колонка = предыдущая + 1 - Первая ячейка без
<i>идёт в колонку 0
Платформа пишет <i> только при разрыве последовательности: у подряд идущей ячейки его нет.
На корпусе ERP из 1 212 023 записанных номеров ни один не избыточен (счётчик начинается с −1,
поэтому у ячейки в колонке 0 номера тоже нет).
У текста ячейки ТРИ состояния, а не два:
| запись | смысл |
|---|---|
<tl> отсутствует |
текста нет |
<tl> с элементами |
текст по элементу на язык (содержимое бывает пустым) |
<tl/> |
тег есть, языков в нём нет |
Третье — не редкость: 38 075 ячеек на 1200 макетов, встречается в 57% макетов корпуса.
<f>0</f> означает, что формата у ячейки нет вовсе — это не индекс записи. Так записана
ячейка без собственного оформления: 170 710 таких ячеек против 50 635, ссылающихся на формат
по умолчанию; <f>0</f> встречается в 71% макетов.
Типы заполнения ячеек
Тип заполнения определяется свойством fillType в формате ячейки:
| fillType | Данные ячейки | Описание |
|---|---|---|
Parameter |
<parameter>Имя</parameter> |
Значение подставляется программно |
Template |
<tl>Текст [Параметр]</tl> |
Шаблон — [Имя] заменяется на значение |
Text |
<tl>Текст</tl> |
Статический текст |
| (нет) | — | Пустая ячейка или ячейка с форматированием |
<detailParameter> — имя параметра расшифровки (для навигации при клике на ячейку).
Рисунки
<drawing>
<drawingType>Picture</drawingType>
<id>1</id>
<formatIndex>11</formatIndex>
<beginRow>3</beginRow>
<beginRowOffset>6</beginRowOffset>
<endRow>4</endRow>
<endRowOffset>33</endRowOffset>
<beginColumn>2</beginColumn>
<beginColumnOffset>0</beginColumnOffset>
<endColumn>4</endColumn>
<endColumnOffset>183</endColumnOffset>
<autoSize>false</autoSize>
<pictureSize>Proportionally</pictureSize>
<zOrder>1</zOrder>
<pictureIndex>1</pictureIndex>
</drawing>
Позиция задаётся через начальную/конечную строку и колонку + смещения в пикселях. pictureIndex ссылается на ресурс из палитры <picture>.
Объединения ячеек
<merge>
<r>3</r> <!-- строка (0-based), -1 = все строки -->
<c>1</c> <!-- колонка (0-based) -->
<h>1</h> <!-- доп. строк (опц., по умолчанию 0 = одна строка) -->
<w>30</w> <!-- доп. колонок -->
<columnsID>f01e015f-...</columnsID> <!-- опц.: набор колонок -->
</merge>
Размер объединения: (h + 1) строк × (w + 1) колонок. Если <h> не указан — объединение в пределах одной строки.
<r>-1</r> — объединение действует для всех строк, использующих данный набор колонок (аналог объединения колонок на уровне всего документа).
Отмена объединений
<verticalUnmerge> отменяет вертикальное объединение для конкретной строки:
<verticalUnmerge>
<r>10</r> <!-- строка (0-based) -->
<c>7</c> <!-- колонка (0-based) -->
<w>12</w> <!-- доп. колонок -->
</verticalUnmerge>
Используется в сложных макетах, когда глобальное объединение колонок (<r>-1</r>) нужно разорвать в отдельных строках.
Именованные области
Именованные области — аналог «имён» в табличном документе 1С. Используются для программного вывода секций.
Получение области:
// Горизонтальная область (диапазон строк)
Область = Макет.ПолучитьОбласть("Заголовок");
// Пересечение горизонтальной и вертикальной областей
Область = Макет.ПолучитьОбласть("ВысотаЭтикетки|ШиринаЭтикетки");
Пересечение через | типично для этикеток и ценников, где нужна область фиксированного размера (высота × ширина).
Тип Rows — горизонтальная область
<namedItem xsi:type="NamedItemCells">
<name>Заголовок</name>
<area>
<type>Rows</type>
<beginRow>1</beginRow> <!-- 0-based -->
<endRow>4</endRow>
<beginColumn>-1</beginColumn> <!-- -1 = все колонки -->
<endColumn>-1</endColumn>
</area>
</namedItem>
Порядок элементов namedItem — по имени. Платформа хранит их отсортированными, регистронезависимо: на выборке 541 макета ERP 8.3.24 с несколькими именованными элементами иного порядка не встретилось ни разу. Сортировка ординальная (латиница раньше кириллицы); случай с «ё» в выборке не встретился и не проверен.
Тип Columns — вертикальная область
<namedItem xsi:type="NamedItemCells">
<name>ШиринаЭтикетки</name>
<area>
<type>Columns</type>
<beginRow>-1</beginRow> <!-- -1 = все строки -->
<endRow>-1</endRow>
<beginColumn>1</beginColumn> <!-- 0-based -->
<endColumn>5</endColumn>
</area>
</namedItem>
Тип Rectangle — прямоугольная область
Область, ограниченная и по строкам, и по колонкам. Используется с дополнительными наборами колонок:
<namedItem xsi:type="NamedItemCells">
<name>ОбластьЗаписьДо</name>
<area>
<type>Rectangle</type>
<beginRow>22</beginRow> <!-- 0-based -->
<endRow>22</endRow>
<beginColumn>5</beginColumn> <!-- 0-based -->
<endColumn>17</endColumn>
<columnsID>c6cb0794-...</columnsID> <!-- набор колонок -->
</area>
</namedItem>
Привязка к набору колонок
Именованные области могут ссылаться на дополнительный набор колонок через <columnsID>:
<namedItem xsi:type="NamedItemCells">
<name>НумерацияЛистов</name>
<area>
<type>Rows</type>
<beginRow>59</beginRow>
<endRow>59</endRow>
<beginColumn>-1</beginColumn>
<endColumn>-1</endColumn>
<columnsID>0adf41ed-...</columnsID>
</area>
</namedItem>
Тип Drawing — именованный рисунок
<namedItem xsi:type="NamedItemDrawing">
<name>Штрихкод</name>
<drawingID>1</drawingID> <!-- ссылка на drawing/id -->
</namedItem>
Стили линий
Палитра линий для границ ячеек и рисунков. Индексация 0-based.
<!-- Для границ ячеек -->
<line width="2" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Solid</v8ui:style>
</line>
<!-- Для границ рисунков -->
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentDrawingLineType">None</v8ui:style>
</line>
| xsi:type | Значения |
|---|---|
v8ui:SpreadsheetDocumentCellLineType |
Solid, None, Dotted, ThinDashed, LargeDashed, ThickDashed, Double |
v8ui:SpreadsheetDocumentDrawingLineType |
те же |
Атрибут width — толщина линии; в корпусе встречаются 0, 1, 2, 3. Атрибут gap на корпусе
всегда false, но пишется всегда.
Шрифты
Палитра шрифтов. Индексация 0-based.
<!-- Абсолютный шрифт -->
<font faceName="Arial" height="14" bold="true" italic="false"
underline="false" strikeout="false" kind="Absolute" scale="100"/>
<!-- Ссылка на элемент стиля конфигурации -->
<font ref="style:TextFont" kind="StyleItem"/>
<!-- Ссылка на системный шрифт: префикс sys в корне НЕ объявлен, поэтому объявление
дописывается прямо на узел — тот же приём, что у цветов из web-палитры -->
<font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"
ref="sys:ANSIVariableFont" kind="WindowsFont"/>
kind выводится из префикса ссылки: style: → StyleItem, sys: → WindowsFont.
На корпусе ERP таких шрифтов 272 в 213 макетах из 10 924 (StyleItem 209, WindowsFont 63).
Шрифт, на который не ссылается ни один формат, в палитру не попадает: у макета без
оформления элемента <font> нет вовсе.
Устройство палитр
Три правила, общие для всех палитр. Все проверены на корпусе ERP (10 924 макета) и на макетах, собранных вручную в Конфигураторе.
Порядок — документный. Записи идут в том порядке, в каком встречаются при обходе документа сверху вниз: сначала форматы колонок (в порядке колонок), затем форматы строк и ячеек. Порядок НЕ зависит от того, в какой последовательности автор оформлял макет: контрольный опыт с оформлением снизу вверх дал палитру в порядке строк.
Формат по умолчанию — последняя запись. На корпусе он последний в 8285 макетах из 10 863, первым — в 25.
Палитра форматов дедуплицирована по содержимому: двух одинаковых записей в ней нет (10 804 макета из 10 924). Остальные 120 — накопленный мусор редактирования, там доходит до 583 записей при 130 уникальных.
Форматы
Палитра форматов — центральный элемент. Индексация 1-based (индекс 0 = формат не задан).
<format>
<font>0</font> <!-- индекс шрифта (0-based) -->
<leftBorder>0</leftBorder> <!-- индекс линии левой границы -->
<topBorder>1</topBorder> <!-- индекс линии верхней границы -->
<rightBorder>0</rightBorder> <!-- индекс линии правой границы -->
<bottomBorder>1</bottomBorder> <!-- индекс линии нижней границы -->
<width>24</width> <!-- ширина (для колонок) -->
<height>84</height> <!-- высота (для строк) -->
<horizontalAlignment>Center</horizontalAlignment> <!-- Left | Center | Right -->
<verticalAlignment>Center</verticalAlignment> <!-- Top | Center -->
<textPlacement>Wrap</textPlacement> <!-- Wrap = перенос по словам -->
<fillType>Parameter</fillType> <!-- Parameter | Template | Text -->
<format> <!-- строка формата (опционально) -->
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ЧЦ=15; ЧДЦ=2</v8:content>
</v8:item>
</format>
<drawingBorder>1</drawingBorder> <!-- индекс линии для рисунка -->
</format>
Все свойства опциональны. Формат может содержать только <width> (для колонки) или только <height> (для строки).
Порядок тегов
Внутри <format> теги идут в строгой последовательности — от неё зависит побайтовое совпадение
с выгрузкой. Порядок снят с корпуса ERP: 766 960 форматов, ни один его не нарушает.
print · drawingBorder · drawingHaveLeftBorder · drawingHaveTopBorder ·
drawingHaveRightBorder · drawingHaveBottomBorder · font · leftBorder · topBorder ·
rightBorder · bottomBorder · border · height · borderColor · width ·
autoWidthCalculation · widthWeightFactor · horizontalAlignment · verticalAlignment ·
textColor · backColor · patternColor · pattern · textPlacement · fillType · protection ·
hidden · textOrientation · detailsUse · bySelectedColumns · markNegatives ·
containsValue · valueType · format · controlType · hyperLink · autoMarkIncomplete ·
indent · autoIndent · editFormat · columnSizeChange · mask · picIndex ·
pictureSizeMode · picHorizontalAlignment · picVerticalAlignment · textPosition
Обрати внимание: height идёт РАНЬШЕ width, а format — после valueType.
Ширина и высота
Единица — 1/8 символа: 72 = стандартные 9 символов, 240 = 30, 80 = 10.
Рамка
Четыре стороны и свёрнутый <border> взаимоисключающи. Если все четыре стороны одинаковы,
платформа пишет один <border>; иначе — по сторонам. На корпусе: 70 265 свёрнутых форматов
против 36 783 записанных по сторонам, и среди вторых нет ни одного с четырьмя совпадающими
значениями; смешения border с посторонними тегами нет ни разу.
Цвет
Значение цвета (backColor, textColor, borderColor, patternColor) — строка с префиксом
пространства имён, а не свободный текст:
| Запись в XML | Смысл |
|---|---|
#RRGGBB |
RGB-hex |
style:ИмяСтиля |
элемент стиля; префикс style объявлен в корне документа |
d3p1:Имя + xmlns:d3p1=".../ui/colors/web" на самом узле |
цвет web-палитры |
d3p1:Имя + xmlns:d3p1=".../ui/colors/windows" на самом узле |
системный цвет Windows |
Корень <document> объявляет только style, поэтому для web- и windows-палитр платформа
дописывает объявление прямо на узел. Префикс всегда d3p1 (1264 вхождения на корпусе без
отклонений). В Form.xml те же цвета выглядят как web:Имя и win:Имя — там эти префиксы
объявлены в корне.
Связь формата с контекстом
Один формат обслуживает всех: колонка, строка и ячейка ссылаются в одну палитру, и набор
свойств у них общий (hidden встречается у ячеек 30 175 раз, у строк 17 423, у колонок 57;
protection — 84 442 / 1 492 / 1 017).
| Контекст | Ссылка | Свойства, специфичные для контекста |
|---|---|---|
| Колонка | <formatIndex> |
width |
| Строка | <formatIndex> |
height, hidden |
| Ячейка | <f> |
fillType, containsValue |
| Рисунок | <formatIndex> |
drawingBorder, drawing* |
| По умолчанию | <defaultFormatIndex> |
width |
Оформление, применённое к строке целиком, платформа записывает И в формат строки, И в формат
каждой ячейки (backColor: 13 899 ячеек повторяют против 96). Исключение — hidden: оно
остаётся только у строки (24 026 против 62 856).
Ячейка-поле ввода: containsValue / valueType / controlType
Ячейка может содержать не текст, а редактируемое значение. Три тега формата описывают это целиком:
<format>
<containsValue>true</containsValue>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>15</v8:Digits>
<v8:FractionDigits>3</v8:FractionDigits>
<v8:AllowedSign>Nonnegative</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
<controlType>381ed624-9217-4e63-85db-c4c3cb87daae</controlType>
</format>
Свойство принадлежит ЯЧЕЙКЕ, хотя и живёт в общей палитре: из 370 197 ссылок на такие записи
(корпус ERP, 5 809 макетов из 10 924) все до одной идут из <f> — ни строка, ни колонка, ни
<defaultFormatIndex> на них не ссылаются ни разу.
| Наблюдение | Данные корпуса |
|---|---|
containsValue всегда true |
63 726 форматов, других значений нет |
valueType присутствует всегда |
0 форматов без него; 12 — с ПУСТЫМ <valueType/> (тип не ограничен) |
| текста у такой ячейки не бывает | 0 из 370 197 несут <tl> |
<parameter> и <detailParameter> — бывают |
3 219 и 2 278 |
fillType у формата со значением недостоверен |
94 062 записи несут Text при полном отсутствии текста — след прежнего состояния, как width |
Элемент управления задаётся GUID; имён в XML нет вовсе. В Конфигураторе это «ЭлементУправления» со значениями «Поле ввода» и «Поле флажка»:
| GUID | Элемент | Вхождений |
|---|---|---|
381ed624-9217-4e63-85db-c4c3cb87daae |
Поле ввода | 63 629 |
35af3d93-d7c7-4a2e-a8eb-bac87a1a3f26 |
Поле флажка | 7 |
Умолчание — поле ввода, и оно же стоит у Булево: из 664 булевых форматов флажок выбран в семи.
У 90 форматов (22 макета регламентированной отчётности, явно машинно-сгенерированных) тега
<controlType> нет вовсе.
Флажок Конфигуратор предлагает только для Булево и Числа. Ограничение при этом чисто интерфейсное: макет с флажком у строки и у даты платформа принимает и возвращает GUID дословно (проверено сборкой EPF и обратной выгрузкой через базу — ни отказа, ни нормализации).
Структура <valueType> — то же описание типов, что в метаданных: сначала все <v8:Type> и
<v8:TypeSet> в порядке источника, затем блоки квалификаторов в порядке Number → String → Date.
Голая категория без имени объекта (CatalogRef, AnyRef) — это <v8:TypeSet>, а не <v8:Type>.
Ссылочные типы несут локальное объявление пространства имён на каждом узле:
<v8:Type xmlns:d4p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d4p1:CatalogRef.Валюты</v8:Type>
Префикс всегда d4p1 (15 вхождений на корпусе, отклонений нет) — независимо от того, есть ли
в макете цвета web-палитры, которым платформа даёт d3p1. Корень <document> пространство
current-config не объявляет, поэтому вынести объявление наверх нельзя.
Продолжение конструкции — на уровне САМОЙ ячейки, а не палитры:
<c>
<f>34</f>
<v xsi:type="xs:decimal">0</v>
<control xsi:type="xs:base64Binary">77u/MiwxLDM4MWVkNjI0…</control>
</c>
| Тег ячейки | Смысл | Вхождений | Макетов |
|---|---|---|---|
<v> |
сохранённое значение ячейки; xsi:type соответствует объявленному типу (decimal 153 566, string 61 203, dateTime 3 333, boolean 1 012) |
219 114 | 4 578 |
<control> |
сериализованные настройки элемента управления (base64; внутри — тот же GUID и структура вида маски/списка выбора) | 26 370 | 1 246 |
Оба тега встречаются ИСКЛЮЧИТЕЛЬНО в ячейках, чей формат несёт containsValue — ни одного
вхождения в обычной ячейке. То есть это вторая половина той же конструкции, а не отдельное
свойство. Обрати внимание на совпадение имён: <control> у ячейки и <controlType> в формате —
разные вещи.
Ловушка: width в формате ЯЧЕЙКИ не описывает ячейку. Ссылка ячейки на запись палитры не
обновляется при изменении ширины колонки, поэтому там остаётся ширина от прежнего состояния
документа. Проверено на контролируемом стенде: в макете, где ширины колонок поменяли на
обратные, ячейки продолжают ссылаться на записи со старыми ширинами. Из итогового XML это
значение не выводится — воспроизводить его не нужно.
Колонтитулы и параметры печати
<leftHeader>
<f>2</f> <!-- формат: шрифт, выравнивание, признак вывода, стартовая страница -->
<tl><v8:item><v8:lang>ru</v8:lang><v8:content>Слева</v8:content></v8:item></tl>
</leftHeader>
…
<printSettings>
<topMargin>1000</topMargin> … <firstPageNumber>15</firstPageNumber>
</printSettings>
Шесть элементов идут после строк и перед <templateMode>: leftHeader, centerHeader,
rightHeader, leftFooter, centerFooter, rightFooter. Пишутся не комплектом: leftHeader
есть у 1 013 макетов, остальные — у 677–790.
| Наблюдение | Данные корпуса |
|---|---|
| текст слота | <tl> — обычная строка, <tfl> — форматированная (разметка внутри содержимого: <b>…</>, <fontsize 12>, <colorstyle -16>) |
| формат слота | <height> = признак вывода (1 / -1), <width> = страница, с которой печатать, плюс шрифт и verticalAlignment |
| формат общий на колонтитул | у 674 макетов из 677; разный у трёх |
| формат делится с другими владельцами | 637 против 153 «только колонтитулы» — палитра дедуплицирована, поэтому <width> в чужой записи означает ширину колонки, а не страницу |
Ловушка: перенос строки внутри текста колонтитула платформа хранит голым LF, тогда как весь остальной файл идёт CRLF. Это единственное место документа с другим переводом строки.
printSettings (2 350 макетов) — плоский набор в фиксированном порядке: pageOrientation ·
scale · collate · copies · perPage · topMargin · leftMargin · bottomMargin ·
rightMargin · headerSize · footerSize · fitToPage · blackAndWhite · printerName ·
paper · paperSource · pageWidth · pageHeight · duplexType · pagePlacementAlternation ·
firstPageNumber. Номер первой страницы принадлежит именно параметрам печати, а не колонтитулу.
Группы строк и колонок
<vgLevels>2</vgLevels>
<vgRows>8</vgRows>
<vg>
<b>1</b> <!-- начало диапазона, 0-based -->
<e>2</e> <!-- конец; нет — группировка из одной строки -->
<t><v8:item><v8:lang>ru</v8:lang><v8:content>Итоговая</v8:content></v8:item></t>
<o>false</o> <!-- свёрнута; развёрнутая тег не пишет -->
<g>Begin</g> <!-- расположение заголовка: Begin | End; нет — Авто -->
</vg>
<hg>…</hg> <!-- то же для колонок -->
Строки группируются часто (1 797 макетов, 170 967 групп), колонки — почти никогда
(1 макет, 1 группировка). Порядок документных тегов: height → vgLevels → vgRows → vg →
hg; vgLevels пишется только при наличии группировок.
| Наблюдение | Данные корпуса |
|---|---|
| диапазоны либо вложены, либо не пересекаются | 40 620 886 пар непересекающихся, 599 958 вложенных, 0 частичных |
| порядок записи — родитель раньше вложенных, по возрастанию начала | совпало у 1 798 макетов из 1 798 |
<vgLevels> = глубина вложенности |
совпало у 1 797 из 1 797 |
<o> |
только false (6 130) — развёрнутая группировка тег не пишет |
<g> |
в корпусе только Begin (6); значение End даёт Конфигуратор при «Расположение заголовка: Конец» |
Имя (<t>) — мультиязычная строка, и в 143 455 случаях это автоимя R<номер строки + 1>.
Вывести его нельзя: 16 666 имён «протухли» (R91 у строки 103 — строки вставляли после
создания группировки), а 10 287 группировок имени не имеют вовсе. Языковые наборы —
ru+en (93 250) либо псевдоязык # (67 431), никогда вместе.
Примечание к ячейке
<note>
<drawingType>Comment</drawingType>
<id>0</id>
<formatIndex>1</formatIndex>
<text><v8:item><v8:lang>ru</v8:lang><v8:content>тест</v8:content></v8:item></text>
<beginRow>1</beginRow> <beginRowOffset>-21</beginRowOffset>
<endRow>0</endRow> <endRowOffset>51</endRowOffset>
<beginColumn>1</beginColumn> <beginColumnOffset>21</beginColumnOffset>
<endColumn>0</endColumn> <endColumnOffset>408</endColumnOffset>
<autoSize>true</autoSize>
<pictureSize>Stretch</pictureSize>
</note>
Конструкция редкая (188 макетов, 1 087 примечаний), но структура жёсткая: все четырнадцать тегов присутствуют у всех 1 087, порядок один и тот же, опциональных нет. Информации при этом меньше, чем тегов:
| Тег | Наблюдение |
|---|---|
drawingType, pictureSize, id |
константы: Comment, Stretch, 0 |
beginRow, beginColumn |
всегда 1/1 — 1085 и 1086 из 1087; три исключения в одном макете |
endRow, endColumn |
координаты самой ячейки — 1087 из 1087 |
| четыре смещения | авторские: сдвиг окошка меняет begin*Offset, растяжение — end*Offset |
autoSize |
true у 1036 из 1087 |
autoSize описывает не наличие геометрии, а пересчёт размера: при true окошко всё равно несёт
координаты, и они осмысленны — 306 различных пар (endRowOffset, endColumnOffset) против
12 различных пар положения.
Формат примечания — обычная запись палитры, на корпусе их всего 7 различных: 926 — стиль
подсказки (verticalAlignment: Top + style:ToolTipTextColor + style:ToolTipBackColor),
105 — он же с заливкой #FFFAD9.
Палитра картинок
Идёт последним блоком документа. Внутренний <index> 0-based, а ссылки на него — 1-based:
<pictureIndex> у рисунка, picIndex в записи формата у картинки в ячейке.
<picture>
<index>0</index>
<picture ref="v8ui:Штрихкод"/> <!-- ссылка на библиотеку картинок платформы -->
</picture>
<picture>
<index>1</index>
<picture t="false">iVBORw0KGgoAAAANSUhEUgAAAG4AAAA2CAIAAACp5Ds2AAAAAXNSR0IArs4c6QAA
AARnQUlBAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAA</picture>
</picture>
Данные base64 платформа переносит по строкам тем же переводом, что и весь файл (CRLF), — в отличие от блоба настроек элемента управления, где перенос голый LF.
Атрибуты внутреннего <picture> по корпусу ERP (10 130 записей):
| Вид | Сколько | Смысл |
|---|---|---|
| данные без атрибутов | 9 896 | картинка хранится в макете |
<picture/> |
151 | картинка не задана; ровно по одной такой записи на макет |
ref="v8ui:Имя" |
83 | ссылка на библиотеку картинок платформы |
tx, ty при данных |
9 | координата пикселя, чей цвет считается прозрачным |
Прозрачность записана двумя способами, и они исключают друг друга. Снятый флажок «прозрачный
фон» даёт t="false", поставленный — координату пикселя в tx/ty без атрибута t. Проверено
на стенде: одна и та же картинка 25×30 вставлена дважды, без флажка t="false", с флажком
tx="24" ty="29" — правый нижний пиксель. Координата именно пиксельная, а не размер картинки:
в корпусе встречается tx="97" ty="83" при картинке 368×117, то есть Конфигуратор углом
не ограничен.
Рисунки
Рисунок — объект поверх сетки: картинка, фигура, надпись, диаграмма. Лежит в <drawing>
перед палитрами; геометрия задана двумя якорями «ячейка + смещение в точках».
<drawing>
<drawingType>Picture</drawingType>
<id>3</id>
<zOrder>3</zOrder>
<beginRow>1</beginRow>
<beginColumn>1</beginColumn>
<beginRowOffset>0</beginRowOffset>
<beginColumnOffset>0</beginColumnOffset>
<endRow>3</endRow>
<endColumn>2</endColumn>
<endRowOffset>34</endRowOffset>
<endColumnOffset>115</endColumnOffset>
<formatIndex>4</formatIndex>
<pictureSize>Proportionally</pictureSize>
<pictureIndex>2</pictureIndex>
<detailParameter>Расшифровка</detailParameter>
</drawing>
Координаты строк и колонок здесь 0-based, в отличие от <i> ячейки. <id> и <zOrder>
самостоятельны: на корпусе они расходятся у 8 253 рисунков из 11 268, так что выводить их
из порядка следования нельзя. <pictureSize>Stretch</pictureSize> — умолчание, пишется всегда.
Имя рисунка хранится отдельно, среди именованных элементов:
<namedItem xsi:type="NamedItemDrawing">
<name>Логотип</name>
<drawingID>3</drawingID>
</namedItem>
Оформление рисунка — обычная запись палитры форматов, но с собственными тегами: drawingBorder
(ссылка в палитру линий, вид SpreadsheetDocumentDrawingLineType) и
drawingHaveLeftBorder / drawingHaveTopBorder / drawingHaveRightBorder /
drawingHaveBottomBorder. У ячейки таких свойств не бывает: все 2 135 записей корпуса с ними
принадлежат рисункам. Остальное в записи — общие свойства (заливка, шрифт, выравнивание).
Тело диаграмм (Chart, GanttChart) лежит в том же <drawing> в отдельном пространстве имён
и здесь не разбирается.
Типичная структура макета печатной формы
Печатная форма обычно состоит из именованных горизонтальных областей:
Заголовок — шапка документа (название, номер, дата)
Поставщик — реквизиты поставщика
Покупатель — реквизиты покупателя
ШапкаТаблицы — заголовок таблицы товаров
Строка — строка товара (выводится в цикле)
Итого — итоговая строка
СуммаПрописью — сумма прописью
Подписи — блок подписей
Каждая область — диапазон строк, получаемый через ПолучитьОбласть("Имя") и выводимый через Вывести().
Параметры в ячейках (<parameter>) заполняются программно:
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.НомерСтроки = НомерСтроки;
Область.Параметры.Товар = СтрокаТЧ.Номенклатура;
ТабДок.Вывести(Область);
Совместимость версий платформы
Проведено сравнение выгрузок конфигурации «Бухгалтерия предприятия 3.0» на версиях платформы 8.3.24, 8.3.25, 8.3.26, 8.3.27.
Template.xml (табличный документ)
Содержимое Template.xml побайтно идентично на всех четырёх выгрузках. Формат табличного документа стабилен — пространства имён, набор тегов и структура не менялись между 8.3.24 и 8.3.27.
Метаданные (version в MetaDataObject)
Атрибут version корневого элемента <MetaDataObject> в XML-файлах метаданных (.xml объектов, форм, макетов):
| Платформа | version |
|---|---|
| 8.3.24 | 2.17 |
| 8.3.25 | 2.18 |
| 8.3.26 | 2.19 |
| 8.3.27 | 2.20 |
| 8.5.1 | 2.21 |
Полная лестница, включая ступени ниже проверенного диапазона, — 1c-configuration-spec.md §7.1.
Form.xml (управляемая форма)
В пределах проверенного диапазона содержимое Form.xml различается только атрибутом version в корневом элементе <Form> (2.17 → 2.18 → 2.19 → 2.20 по платформам). Структура не менялась; в 2.21 добавилось пространство имён xmlns:pal.
BSL-модули
Модули на встроенном языке (ObjectModule.bsl) полностью идентичны на всех трёх версиях.
Обратная совместимость
Навыки генерируют XML с version="2.17". Сборка EPF через 1cv8.exe версии 8.3.27 проходит успешно — платформа принимает файлы с более старым номером версии без ошибок. Повышать version до "2.20" не требуется.