# Спецификация XML-формата табличного документа (SpreadsheetDocument) Формат файла `Template.xml` для макетов типа `SpreadsheetDocument` (табличный документ / MXL). ## Namespace ```xml ``` ## Структура документа Элементы внутри `` идут в фиксированном порядке: ``` — языковые настройки ... — наборы колонок (один или несколько) ... — строки с данными (повторяются) ... — рисунки (опционально, повторяются) true — признак макета — индекс формата по умолчанию — общее количество строк — видимых строк (обычно = height) ... — объединения ячеек (повторяются) ... — отмена объединений (опционально) ... — именованные области (повторяются) ... — стили линий (повторяются) ... — шрифты (опционально, повторяются) ... — форматы (повторяются) ... — ресурсы картинок (опционально) ``` ## Индексация Все палитры (линии, шрифты, форматы) — **плоские массивы**, на элементы которых ссылаются по индексу. | Палитра | Индексация | Индекс 0 означает | |-----------|------------|--------------------------------------| | `` | 0-based | Первый элемент `` | | `` | 0-based | Первый элемент `` | | ``| **1-based**| 0 = «формат по умолчанию» (не задан) | Формат с индексом N — это N-й элемент `` в документе (считая от 1). ## Языковые настройки ```xml ru ru ru Русский Русский ``` Языков бывает несколько, и объявленный набор НЕ выводится из того, на каких языках лежит текст ячеек: на корпусе ERP объявлен один `ru` у 10 753 макетов, при том что текст в них лежит и под `ru`, и под `en`. Наборы: `[ru]` — 10 753, `[ru,en]` — 148, `[en,ru]` — 20. `id` и `code` всегда со значением; `description` бывает пустым и тогда пишется самозакрывающимся тегом `` (77 записей из 11 094). Из `id` эти поля не выводятся: у `en` описание бывает «Английский», пустым и «English». `currentLanguage` иногда отсутствует вовсе (3 макета), иногда указывает на необъявленный язык (8 макетов с `en` при объявленном одном `ru`). `defaultLanguage` во всех четырёх русских типовых равен `ru`, но это свойство конфигурации, а не формата. ## Колонки ### Основной набор ```xml 33 1 1 ... ``` Перечисляются колонки, у которых есть собственный формат. Обычно это ширина (`` в палитре форматов), но формат колонки несёт и оформление: шрифт (3 006 форматов на корпусе), выравнивания, рамки, `hidden`. Два случая, которые легко упустить: - `0` — колонка перечислена, а формата у неё **нет** (ноль здесь не индекс записи). Встречается у 4% макетов; - индекс колонки бывает **больше или равен ``** — платформа описывает колонки за пределами объявленной ширины сетки (25% макетов). ### Дополнительные наборы колонок Некоторые строки документа могут использовать **собственную сетку колонок**, отличную от основной. Каждый дополнительный набор имеет UUID: ```xml f01e015f-de4c-4f97-9fbe-a244c4c30c6c 17 0 12 ... ``` - Первый `` — основной набор (без ``) - Дополнительные наборы — с `` (UUID), могут иметь другое количество и ширину колонок - Строки, merge и namedItem ссылаются на набор через `` Типичное применение: сложные печатные формы (УПД, УКД), где шапка/подвал/табличная часть имеют разную разбивку на колонки. ## Строки и ячейки ### Строка ```xml 3 5 f01e015f-... 5 true ... ``` - `` объединяет подряд идущие **пустые** строки. Одинаковые НЕпустые строки платформа не схлопывает никогда: на корпусе ERP (10 924 макета) схлопнутых непустых нет ни одной, несхлопнутых одинаковых непустых — 98 153; несхлопнутых одинаковых пустых — тоже ни одной - `` привязывает строку к дополнительному набору колонок. Без него — используется основной набор - `` строки несёт не только высоту: в корпусе там `hidden` (17 423 вхождения), `font` (9 216), `backColor`, выравнивания, `protection`, рамки ### Ячейка Ячейки внутри `` — элементы `` (cell group), каждый содержит `` (cell content): ```xml 6 9 Имя Расш ru Итого: ``` **Правила позиционирования ``:** - Если `` указан — ячейка в этой колонке - Если `` не указан — колонка = предыдущая + 1 - Первая ячейка без `` идёт в колонку 0 Платформа пишет `` **только при разрыве последовательности**: у подряд идущей ячейки его нет. На корпусе ERP из 1 212 023 записанных номеров ни один не избыточен (счётчик начинается с −1, поэтому у ячейки в колонке 0 номера тоже нет). У текста ячейки ТРИ состояния, а не два: | запись | смысл | |---|---| | `` отсутствует | текста нет | | `` с элементами | текст по элементу на язык (содержимое бывает пустым) | | `` | тег есть, языков в нём нет | Третье — не редкость: 38 075 ячеек на 1200 макетов, встречается в 57% макетов корпуса. `0` означает, что формата у ячейки **нет вовсе** — это не индекс записи. Так записана ячейка без собственного оформления: 170 710 таких ячеек против 50 635, ссылающихся на формат по умолчанию; `0` встречается в 71% макетов. ### Типы заполнения ячеек Тип заполнения определяется свойством `fillType` в формате ячейки: | fillType | Данные ячейки | Описание | |-------------|-------------------------------|----------------------------------------| | `Parameter` | `Имя` | Значение подставляется программно | | `Template` | `Текст [Параметр]` | Шаблон — `[Имя]` заменяется на значение | | `Text` | `Текст` | Статический текст | | *(нет)* | — | Пустая ячейка или ячейка с форматированием | `` — имя параметра расшифровки (для навигации при клике на ячейку). ## Рисунки ```xml Picture 1 11 3 6 4 33 2 0 4 183 false Proportionally 1 1 ``` Позиция задаётся через начальную/конечную строку и колонку + смещения в пикселях. `pictureIndex` ссылается на ресурс из палитры ``. ## Объединения ячеек ```xml 3 1 1 30 f01e015f-... ``` Размер объединения: `(h + 1)` строк × `(w + 1)` колонок. Если `` не указан — объединение в пределах одной строки. `-1` — объединение действует для всех строк, использующих данный набор колонок (аналог объединения колонок на уровне всего документа). ### Отмена объединений `` отменяет вертикальное объединение для конкретной строки: ```xml 10 7 12 ``` Используется в сложных макетах, когда глобальное объединение колонок (`-1`) нужно разорвать в отдельных строках. ## Именованные области Именованные области — аналог «имён» в табличном документе 1С. Используются для программного вывода секций. Получение области: ```bsl // Горизонтальная область (диапазон строк) Область = Макет.ПолучитьОбласть("Заголовок"); // Пересечение горизонтальной и вертикальной областей Область = Макет.ПолучитьОбласть("ВысотаЭтикетки|ШиринаЭтикетки"); ``` Пересечение через `|` типично для этикеток и ценников, где нужна область фиксированного размера (высота × ширина). ### Тип Rows — горизонтальная область ```xml Заголовок Rows 1 4 -1 -1 ``` **Порядок элементов `namedItem` — по имени.** Платформа хранит их отсортированными, регистронезависимо: на выборке 541 макета ERP 8.3.24 с несколькими именованными элементами иного порядка не встретилось ни разу. Сортировка ординальная (латиница раньше кириллицы); случай с «ё» в выборке не встретился и не проверен. ### Тип Columns — вертикальная область ```xml ШиринаЭтикетки Columns -1 -1 1 5 ``` ### Тип Rectangle — прямоугольная область Область, ограниченная и по строкам, и по колонкам. Используется с дополнительными наборами колонок: ```xml ОбластьЗаписьДо Rectangle 22 22 5 17 c6cb0794-... ``` ### Привязка к набору колонок Именованные области могут ссылаться на дополнительный набор колонок через ``: ```xml НумерацияЛистов Rows 59 59 -1 -1 0adf41ed-... ``` ### Тип Drawing — именованный рисунок ```xml Штрихкод 1 ``` ## Стили линий Палитра линий для границ ячеек и рисунков. Индексация 0-based. ```xml Solid None ``` | xsi:type | Значения | |-------------------------------------------|----------| | `v8ui:SpreadsheetDocumentCellLineType` | `Solid`, `None`, `Dotted`, `ThinDashed`, `LargeDashed`, `ThickDashed`, `Double` | | `v8ui:SpreadsheetDocumentDrawingLineType` | те же | Атрибут `width` — толщина линии; в корпусе встречаются 0, 1, 2, 3. Атрибут `gap` на корпусе всегда `false`, но пишется всегда. ## Шрифты Палитра шрифтов. Индексация 0-based. ```xml ``` `kind` выводится из префикса ссылки: `style:` → `StyleItem`, `sys:` → `WindowsFont`. На корпусе ERP таких шрифтов 272 в 213 макетах из 10 924 (StyleItem 209, WindowsFont 63). Шрифт, на который не ссылается ни один формат, в палитру не попадает: у макета без оформления элемента `` нет вовсе. ## Устройство палитр Три правила, общие для всех палитр. Все проверены на корпусе ERP (10 924 макета) и на макетах, собранных вручную в Конфигураторе. **Порядок — документный.** Записи идут в том порядке, в каком встречаются при обходе документа сверху вниз: сначала форматы колонок (в порядке колонок), затем форматы строк и ячеек. Порядок НЕ зависит от того, в какой последовательности автор оформлял макет: контрольный опыт с оформлением снизу вверх дал палитру в порядке строк. **Формат по умолчанию — последняя запись.** На корпусе он последний в 8285 макетах из 10 863, первым — в 25. **Палитра форматов дедуплицирована по содержимому:** двух одинаковых записей в ней нет (10 804 макета из 10 924). Остальные 120 — накопленный мусор редактирования, там доходит до 583 записей при 130 уникальных. ## Форматы Палитра форматов — центральный элемент. **Индексация 1-based** (индекс 0 = формат не задан). ```xml 0 0 1 0 1 24 84 Center Center Wrap Parameter ru ЧЦ=15; ЧДЦ=2 1 ``` Все свойства опциональны. Формат может содержать только `` (для колонки) или только `` (для строки). ### Порядок тегов Внутри `` теги идут в строгой последовательности — от неё зависит побайтовое совпадение с выгрузкой. Порядок снят с корпуса 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. ### Рамка Четыре стороны и свёрнутый `` взаимоисключающи. Если все четыре стороны одинаковы, платформа пишет один ``; иначе — по сторонам. На корпусе: 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 | Корень `` объявляет только `style`, поэтому для web- и windows-палитр платформа дописывает объявление прямо на узел. Префикс всегда `d3p1` (1264 вхождения на корпусе без отклонений). В Form.xml те же цвета выглядят как `web:Имя` и `win:Имя` — там эти префиксы объявлены в корне. ### Связь формата с контекстом Один формат обслуживает всех: колонка, строка и ячейка ссылаются в одну палитру, и набор свойств у них общий (`hidden` встречается у ячеек 30 175 раз, у строк 17 423, у колонок 57; `protection` — 84 442 / 1 492 / 1 017). | Контекст | Ссылка | Свойства, специфичные для контекста | |------------------|------------------------|-------------------------------------| | Колонка | `` | `width` | | Строка | `` | `height`, `hidden` | | Ячейка | `` | `fillType`, `containsValue` | | Рисунок | `` | `drawingBorder`, `drawing*` | | По умолчанию | `` | `width` | Оформление, применённое к строке целиком, платформа записывает И в формат строки, И в формат каждой ячейки (`backColor`: 13 899 ячеек повторяют против 96). Исключение — `hidden`: оно остаётся только у строки (24 026 против 62 856). ### Ячейка-поле ввода: `containsValue` / `valueType` / `controlType` Ячейка может содержать не текст, а редактируемое значение. Три тега формата описывают это целиком: ```xml true xs:decimal 15 3 Nonnegative 381ed624-9217-4e63-85db-c4c3cb87daae ``` Свойство принадлежит ЯЧЕЙКЕ, хотя и живёт в общей палитре: из 370 197 ссылок на такие записи (корпус ERP, 5 809 макетов из 10 924) все до одной идут из `` — ни строка, ни колонка, ни `` на них не ссылаются ни разу. | Наблюдение | Данные корпуса | |---|---| | `containsValue` всегда `true` | 63 726 форматов, других значений нет | | `valueType` присутствует всегда | 0 форматов без него; 12 — с ПУСТЫМ `` (тип не ограничен) | | текста у такой ячейки не бывает | 0 из 370 197 несут `` | | `` и `` — бывают | 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 макета регламентированной отчётности, явно машинно-сгенерированных) тега `` нет вовсе. Флажок Конфигуратор предлагает **только для Булево и Числа**. Ограничение при этом чисто интерфейсное: макет с флажком у строки и у даты платформа принимает и возвращает GUID дословно (проверено сборкой EPF и обратной выгрузкой через базу — ни отказа, ни нормализации). **Структура ``** — то же описание типов, что в метаданных: сначала все `` и `` в порядке источника, затем блоки квалификаторов в порядке Number → String → Date. Голая категория без имени объекта (`CatalogRef`, `AnyRef`) — это ``, а не ``. Ссылочные типы несут **локальное объявление пространства имён на каждом узле**: ```xml d4p1:CatalogRef.Валюты ``` Префикс всегда `d4p1` (15 вхождений на корпусе, отклонений нет) — независимо от того, есть ли в макете цвета web-палитры, которым платформа даёт `d3p1`. Корень `` пространство current-config не объявляет, поэтому вынести объявление наверх нельзя. **Продолжение конструкции — на уровне САМОЙ ячейки**, а не палитры: ```xml 34 0 77u/MiwxLDM4MWVkNjI0… ``` | Тег ячейки | Смысл | Вхождений | Макетов | |---|---|---:|---:| | `` | сохранённое значение ячейки; `xsi:type` соответствует объявленному типу (decimal 153 566, string 61 203, dateTime 3 333, boolean 1 012) | 219 114 | 4 578 | | `` | сериализованные настройки элемента управления (base64; внутри — тот же GUID и структура вида маски/списка выбора) | 26 370 | 1 246 | Оба тега встречаются ИСКЛЮЧИТЕЛЬНО в ячейках, чей формат несёт `containsValue` — ни одного вхождения в обычной ячейке. То есть это вторая половина той же конструкции, а не отдельное свойство. Обрати внимание на совпадение имён: `` у ячейки и `` в формате — разные вещи. **Ловушка: `width` в формате ЯЧЕЙКИ не описывает ячейку.** Ссылка ячейки на запись палитры не обновляется при изменении ширины колонки, поэтому там остаётся ширина от прежнего состояния документа. Проверено на контролируемом стенде: в макете, где ширины колонок поменяли на обратные, ячейки продолжают ссылаться на записи со старыми ширинами. Из итогового XML это значение не выводится — воспроизводить его не нужно. ## Колонтитулы и параметры печати ```xml 2 ruСлева 100015 ``` Шесть элементов идут после строк и перед ``: `leftHeader`, `centerHeader`, `rightHeader`, `leftFooter`, `centerFooter`, `rightFooter`. Пишутся не комплектом: `leftHeader` есть у 1 013 макетов, остальные — у 677–790. | Наблюдение | Данные корпуса | |---|---| | текст слота | `` — обычная строка, `` — форматированная (разметка внутри содержимого: `…`, ``, ``) | | формат слота | `` = признак вывода (`1` / `-1`), `` = страница, с которой печатать, плюс шрифт и `verticalAlignment` | | формат общий на колонтитул | у 674 макетов из 677; разный у трёх | | формат делится с другими владельцами | 637 против 153 «только колонтитулы» — палитра дедуплицирована, поэтому `` в чужой записи означает ширину колонки, а не страницу | **Ловушка:** перенос строки внутри текста колонтитула платформа хранит голым 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`. Номер первой страницы принадлежит именно параметрам печати, а не колонтитулу. ## Группы строк и колонок ```xml 2 8 1 2 ruИтоговая false Begin ``` Строки группируются часто (1 797 макетов, 170 967 групп), колонки — почти никогда (1 макет, 1 группировка). Порядок документных тегов: `height` → `vgLevels` → `vgRows` → `vg` → `hg`; `vgLevels` пишется только при наличии группировок. | Наблюдение | Данные корпуса | |---|---| | диапазоны либо вложены, либо не пересекаются | 40 620 886 пар непересекающихся, 599 958 вложенных, **0 частичных** | | порядок записи — родитель раньше вложенных, по возрастанию начала | совпало у 1 798 макетов из 1 798 | | `` = глубина вложенности | совпало у 1 797 из 1 797 | | `` | только `false` (6 130) — развёрнутая группировка тег не пишет | | `` | в корпусе только `Begin` (6); значение `End` даёт Конфигуратор при «Расположение заголовка: Конец» | Имя (``) — мультиязычная строка, и в 143 455 случаях это автоимя `R<номер строки + 1>`. Вывести его нельзя: 16 666 имён «протухли» (`R91` у строки 103 — строки вставляли после создания группировки), а 10 287 группировок имени не имеют вовсе. Языковые наборы — `ru`+`en` (93 250) либо псевдоязык `#` (67 431), никогда вместе. ## Примечание к ячейке ```xml Comment 0 1 ruтест 1 -21 0 51 1 21 0 408 true Stretch ``` Конструкция редкая (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`. ## Ресурсы картинок ```xml 0 ``` ## Типичная структура макета печатной формы Печатная форма обычно состоит из именованных горизонтальных областей: ``` Заголовок — шапка документа (название, номер, дата) Поставщик — реквизиты поставщика Покупатель — реквизиты покупателя ШапкаТаблицы — заголовок таблицы товаров Строка — строка товара (выводится в цикле) Итого — итоговая строка СуммаПрописью — сумма прописью Подписи — блок подписей ``` Каждая область — диапазон строк, получаемый через `ПолучитьОбласть("Имя")` и выводимый через `Вывести()`. Параметры в ячейках (``) заполняются программно: ```bsl Область = Макет.ПолучитьОбласть("Строка"); Область.Параметры.НомерСтроки = НомерСтроки; Область.Параметры.Товар = СтрокаТЧ.Номенклатура; ТабДок.Вывести(Область); ``` ## Совместимость версий платформы Проведено сравнение выгрузок конфигурации «Бухгалтерия предприятия 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` корневого элемента `` в 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](1c-configuration-spec.md#71-лестница-версий). ### Form.xml (управляемая форма) В пределах проверенного диапазона содержимое `Form.xml` различается **только** атрибутом `version` в корневом элементе `
` (`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"` не требуется.