Типовое решение¶
Теперь, когда карточка настроена, можно адаптировать её для задействования в типовом решении. Это добавляет такие преимущества, как регулирование прав доступа на карточку, расширенные средства нумерации, использование процесса согласования и резолюций, регистрация карточки и сквозной поиск по доступным документам, стандартные отчёты и полноценное использование типов документов с различными настройками нумераций, прав доступа и др. В отличие от упрощённого указания типа документа как поля в карточке, хотя никто не мешает совместить оба подхода.
Подробную информацию по настройке и расширению типового решения можно получить в руководстве по работе с типовым решением и в руководстве разработчика. Здесь же приводится краткое руководство по добавлению некоторых возможностей типового решения в созданный нами тип карточки AbDocument
.
Секция DocumentCommonInfo¶
В типовом решении есть специальная секция DocumentCommonInfo
, которая содержит часто используемые поля для документов, которая также используется для организации нумерации, типов документов и сквозных представлений, таких как “Мои документы”. Рекомендуется включать такую секцию во все типы карточек, которые являются каким-либо видом документа, а также в которых есть некоторые из определённых в секции полей.
В секции AbDocuments
мы определяли колонку Subject
для темы документа, а также комплексную колонку Partner
для ссылки на контрагента. Мы использовали колонку Number
для хранения номера, хотя поле для ручного ввода номера неудобно, т.к. чаще всего порядковый номер документа должен быть выдан системой в соответствии с годом, департаментом и прочими полями карточки. Если же номер вводится вручную, то это внешний номер документа, т.е. номер документа “на бумаге”, для которого в DocumentCommonInfo
предусмотрена отдельная колонка OutgoingNumber
. Кроме того, тип AbDocument
является видом документа, который будет использоваться в системе, а значит, можно добавить строковую секцию DocumentCommonInfo
в тип карточки.
-
Откроем схему данных (вкладка “Схема” в TessaAdmin), найдём таблицу с документами
Ab/AbDocuments
и удалим колонкиSubject, Number, Partner
, оставив толькоType
. Удалить колонку можно, выбрав пункт “Удалить” в контекстном меню на колонке. После чего сохраним схему кнопкой “Save”. -
Теперь перейдём на вкладку “Карточки”, выберем тип документа
Ab/AbDocument
и нажмём кнопку “Проверить всё”. Система выдаст окно с указанием ошибок, которое достаточно закрыть. -
Выберем узел “Секции”, развернём узел группы таблиц “Common”, в нём развернём таблицу DocumentCommonInfo и отметим флажками колонки:
-
CardType
– ссылка на тип карточки, это обязательная колонка для функционирования сквозных отчётов по таблице DocumentCommonInfo, например, отчёта “Available documents” (список документов, доступных текущему пользователю). Если колонка добавлена в тип карточки, то она автоматически заполняется системными расширениями, поэтому её достаточно отметить флажком. -
Partner
– ссылка на контрагента. -
Subject
– строковое поле с темой документа. -
Number, FullNumber, Sequence, SecondaryNumber, SecondaryFullNumber, SecondarySequence
– всё это поля, необходимые для функционирования системы нумерации в типовом решении. Следует либо отметить их все (что мы и сделаем), либо не отмечать ни одно из них, если автоматическая нумерация документов не требуется.А также снимем флажки с колонок
Partner
,Subject
иNumber
в узле Ab/AbDocuments
-
-
Перейдём в узел “Вкладки”. Для контрола “Partner” укажем поле
DocumentCommonInfo.Partner
. -
Для контрола “Subject” укажем поле
DocumentCommonInfo.Subject
. -
Контрол “Number” удалим, вместо него добавим контрол типа “Numerator”, который позволяет работать с автоматически генерируемыми номерами. В поле
Card section
укажем на секциюDocumentCommonInfo
, после чего другие поля заполнятся автоматически. Разместим контрол над другими контролами в блоке с помощью кнопки со стрелкой “вверх” справа от списка контролов. -
Далее требуется изменить валидатор для поля
Subject
- указать его из секцииDocumentCommonInfo
. За полем номера теперь следит контрол типа “Нумератор”, другая валидация для него не требуется, поэтому данный валидатор удалим.
Теперь можно убедиться в предпросмотре, что тип карточки успешно отображается и выглядит, как и раньше, и сохранить тип кнопкой “Сохранить всё”.
Адаптация представления под секцию DocumentCommonInfo¶
Однако, открыв представление “Documents”, мы увидим, что SQL представления некорректен и ссылается на колонки в таблице AbDocuments
, которые теперь отсутствуют.
Поэтому откроем представление Ab/AbDocuments
во вкладке “Представления” в TessaAdmin. Изменим SQL запрос в поле “Запрос” так, чтобы он использовал данные из таблицы DocumentCommonInfo
. Следует иметь в виду, что отображаемый номер хранится не в поле Number
, а в поле FullNumber
(Number
– числовой номер, FullNumber
– его текстовое представление, которое может быть дополнено буквами, нулями слева и др.). Фильтрацию же и сортировку лучше всего выполнять для числового поля Number
, для которого уже есть индекс в таблице DocumentCommonInfo
. При этом имена колонок, возвращаемые запросом, нужно оставить теми же, чтобы не изменять “интерфейс” представления для всех, кто его уже может использовать.
select
#if(Normal) {
t.ID as DocID,
d.FullNumber as DocNumber,
d.Subject as DocSubject,
t.TypeID,
t.TypeName,
d.PartnerID,
d.PartnerName
} {
t2.*
}
from
(
select
#if(Normal) {
t.ID,
row_number() over (order by #order_by) as rn
}
#if(Types) {
distinct t.TypeID, t.TypeName
}
#if(Count) {
count(*) as cnt
}
from AbDocuments t with(nolock)
inner join DocumentCommonInfo d with(nolock) on d.ID = t.ID
where d.CardTypeID = '{67ad1ddb-978b-4de5-9c5d-ee398053bb07}'
#param_expr(Number, d.Number)
#param_expr(Subject, d.Subject)
#param_expr(Type, t.TypeID)
#param_expr(Partner, d.PartnerID)
#param_expr(PartnerName, d.PartnerName)
) t2
#if(Normal) {
inner join AbDocuments t with(nolock) on t.ID = t2.ID
inner join DocumentCommonInfo d with(nolock) on d.ID = t2.ID
}
#if(PageOffset) {
where t2.rn >= #param_expr(PageOffset) and t2.rn < (#param_expr(PageOffset) + #param_expr(PageLimit))
}
#if(Normal) {
order by t2.rn
}
#if(Types) {
order by t2.TypeName
}
Для оптимизации запроса при наличии большого количества разнотипных документов в системе рекомендуется добавить фильтрацию по DocumentCommonInfo.CardTypeID
, указав идентификатор типа карточки. Идентификатор можно получить в поле TypeID
структуры карточки, которую можно отобразить, например, из окна предпросмотра типа карточки.
Именно такой идентификатор должен быть вставлен в тело запроса в фильтрацию по d.CardTypeID
.
Не забудем также изменить сортировку в метаинформации для колонки DocNumber
, т.к. она теперь выполняется для таблицы d
(алиас для DocumentCommonInfo
в запросе).
#column(Alias: DocNumber, Caption: Number, SortBy: d.Number)
Теперь представление корректно выполняется, в чём можно убедиться в режимах “Отладка” и “Просмотр”.
Настройки типового решения¶
Следующим шагом является добавление типа карточки в настройки типового решения. Это позволит активировать систему нумерации, а также использование резолюций и прочих возможностей типового решения.
Откроем карточку настроек типового решения из TessaClient, выбрав плитку “Типовое решение” внутри плитки “Настройки” на правой боковой панели.
Откроется карточка настроек типового решения.
В ней кнопкой “Добавить” надо добавить в таблицу строку с указанием типа карточки и его настроек. Это будет наш тип карточки AbDocument
.
-
Флажок Использовать типы документов позволяет использовать типы документов для дифференцирования нумерации и прав доступа к карточкам одного и того же типа. Оставим флажок снятым. Подробнее о типах документах можно прочитать в руководстве по настройке типового решения.
-
Включим возможность использования типового процесса согласования, отметив флажок Использовать согласование.
-
Выберем в поле Автоматическое выделение номера значение “При создании”. Это укажет системе о том, что номер надо резервировать в момент создания карточки и выделять в момент первого сохранения (при закрытии вкладки с созданной, но несохранённой карточкой номер будет дерезервирован).
-
Поле Выделять из последовательности можно оставить пустым. Это поле указывает имя последовательности, из которой выделяются номера. Это позволяет номерам не пересекаться для различных типов карточек, типов документов, годов регистрации документов, названий департаментов и др. По умолчанию название последовательности определяется как “CardTypeSequence”, где “CardType” - это имя типа карточки. В нашем случае последовательность будет называться “AbDocumentSequence”.
-
В поле Формат полного номера укажем
Ab{00000n}
. Это строка форматирования, используемая для формирования строкового представления номера, отображаемого пользователю, по полученному из последовательности числовому представлению. Такая строка определяет, что сначала следуют буквы “Ab”, а потом числовой номер, дополненный нулями слева до длины в 6 символов. Например, “Ab000002” для числового номера “2”. -
Поставим флажок Использовать регистрацию, чтобы включить возможность по регистрации документов. При этом ниже появятся настройки для номера, генерируемого для регистрации. Для документа проектный (исходный) номер всегда хранится в колонках
SecondaryNumber, SecondaryFullNumber, SecondarySequence
, и этот же номер хранится вNumber, FullNumber, Sequence
, но только до регистрации. Сразу после регистрации последние 3 колонки заполняются регистрационным номером, а колонкиSecondary...
по-прежнему содержат проектный номер. -
Укажем Автоматическое выделение номера: Выделять, чтобы при регистрации система автоматически генерировала регистрационный номер из последовательности по заданным правилам.
-
В Выделять из последовательности зададим имя последовательности, отличающегося от значения по умолчанию, чтобы не пересекаться с последовательностью для проектных номеров. Например, “AbDocumentsRegSequence”.
-
В Формат полного номера укажем другой формат номера, например,
AbReg{00000n}
. -
Поставим флажок Использовать типовой процесс отправки задач, чтобы разрешить отправку задач для этого типа карточки. Также отметим появившийся флажок
Отключить проверку даты для подзадач
, чтобы не ограничивать дату создания дочерней задачи относительно даты запланированного завершения родительской задачи.
Закроем строку и сохраним карточку настроек.
Правила доступа к карточке¶
Остался последний шаг перед использованием всех возможностей типового решения – это создание правила доступа. Правила доступа – это специальные административные карточки, в которых указывается, для каких типов карточек (или типов документов) в каких состояниях какие разрешения для каких ролей доступны.
Представление “Правила доступа” с правилами доступа расположено в рабочем месте “Администратор” внутри папки “Типовое решение”.
По умолчанию в системе создано правило доступа с правами по умолчанию, которые разрешают всем пользователям любые действия с типами карточек из типового решения, находящимися в любых состояниях.
Откроем эту карточку двойным кликом и допишем в поле Типы
наш тип карточки “Document”, после чего не забудем сохранить правило доступа. Убедитесь, что отмечены все флажки с правами, в поле Состояния карточек
указаны все состояния карточек, а в поле Список ролей
есть роль “Все сотрудники”, разрешающая эти действия всем сотрудникам. Конечно же, такие правила доступа указываются в целях тестирования, в реальной эксплуатации будет добавлено множество карточек со сложными правилами доступа.
Наступил момент проверки наших изменений. Создадим карточку документа “Document” из группы “Ab” (правая панель, плитка “Create card”). Если создание типа карточки недоступно, то перезапустите приложение TessaClient.
Как видим, карточка автоматически получила номер “Ab00001”, поля Partner
и Subject
корректно заполняются, а также появилась новая вкладка “Процесс согласования”. Это вкладка настройки процесса согласования, которая была добавлена в UI карточки расширениями на метаинформацию, причём все контролы на этой вкладке связываются с виртуальными полями (которые не хранятся в БД). А, собственно, их сохранение производится в отдельной карточке-сателлите, которая создаётся автоматически расширениями типового решения.
Заполним обязательные поля и сохраним карточку. Обращаем внимание на заголовок вкладки, который был автоматически заполнен номером документа. Это расширение на Digest
для типового решения, к которому прикреплён наш тип карточки.
Откроем левую боковую панель. В ней появилось множество плиток, такие как “Начать согласование” для запуска типового процесса согласования, “Зарегистрировать документ” для регистрации документа и “Поставить задачу” для создания задачи. Зарегистрируем документ.
Обратите внимание, что в поле Number
теперь записан регистрационный номер (как и в заголовке вкладки).
Нажмём на левой боковой панели “Отменить регистрацию” для отмены регистрации документа. После этого документ опять получит свой проектный номер в качестве основного.
Следует иметь в виду, что теперь практически все действия с карточкой контролируются правилами доступа, поэтому любой пользователь не сможет создать карточку, зарегистрировать её или создать задачу, если это ему не разрешено в правилах доступа.
Последовательности¶
Рассмотрим карточки последовательностей, которые были автоматически созданы при первом выделении из них номеров. Представление с последовательностями доступно в рабочем месте “Администратор”, узел “Прочее/Последовательности”.
Откроем карточку двойным кликом.
Здесь можно увидеть “Интервалы” свободных номеров. Сейчас левая граница “Начало” единственного диапазона смещена до “2”, т.к. номер “1” был занят созданной нами карточкой “Ab00001”. При текущих настройках для типа AbDocument при удалении этой карточки номер будет освобождён, а диапазон смещён до “1”, но это поведение настраивается.
В области “Зарезервированные номера” отображаются зарезервированные номера, которые ещё формально не выделены из последовательности, но уже не могут быть заняты другими пользователями, которые одновременно создают карточки (или занимают номер другим способом). Эти номера администратор может удалить, если из-за неполадок в приложениях номер остался “висеть” и не освободился автоматически.
Чтобы понять, каким образом работает резервирование номеров, создадим ещё раз карточку документа AbDocument
, но не будем её сохранять. Обновим карточку последовательности AbDocumentSequence
.
Появилась строка с зарезервированным номером, которую можно вручную удалить, тем самым вернув номер в диапазон свободных номеров. Сейчас диапазон смещён до “3”, т.е. номер “2” не будет выделен из последовательности.
Закроем вкладку с созданным документом и обновим последовательность. Мы видим, что зарезервированный номер исчез, и номер “2” вернулся в диапазон свободных номеров, чтобы при повторном создании документа его могли опять занять.
Это завершает руководство. Мы создали карточку, настроили для неё представления и источники данных, а также интегрировали её с типовым решением. Дальнейшую информацию для углублённого изучения платформы и типового решения можно получить в других руководствах.