305 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
search:
boost: 2
---
# Настройка документов
## Общее описание назначения документа
Документы реестра "Настройка документов" предназначены для настройки возможностей и особенностей работы с различными типами документов. В частности, настраиваются доступные пользователям операции при создании маршрута и при перемещении по маршруту.
Документ находится в основном меню в группе "Администрирование", подгруппе "Документооборот". Для доступа к документу нужны права администратора.
## Реестр
Для открытия документа необходимо в Меню в поисковой строке ввести - "Настройка документов". Для доступа к документу нужны права администратора.
Откроется реестр настроенных типов документов.
![Рисунок 2 Реестр "Настройка документов"](./media/registry.png)
Для создания нового документа необходимо нажать на кнопку "Создать" на верхней панели инструментов
![](./media/create.png)
## Документ
Настройки для документа "Настройка документов" выглядят следующим образом:
![alt text](<media/2024-09-26 16 20 15.png>)
Для некоторых полей названия объединены, соответствующие им ячейки идут в том же порядке, что и их названия: поля "Форма" и "Наименование" в "Форма\Наименование", поля "Схема" и "Таблица" в "Схема\таблица". Обязательными полями для заполнения являются:
- Тип документа ключевое слово, соответствующее типу документа, обычно формируется по правилу *"имя формы" без "Form"*;
- Форма служебное название формы, обычно содержится в адресной строке при открытии вкладки с формой документа и формируется по правилу *"Тип документа" + "Form"*;
- Наименование пользовательское название формы, принятое для употребления пользователями системы.
Также на форме содержатся поля "Схема" и "Таблица", которое должно содержать название соответствующей документу таблицы в базе данных.
В [таблице в конце статьи](#таблица) приведены возможные значения этих полей.
### Вкладка "Маршрут документооборота"
Вкладка "Маршрут документооборота" разделена на две части: первая содержит логические переменные (опции), вторая содержит таблицу со списком разрешенных действий с документом.
#### Опции
- **Правит любой участник** редактировать редактировать содержимое таких документов как: входящие документы, исходящие документы, ОРД, Поручение, служебная записка, заявки в техническую поддержку, служебная записка для договора, договоров и дополнительных документов к договору, может любой участник маршрута, имеющий статус "Текущий";
- **Разрешено отклонение** участники маршрута, имеющие статус "Текущий", могут отклонить документ и отправить его на доработку инициатором;
- **Разрешен отзыв** инициатор маршрута может отозвать документ на любом этапе маршрута для доработки, пока маршрут по документу не завершен;
- **Полностью повторять маршрут при отклонении** после отклонения документа маршрут перестроится следующим образом: документ отзывается с согласования у других участников и возвращается к инициатору, завершённые и назначенные этапы маршрута добавятся в конец маршрута со статусом "Ожидание";
- **Полностью повторять маршрут при отзыве** после отзыва документа инициатором маршрут перестроится следующим образом: документ отзывается с согласования у других участников и возвращается к инициатору, завершённые и назначенные этапы маршрута добавятся в конец маршрута со статусом "Ожидание";
- **Разрешено "горячее редактирование" без отзыва** участник, обладающий специальной ролью, может в любой момент времени (при любом статусе в маршруте) откорректировать маршрут документа;
- **Разрешено редактирование сроков обработки в маршруте** - участник, обладающий специальной ролью, может редактировать сроки обработки документов для последующих согласовантов в окне маршрута. Необходима константа [**маршрут_подтип_редактировать_срок_роли**](../Настройка констант/#система_электронного_и_кадровогоокументооборота).
- **Оповещать инициатора о завершении маршрута** присылать инициатору уведомление на почту о завершении маршрута согласования документа;
- **Оповещать инициатора о каждом действии** - присылать инициатору уведомление на почту после каждого действия с документом по маршруту согласования;
- **В оповещениях отображать весь список участников** перечислять в уведомлениях на почту список участников маршрута для таких документов как: входящие документы, исходящие документы, ОРД, Поручение, служебная записка, заявки в техническую поддержку, служебная записка для договора, договоров и дополнительных документов к договору;
- **Отображать кнопку Делег в маршруте** возможность делегировать выполнение действия по маршруту другому пользователю;
- **Отображать кнопку Делег 2х в маршруте** возможность делегировать с контролем выполнение действия по маршруту другому пользователю;
- **Отмена сразу** используется в *Поручениях*, при отправке документа инициатору на доработку, документ не задерживается у отклоняющего для корректировки маршрута после отмены;
- **Постановка на контроль после отправки** после отправки документа далее по маршруту в разделе "Контроль" окна "Документооборот" отслеживается маршрут обработанного документа;
- **Закрывать документ автоматически после отправки по маршруту** вместо появления диалогового окна с предложением закрыть документ, после отправки документа по маршруту он закрывается автоматически;
- **Отображать код в наименовании документа** в заголовке маршрута к наименованию документа в скобках добавляется код документа, указанный в поле "Код" в реестре и используемый в адресной строке;
- **Комментировать вложения при согласовании** подключение сервиса, который при отправке документа по маршруту показывает вложения из "Вложения" в окне для ввода комментариев, причём позволяет дать комментарий как к действию в целом, так и по каждому вложению;
- **ЭП в списках рассылки** ознакомление с документом происходит с использованием электронной подписи (ЭП);
- **Форма построена на конструкторе документов** включает форму в список типов документа, для которых может создаваться конструктор документов;
- **Кол-во дней на ознакомление в списках рассылки** - указывается количество дней для ознакомления с документами, полученными через рассылку. Если поле не заполнено - по умолчанию 2 дня;
- **Разрешено к массовой обработке** - разрешено [массово обработать документы](https://ecm-user-manuals.readthedocs.io/ru/latest/User manuals/Подписание сертификатом/#массовая_обработкаокументов);
- **Разрешено к массовой обработке на 1-м этапе** - разрешено [массово обработать документы](https://ecm-user-manuals.readthedocs.io/ru/latest/User manuals/Подписание сертификатом/#массовая_обработкаокументов), в которых пользователь находится на 1-м этапе в маршруте, например документы на подписание;
- **Скрыть "Лист согласования"** - скрывает кнопку "Лист согласования" в панели инструментов в документах;
- **Показывать в мобильном приложении** - включает отображение типа документа в [истории операции в мобильном приложении](https://ecm-user-manuals.readthedocs.io/ru/latest/User manuals/Общие принципы работы с приложением/#история).
#### Настройка допустимых действий
В правой части вкладки "Маршрут документооборота" содержится таблица со списком возможных действий, которые можно совершить при отправке документа по маршруту.
![Рисунок 4 Пример списка разрешенных действий с документом](./media/actionsExample.png)
Столбец **"Действие с документом"** соответствует столбцу **"Совершить действие"** в маршруте документа. Столбец **"Статус документа"** соответствует столбцу **"Статус документа"** в маршруте документа. Столбец **"Направление движения документа"** определяет направление, в котором будет отправлен документ после обработки. Имеется три направления:
1. **Документ отправится далее по маршруту** - после подписания документ направляется далее по маршруту согласования;
2. **Документ сразу вернется инициатору** - документ направляется инициатору в случае не согласования. Маршрут согласования в этом случае повторяется.
3. **Документ вернется только инициатору** - документ направляется инициатору в случае не согласования документа по маршруту. Маршрут согласования в этом случае не повторяется.
4. **Документ вернется инициатору и всем несогласным** - документ направляется инициатору и всем несогласным в случае не согласования документа по маршруту.
5. **Ошибочно направлено. Документ вернется только инициатору** - документ направляется инициатору в случае не согласования документа по маршруту, по причине что документ был ошибочно направлен пользователю на согласование. Маршрут согласования в этом случае не повторяется.
6. **Построить новую итерацию из шаблона маршрута** - документ направляется инициатору в случае не согласования. Маршрут согласования в этом случае повторяется из шаблона маршрута.
Ко всем типам документов действие должно быть выбрано "Далее".
По умолчанию для каждого вида документа должен быть выбран один вид действия. Это необходимо для массовой обработки документов, подробнее можно почитать в статье [Массовая обработка документов](https://ecm-user-manuals.readthedocs.io/ru/latest/User manuals/Подписание сертификатом/#массовая_обработкаокументов).
Для каждого статуса документа можно определить, что будет происходить с маршрутом после выбора соответствующего статуса. Кроме отправки документа далее по маршруту также возможен, например, отзыв документа.
![Рисунок 5 Список действий с элементом этапа](./media/stageActions.png)
С помощью столбца **"Особая метка"** можно отмечать выполненные действия в маршруте документа с помощью выделения строки определенным цветом и использования специальных иконок. Доступны метки "Желтый флаг" и "Красный флаг". Желтый флаг может сигнализировать о выполнении действия с замечаниями (например, "Согласовано с замечаниями"). Красный флаг может сигнализировать об отказе подписать документ.
![Рисунок 6 Пример подсветки действий в маршруте](./media/flagsDemo.png)
С помощью столбца **"Порядок"** можно определять порядок отображения допустимых действий в панели инструментов внутри документов. Например, если у действия "Подписать ЭП" установлен порядок равный 1, значит это действие будет на первом месте в панели инструментов.
С помощью столбца **Отрицательный статус** можно отмечать, имеет ли выбранное допустимое действие отрицательный статус. _Отрицательный статус у электронного документа_ - это отметка, которое указывает на то, что электронный документ не может быть принят или обработан по каким-либо причинам. Это может произойти, если документ содержит ошибки в формате или не соответствует требованиям, установленным для конкретного типа документа.
С помощью столбца **"Присвоить номер"** определяется после какого действия с документом в нем будет проставляться номер. Данная настройка работает на служебных записках, исходящих документах, организационно-распорядительных документах.
С помощью столбца **Уведомление инициатору** определяется какой вид [уведомления](../Конструктор уведомлений/#вид_уведомления_уведомления_инициатора_о_работе_сокументом) будет направлен инициатору. Должна быть включена галка **Оповещать инициатора о каждом действии**.
С помощью столбца **О завершении маршрута** возможно задать вид [уведомления](../Конструктор уведомлений/#вид_уведомления_оавершении_маршрута) о завершении маршрута согласования для инициатора документа. Заданный вид уведомления назначается один раз (заполняется в одной строке с любым действием). Должна быть включена галка **Оповещать инициатора о завершении маршрута**.
!!! note "Примечание"
Для некоторых действий с документом в системе необходимо заполнить обязательный комментарий при отправке далее по маршруте:
**Исполнен, Исполнен Отв., Согл. с замечаниями, Ошибочно направлено, Рассмотрено, Не согласовано, Отказ ЭП, далее, Отказ ЭП, аннулирован, Отказ КЭП, далее, Отказ КЭП, аннулирован, Отклонен, Отказ от ознакомления, Отказ от ознакомления ЭП, Отправлен на доработку, На этап назад, На два этапа назад, На три этапа назад.**
### Вкладка "Допустимые статусы по подтипам"
На этой вкладке отображаются [допустимые статусы по подтипам документов](../Подтипы документов/#вкладкаастройки). Если для данного типа документов отсутствуют статусы по подтипам, то вкладка автоматически скрывается.
![alt text](media/image.png)
### Вкладка "Сервисы документооборота"
На этой вкладке можно настроить отслеживание данных в документе для соответственной корректировки его наименования и работу механизма отображения опосредованных связок.
![Вкладка](media/serviceDoc.png)
Опция **Отслеживать изменение наименования сервисом DocflowWatcher** используется для отслеживания изменений в реквизитах документа для изменения его наименования и темы в разделе "Документооборот" в соответствии с его реквизитами. Если опция не включена, наименование и/или тема документа в разделе "Документооборот" изменятся только после сохранения **и** отправки документа далее по маршруту. Если опция включена, то наименование и/или тема документов меняются после сохранения документа, не дожидаясь отправки далее по маршруту.
![Рисунок 7 Раздел "Документооборот"](./media/docflow.png)
По нажатию на кнопку "Связки", доступную из формы документа, открывается вложенная форма "Связки с документами системы", в которой содержится таблица "Связанные документы". Без включения опции **Использовать механизм отображения опосредованных связок** в ней отображаются только документы, напрямую связанные с текущим.
![Рисунок 8 До включения опции](./media/beforeUseMechanism.png)
При помощи опции **Использовать механизм отображения опосредованных связок** можно включить возможность просмотра документов, не связанных напрямую с текущим. На форме "Связки с документами системы" появится опция **Опосредованные связки**, включающая отображение в таблице "Связанные документы" опосредованно связанных с текущим документов, и числовое поле **итераций**, задающая глубину связи.
![Рисунок 9 После включения опции](./media/afterUseMechanism.png)
Если опция **Отображать опосредованные связки по умолчанию** включена, то при нажатии на кнопку "Связки" опция **Опосредованные связки** будет уже автоматически включена.
![Рисунок 10 После включения опции](./media/afterShowByDefault.png)
В поле **Количество итераций по умолчанию при расчете опосредованных связок** можно указать количество итераций по умолчанию. При просмотре связанных документов поле **итераций** будет заполнено выбранным числом, но всё ещё будет изменяемым.
![Рисунок 11 После задания итераций](./media/afterIterByDefault.png)
### Вкладка "Поисковая система"
На этой вкладке происходит подключение документов определенного типа к системе контекстного поиска документов. Более подробно про взаимодействие пользователей с контекстным поиском можно прочесть в разделе [Контекстный поиск](https://ecm-user-manuals.readthedocs.io/ru/latest/User manuals/Контекстный поиск/).
Для идентификации подключаемого документа поисковой системой в настроечном документе ему необходимо присвоить тип, указать наименование и ключ формы. Дальнейшая настройка производится на закладке "Поисковая система". Здесь и далее на примере документа "Входящее письмо".
![Рисунок 12 Итоговый вариант заполнения вкладки](./media/FTSTabFilled.png)
#### Настройка полнотекстовых индексов
Сначала необходимо добавить в таблицу "Таблицы" новую строку с помощью кнопки "Добавить". В столбце *Таблица* необходимо указать наименование базовой таблицы модели документа ```dbo.DocflowDocument```. Наименование должно содержать имя схемы. Использование квадратных скобок для обрамления сущностей не допускается. Имена схем в СУБД SQL Server отличаются от имен в СУБД PostgreSQL. В столбце *IndexedFields* необходимо выбрать из выпадающего списка поля таблицы, для которых необходимо настроить полнотекстовые индексы. В списке представлены все символьные поля целевой таблицы за исключением служебных (```TypeName```, ```CUser```, ```WUser```, ```CHost```, ```WHost```).
![Рисунок 13 Заполнение IndexedFields](./media/IndexedFieldsFilled.png)
После этого необходимо сохранить документ и в базе данных (БД) вручную запустить на исполнение процедуру *ManageFullTextIndexes* (экспортируется библиотекой ```ecosoft-lexema8-CommonDocuments```).
``` sql
exec dbo.ManageFullTextIndexes
```
В результате выполнения этой процедуры в базе данных будут созданы все необходимые объекты (полнотекстовый каталог, стоп-лист и заявленные полнотекстовые индексы).
!!! warning
Эту операцию необходимо будет выполнять каждый раз после изменения конфигурации системы поиска (например, при подключении нового документа или при изменении набора символьных полей в существующей настройке).
#### Скрипт связки результатов полнотекстового поиска с документами
Для поиска система использует запрос ```CONTAINSTABLE```, который возвращает только ключ записи в таблице со значениями полей, удовлетворяющих заданным критериям без привязки к конкретному типу документа. Выглядит это примерно так:
``` sql
-- insert into #ftResult ([KEY], [TableName], [ColumnName], [RANK])
select b.[KEY], b.[TableName], b.[ColumnName], b.[RANK] from
(
select ID=row_number() over (partition by a.[TableName], a.[KEY] order by a.[Rank] DESC), a.*
from
(
select [TableName] = 'dbo.DocflowDocument', [ColumnName] = 'Subject', [KEY], [RANK] from CONTAINSTABLE(dbo.DocflowDocument, [Subject],' ( "светильник *" ) OR ( FORMSOF (INFLECTIONAL, светильник) ) ')
union all
select [TableName] = 'dbo.DocflowDocument', [ColumnName] = 'Text', [KEY], [RANK] from CONTAINSTABLE(dbo.DocflowDocument, [Text],' ( "светильник *" ) OR ( FORMSOF (INFLECTIONAL, светильник) ) ')
) as a
) as b
where b.ID = 1
```
![Рисунок 14 Пример результата выполнения скрипта](./media/scriptres1.png)
Поэтому системе необходим специальный скрипт, который связал бы результат поиска с документами. Он вводится в поле ```SelectQuery``` следующим образом:
```sql
select [KEY] = VCode, DocCode = VCode, DocType = TypeName from dbo.DocflowDocument
```
![Рисунок 15 Заполнение SelectQuery](./media/SelectQueryFilled.png)
Скрипт должен возвращать три ```NOT NULL```-поля:
- ```KEY``` ключ для связки с выборкой;
- ```DocCode``` код документа;
- ```DocType``` тип документа.
В примере рассматривается случай, когда тип документа хранится в специально выделенном для этого поле ```TypeName``` таблицы. Если такого поля нет (т.е. на таблице построен только один документ) тип в свойство ```DocType``` необходимо передать константой
```sql
select [KEY] = VCode, DocCode = VCode, DocType = 'TestDoc' from dbo.TestDoc
```
Сама связка внутри системы выглядит примерно так:
![Рисунок 16 Пример результата выполнения скрипта](./media/scriptres2.png)
#### Скрипт на выборку результирующего набора данных
Задается в правой части настроечного документа. Осуществляет сбор результатов поиска, дополняя ее необходимыми свойствами для отображения на форме и применяя к ней заданные аналитические фильтры. Также на него возлагается отсечка документов, удовлетворяющих заданным критериям поиска, но на которые запрашивающий пользователь не имеет прав просмотра. Скрипт должен иметь *строго определенную структуру*, возвращая шесть полей в следующем порядке:
* ```DocCode``` код документа;
* ```DocType``` тип документа;
* ```DocName``` наименование документа;
* ```DocTheme``` тема документа;
* ```DocDefinition``` описание документа;
* ```CanSee``` флаг, отвечающий за возможность отображения данного документа на форме.
![Рисунок 17 Пример результата выполнения поиска](./media/searchResStructure.png)
Пример типового скрипта:
```sql
select
DocCode = t.VCode
, DocType = t.TypeName
, DocName = 'Входящий документ №' + case when isnull(t.DocumentNumber, '') = '' then '...' else t.DocumentNumber end
+ case when t.DocumentDate is null then '' else ' от ' + convert(varchar(10), t.DocumentDate, 104) end
, DocTheme = isnull(t.[Subject], '')
, DocDefinition = isnull(t.[Text], '')
, CanSee = 1
from dbo.DocflowDocument as t
where %WhereMacro
```
![Рисунок 18 Расположение скрипта](./media/scriptExample.png)
Особенности написания:
* Базовая таблица модели документа должна присутствовать явно или неявно (как в примере: внутри представления ```dbo.VDocflowDocumentReg```) и иметь псевдоним "**t**", т.к. все инструкции аналитических фильтров будут обращаться к ней именно по этому псевдониму.
* Должна присутствовать инструкция ```where``` и содержать только метку ```%WhereMacro```, которая будет заменяться системой на инструкции аналитических фильтров.
* Если в таблице не выделено поле для хранения типов, свойство ```DocType``` описывается константой, например ```DocType = 'TestDoc'```.
* Если для документа не предполагается иметь тему или описание, соответствующим свойствам необходимо присвоить значение ```NULL``` (например, ```DocDefinition = NULL```).
* Если документ подключен к СЭД, инструкция по формированию наименования документа (свойство ```DocName```) **должна быть синхронизирована** с логикой соответствующей js-функции документооборота ```getReadableName```. Эта инструкция будет применяться только для тех документов, к которым не нашелся текущий маршрут согласования. Если маршрут есть наименование берется оттуда.
* Флаг ```CanSee``` должен возвращать значение, действительно отражающее наличие или отсутствие прав у пользователя на просмотр данного документа, т.к. ответственность за показ пользователю не предназначенной ему конфиденциальной информации может быть возложена на прикладника, осуществлявшего настройку (в примере флаг выставлен в "**1**" потому что все возможные проверки уже сделаны в представлении ```dbo.VDocflowDocumentReg```, она является реестровым представлением документа).
#### Завершение настройки
* Опции ```FTS2``` и ```Итоги``` позволяют включить документ в поиск в аналитической форме "Архив вложенных документов".
* Указать значение свойства ```typeNameProperty``` модели документа (если есть). Оно будет использоваться для фильтрации документов, если при вызове поискового запроса был назначен аналитический фильтр по разделам (типам документов).
* Указать значение свойства ```dateProperty``` модели документа (если есть). Оно будет использоваться для фильтрации документов, если при вызове поискового запроса был назначен аналитический фильтр по расчетному периоду.
* Аналогично с остальными свойствами.
Осталось поставить галочку в поле "Настроен" и сохранить документ.
![Рисунок 19 Пример заполнения полей](./media/lastFieldsFilled.png)
#### Дополнительная аналитика в критериях поиска
Выше была рассмотрена возможность поиска по символьным реквизитам документа и реквизитам его маршрута согласования. Однако на проектах часто возникает необходимость поиска по специфическим справочным свойствам документа, которые представлены в базовой таблице полем типа ``bigint``, а в шаблоне формы элементом управления ```Lookup``` (список). Например, необходимо найти все входящие письма, в которых фигурирует контрагент (отправитель) "ПАО Мегафон" с возможностью поиска как с настройкой аналитического фильтра (отметить галочкой необходимую организацию в специальном поле ввода в *Настройке расширенных параметров поиска*), так и непосредственным указанием фрагмента наименования организации или её ИНН в окне поискового запроса. Оба этих способа реализуемы.
Для поиска по ИНН необходимо, чтобы контекстный поиск искал словоформы в подчиненных базовой таблицах. Реализуется введением в настройку документа обработки скрипта связки справочной таблицы с документом. На практике это выглядит так:
![Рисунок 20 Вторая строка с контрагентом](./media/FTSContractorAdded.png)
Т.е. в настройку добавляется строка для обработки таблицы ```dbo.Contractor``` с индексированными полями ```INN``` и ```Name``` (после сохранения настройки необходимо выполнить синхронизацию ```exec dbo.ManageFullTextIndexes```). Запрос на первоначальную выборку будет выглядеть следующим образом:
```sql
select [KEY] = c.VCode, DocCode = t.VCode, DocType = t.TypeName
from dbo.Contractor as c
inner join dbo.DocflowDocument as t on t.Contractor = c.VCode
```
Чтобы осуществлять поиск по наименованию контрагента при помощи выбора контрагентов из списка, необходимо заполнить "поле Контрагент" наименованием соответствующего поля в таблице ```dbo.DocflowDocument```:
![Рисунок 21 Скрипт и поле Контрагент](./media/lastFieldsFilledWithContractor.png)
### Набор возможных документов и их основных полей { #таблица }
| Тип документа | Форма | Наименование документа | Таблица |
| --------------|-------|------------------------|-------- |
| IncomingDocument | IncomingDocumentForm | Входящие документы | DocflowDocument |
| Base.Contract | ContractForm | Договор | Contract |
| Base.ValidContractDocument | ValidContractDocumentForm | Документ, имеющий силу договора | Contract |
| DocumentForSigning | DocumentForSigningForm | Документы на подписание | UniversalDocument |
| Base.AdditionalContract | AdditionalContractForm | Дополнительные документы к договору | AdditionalContract |
| ServiceDesk | ServiceDeskForm | Заявка в техподдержку | DocflowDocument |
| ECPCertificateApplication | ECPCertificateApplicationForm | Заявка на выпуск сертификатов ЭЦП | ECPCertificateApplication |
| EmployeeStatement | EmployeeStatementForm | Заявления от сотрудников | UniversalDocument |
| OutgoingDocument | OutgoingDocumentForm | Исходящие документы | DocflowDocument |
| LND | LNDForm | Локальные нормативные акты | UniversalDocument |
| OrganizationalDocument | OrganizationalDocumentForm | ОРД | DocflowDocument |
| Instruction | InstructionForm | Поручения | DocflowDocument |
| ServiceRecordForContract | ServiceRecordForContractForm | СЗ для регистрации договора | DocflowDocument |
| ServiceRecordForAdditionalDocument | ServiceRecordForAdditionalDocumentForm | СЗ для регистрации доп. документов к договору | DocflowDocument |
| ServiceRecord | ServiceRecordForm | Служебные записки | ServiceRecord |
| ServiceRecordForBusinessTrip | ServiceRecordForBusinessTripForm | Служебные записки на командировку | DocflowDocument |
| UniversalDocument | UniversalDocumentForm | Универсальный документ | UniversalDocument |