image1

© Syntellect 2019


1. Введение

Tessa – система документооборота, предназначенная для построения сложных процессов обработки документов. Система предназначена для работы в сложных условиях и специально оптимизирована для работы на слабых каналах связи.

1.1. Архитектура и физические компоненты системы

Система представляет из себя т. н. "трехзвенку". Пользователи запускают клиентское приложение TessaClient, которое при запуске подключается к серверу приложений Tessa. Сервер приложений взаимодействует с базой данных, обеспечивает аутентификацию пользователей и взаимодействие с клиентскими приложениями.

image183

Клиент и сервер взаимодействуют по протоколу https, обеспечивая защищенное и быстрое соединение. При необходимости, система может работать в сети интернет, подключение клиентов также может быть обеспечено через различные VPN-подключения, обеспечивающие маршрутизацию необходимого трафика.

Также система может быть развернута в режиме кластеризации серверов приложений.

1.2. Программные компоненты системы

  • Tessa Applications – специальное приложение, которое устанавливается на все клиентские компьютеры. Может устанавливаться централизованно групповыми политиками домена. Управляет приложениями TessaClient, TessaAdmin и обеспечивает их установку и обновление по сети. Также обеспечивает обработку ссылок на объекты системы.

  • Tessa Client – клиентское приложение, основное рабочее место пользователя. В специальной установке не нуждается, запускается пользователем из Tessa Applications, который загрузит текущую версию с сервера и запустит для пользователя.

  • Tessa Admin – клиентское приложение, рабочее место администратора системы, предназначенное для управления конфигурацией системы.

  • Сервис Chronos - сервис, устанавливается обычно на сервере приложений, обеспечивает рассылку уведомлений, расчет ролей и замещений и любые действия, которые выполняются по расписанию.

  • Сервер приложений Tessa - серверная часть платформы, устанавливается как веб-сервис на сервере Windows или Linux (с версии 3).

  • СУБД – на нем располагается база данных Tessa.

1.3. Аутентификация пользователей

Система обеспечивает прозрачную интеграцию с доменом Active Directory. При запуске клиентского приложения пользователь без ввода дополнительных параметров аутентифицируется системой как соответствующий пользователь домена и применяются соответствующие настройки профиля в системе Tessa.

Также в Tessa доступна аутентификация с помощью логина/пароля Tessa (указанных в справочнике сотрудников).

Администратор системы в карточке пользователя в справочнике сотрудников указывает тип входа в систему (Пользователь Windows/Пользователь Tessa), а также учетные данные (доменная учетная запись или логин/пароль пользователя Tessa), чтобы система могла идентифицировать пользователя (см Заведение нового пользователя/администратора в системе). Для безопасности хранения паролей сотрудников с типом входа Пользователь Tessa, в системе сохраняется хэш пароля.

Также возможен ручной ввод логина/пароля (учетной записи домена или локальной (на сервере приложений) учетной записи, или же логина/пароля пользователя Tessa).

1.4. Разворачивание системы - рекомендации

Настоятельно рекомендуется, при разворачивании системы обеспечить раздельные физические или виртуальные серверы для сервера приложений Tessa и для СУБД, где располагается база данных Tessa.

1.5. Системные требования

Требования к аппаратной конфигурации

Указаны примерные в расчете на среднюю активность пользователей и могут отличаться в зависимости от нагрузки и развернутой конфигурации.
100 пользователей
Требования к серверу приложений:

Процессор: 4 ядра, 2GHz и выше
Оперативная память (RAM): 8Gb и более
Система хранения данных (HDD/SSD): от 200Gb

Требования к серверу баз данных:

Процессор: 4 ядра, 2,5GHz и выше
Оперативная память (RAM): 16Gb и более
Система хранения данных (HDD/SSD): от 300Gb, рекомендуется RAID, не менее 200 IOPS

1000 пользователей
Требования к серверу приложений:

Процессор: 8 ядер и более, 2GHz и выше
Оперативная память (RAM): 16Gb и более
Система хранения данных (HDD/SSD): от 200Gb

Требования к серверу баз данных:

Процессор: 12 ядер и более, 3GHz и выше
Оперативная память (RAM): 32Gb и более
Система хранения данных (HDD/SSD): от 1Tb, рекомендуется RAID, не менее 500 IOPS

Требования к программной конфигурации

Tessa может быть установлена на сервер Windows или Linux. За подробными требованиями к конфигурации серверов Windows и конфигурации клиентских компьютеров обратитесь к руководству по установке сервера приложений на Windows. Для установки сервера приложений на Linux обратитесь к руководству по установке сервера приложений на Linux.

2. Работа с Tessa Applications и приложениями

2.1. Настройка рабочего места и приложение Tessa Applications

На рабочем месте пользователя нужно установить:

  1. Microsoft .NET 4.7.2 или выше.

  2. Приложение Tessa Applications из комплекта поставки.

Приложение Tessa Applications выполняет следующие функции:

  • Выполняет логин и получает с сервера Tessa список доступных пользователю приложений.

  • Позволяет одновременно подключаться к разным серверам Tessa.

  • Устанавливает приложения в профиль пользователя.

  • При запуске приложения проверяет обновления и обновляет приложения.

  • В том числе обновляет само себя.

  • Открывает ссылки tessa://…​

В процессе установки необходимо будет указать адрес для подключения к серверу Tessa. Обычно он имеет вид https://servername/tessa.

В вашей поставке, полученной от партнера или вендора может присутствовать файл трансформы (mst), где уже указан правильный адрес подключения. При его использовании правильный адрес будет указан в настройках по умолчанию. В этом случае устанавливать приложение необходимо через файл setup.bat. При установке через групповые политики домена необходимо указать файл трансформы в настройках групповой политики.

Приложение Tessa Applications показывает доступные пользователю приложения. Предварительно приложения должны быть опубликованы администратором на сервере. Если пользователь администратор – то ему доступны и рабочее место администратора Tessa Admin, и рабочее место пользователя Tessa Client. Если у пользователя нет прав администратора, то по-умолчанию ему доступно только рабочее место пользователя Tessa Client.

Второй важной задачей приложения является обработка ссылок на объекты СЭД Tessa. Если на компьютере установлен Tessa Applications, то при открытии ссылок вида tessa://tessaclient.tessa/…​ (так выглядят ссылки Tessa) – объект, на который ведет ссылка, откроется в приложении Tessa Client. При этом Tessa Applications и сам Tessa Client могут быть не запущены в момент открытия ссылки – они запустятся автоматически.

Также запустить Tessa Applications или сразу приложения Tessa Client/Tessa Admin можно с помощью ссылок: tessa://tessaappmanager, tessa://tessaclient.alias, tessa://tessaadmin.alias, где alias - это псевдоним сервера для запуска нужного приложения.

Если при запуске Tessa Applications не смог авторизоваться на сервере при использовании Windows-авторизации (Kerberos\NTLM), то он выдаст приглашение на ввод логина\пароля.

Основное окно Tessa Applications выглядит следующим образом:

image176

Также, запущенное приложение видно в системном трее. Запускать приложения можно как из основной формы, так и из значка в трее:

image177

Если приложение не установлено на компьютере пользователя или на сервере имеются обновления для приложения, то при запуске система автоматически их установит. Обновленное приложение загрузится с сервера приложений на компьютер пользователя и запустится.

Если пользователю доступно только одно приложение, то оно запускается автоматически при запуске Tessa Applications.
Пользователь обязательно должен быть предварительно занесен в справочник сотрудников Tessa (см. Заведение нового пользователя/администратора в системе).

Также, если приложение уже запущено, есть возможность запустить второй экземпляр приложения: удерживая клавишу Ctrl нажать на приложение; или же с помощью контекстного меню - нажав правую кнопку мыши на приложении и выбрав "Запустить второй экземпляр приложения".

Речь идет только про ссылки, обрабатываемые "толстым" клиентом. Для легкого web-клиента ссылки имеют привычный формат https://servername/tessa/web/…​;.

Ссылки, с которыми умеет работать система, имеют вид:

tessa://tessaclient.tessa?param1=value1&param2=value2

В структуру ссылки входят:

  • Алиас приложения, для которого предназначается ссылка.

  • Код сервера. Определяет, для какого сервера будет запущено приложение.

  • Список параметров.

Существуют несколько типов ссылок:

  • Ссылка на карточку.

  • Ссылка на файл.

  • Ссылка на версию файла.

  • Ссылка на узел дерева.

Получить ссылку на нужный объект можно в контекстном меню объекта (для узла дерева, файла и его версии) или в левой контекстной панели для карточки.

При помощи механизма расширений можно определять новые типы ссылок.

В случае перехода пользователем по ссылке, Tessa Applications определяет по коду сервера и алиасу приложения, для какого приложения надо выполнить ссылку, и передаёт этому приложению соответствующую команду с набором параметров. Если ссылка не содержит кода сервера, то считается, что используется сервер, отмеченный в Tessa Applications как сервер по-умолчанию. Если приложение не запущено, оно будет запущено автоматически. Tessa Applications также может быть не запущено в момент открытия ссылки - оно также запустится автоматически.

2.3. Публикация приложений

Публикация приложений может осуществляться двумя способами:

  1. При помощи специальных параметров запуска приложений и Tessa Applications. В этом случае приложения самостоятельно подключаются к серверу, указанному в параметрах командной строки или конфигурационном файле приложения и публикует само себя. Такой метод работает только для Windows. Этот подход описан в данном разделе.

  2. При помощи утилиты командной строки tadmin. Такой подход работает и на Windows и на Linux. Сначала приложение упаковывается в формат jcard при помощи команды PackageApp, а затем публикуется на сервере при помощи административного импорта.

Пример публикации TessaClient.

Откройте папку в командной строке Applications\TessaClient.

Выполните команду, заменив SERVER_NAME на сетевое имя сервера приложений:

TessaClient.exe /publish /a:https://SERVER_NAME/tessa

Приложение подключится к серверу, указанном в параметре /a, выполнит логин при помощи Windows-авторизации и опубликует приложение, если логин успешен и у пользователя есть права администратора. Если сервер не задан, то будет использоваться сервер, указанный в конфигурационном файле приложения TessaClient.exe.config.

Аналогичный пример для публикации TessaAdmin.

Откройте папку в командной строке Applications\TessaAdmin.

Выполните команду, заменив SERVER_NAME на сетевое имя сервера приложений:

TessaAdmin.exe /publish /a:https://SERVER_NAME/tessa /admin

Параметр /admin публикует приложение с установленным флажком "Только для администраторов".

В обоих случаях после выполнения команды появится небольшое окно с индикатором загрузки. Через некоторое время окно исчезнет, что означает, что публикация выполнена успешно.

При публикации можно указать логин/пароль по которыми будет производиться авторизация. Пример такой публикации для Tessa Admin:

TessaAdmin.exe /publish /u:Admin /p:password /a:https://SERVER_NAME/tessa /admin

Так же примеры команд для публикации приложений есть в файлах publish_admin_demo.bat и publish_client_demo.bat для Tessa Admin и Tessa Client соответственно. Они находятся в папке "Applications" сборки платформы. Подробный список параметров можно найти в разделе Параметры командной строки приложений.

Опубликованные приложения становятся карточками системы специального типа "Приложение".

Список опубликованных приложений можно посмотреть в Tessa Client, вкладка Администратор, представление Прочее - Приложения. В представлении отображен список карточек всех опубликованных приложений:

image177 4

В карточке добавлены файлы опубликованного приложения, а также отображается информация по данному приложению:

image177 5
При изменении приложении и/или их расширений необходимо повторять публикацию, чтобы Tessa Applications мог обновить данные на рабочем месте пользователя.

Каждый раз при запуске приложения Tessa Applications получает с сервера информацию о списке файлов, опубликованных на сервере и их хэшах. Далее проверяется локальные файлы приложения в профиле пользователя, если они отличаются по составу или хэшу - с сервера получаются необходимые файлы и обновляются\создаются\удаляются локальные файлы.

Tessa Applications умеет обновлять сам себя. Для этого нужно опубликовать приложение Tessa Applications (TessaAppManager.exe) на сервере как любое другое приложение. При запуске Tessa Applications проверяет наличие обновлений на сервере по-умолчанию. Если обновление есть, то оно загружается, затем Tessa Applications перезапускается.

2.4. Подключение к другому серверу Tessa

В случае, если пользователю требуется доступ на разные сервера Tessa (например, один - рабочий, второй - тестовый), то необходимо в Tessa Applications добавить нужный сервер:

  1. Перейти на вкладку Сервер и нажать на кнопку Добавить:

    image177 1

    В окне добавления сервера укажите псевдоним и адрес тестового веб сервиса Tessa:

    image177 2

    В полях логин/пароль можно указать учетные данные для запуска приложений не под текущим пользователем, а под каким-либо другим (зарегистрированном в справочнике сотрудников Tessa).

  2. В результате в Tessa Applications вы увидите доступные приложения с разных серверов:

    image177 3
Для отображения приложений добавленного сервера необходимо, чтобы они были опубликованы на сервере и у вас были права доступа к данным приложениям (см. Руководство по установке СЭД Tessa).

Также добавить новый сервер в Tessa Applications можно с помощью специальных ссылок (см. Ссылки для добавления/изменения/удаления серверов в Tessa Applications).

Настройки подключения к серверам Tessa Applications хранятся в xml файле - application_catalogs.xml. Если Tessa Applications установлен в режиме для пользователя, то файл можно найти по пути: C:\Users\<UserName>\AppData\Roaming\tessa\settings\application_catalogs.xml. Если же Tessa Applications установлен в режиме для всех пользователей, то данный файл хранится в папке установки: C:\Program Files\Syntellect\Tessa Applications\app\application_catalogs.xml.

При запуске Tessa Applications считывает настройки подключений к серверам из данного файла. Имя пользователя и пароль (если они указаны для сервера) хранятся в данном файле в зашифрованном виде.

2.5. Права доступа к приложениям

По умолчанию для опубликованных приложений установлены следующие права доступа:

  • Tessa Client - приложение доступно всем сотрудникам;

  • Tessa Admin - доступно Администраторам системы (т.е пользователям, в карточке сотрудника которых установлен уровень доступа - Администратор).

Настроить права доступа к приложениям можно с помощью карточек приложений. В Tessa Client, вкладка Администратор, представление Прочее - Приложения отображен список карточек всех опубликованных приложений:

image177 4

В карточке добавлены файлы опубликованного приложения, а также отображается информация по данному приложению:

image177 5

В поле Роли, которым доступно приложение можно указать только те роли, доступ к приложению которым мы хотим дать. Если поле пустое - приложение доступно всем пользователям.

Флаг Только для администраторов выставляется в случае, если приложение должно быть доступно только Администраторам системы (как, например, приложение Tessa Admin).

Независимо от настроенных прав доступа к приложениям, Администратору системы всегда будут доступны все опубликованные приложения.

2.6. Группировка приложений

При необходимости опубликованные приложения можно сгруппировать (для удобства отображения в Tessa Applications).

В карточке приложения (Tessa Client, вкладка Администратор, представление Прочее - Приложения) в поле Группа для нужных приложений указываем название группы.

После обновления в Tessa Applications приложения будут сгруппированы. Можно выбрать группировку по серверам или по группам:

image177 6

2.7. Ссылки для добавления/изменения/удаления серверов в Tessa Applications

Для быстрого и удобного изменения параметров сервера в Tessa Applications можно использовать ссылки, перейдя по которым у пользователя пропишутся необходимые настройки.

  • Для добавления/изменения одного из серверов в Tessa Applications используется ссылка в следующем формате:

    tessa://tessaappmanager?Action=ServerParam&Alias=alias&Path=path&UserName=username&Password=password&IsDefault=true

    • Alias - алиас сервера, который добавляется/изменяется, например: prod;

    • Path - адрес сервера, например: https://tessa-server/tessa;

    • UserName - имя пользователя, если аутентификация не доменная;

    • Password - пароль (указывается, если было задано имя пользователя);

    • IsDefault - true, если сервер назначается основным (т.е. тем, с которого Tessa Applications будет загружать обновления для себя самого). Если не основной - false.

      Все параметры необязательны, однако имеет смысл указать хотя бы один параметр при изменении сервера, и хотя бы Alias/Path при добавлении нового сервера.
  • Для удаления сервера в Tessa Application используется ссылка в следующем формате:

    tessa://tessaappmanager?Action=RemoveServer&Alias=alias

    • Alias - алиас удаляемого сервера.

2.8. Работа удаленных пользователей

Необходимо сразу заметить, что все приложения, включая Tessa Applications – взаимодействуют с сервером приложений по протоколу https (обычно это 443 порт).

Например, внутри локальной сети предприятия сервер Tessa доступен по пути https://tessa-ecm/tessa. Один из сотрудников работает из внешней сети, и у него нет доступа к этому адресу. Администраторы настроили сеть таким образом, что извне Tessa доступна по пути https://tessa.company.ru/tessa. В этом случае удаленному пользователю необходимо в Tessa Applications добавить новый сервер с адресом подключения https://tessa.company.ru/tessa (см Подключение к другому серверу Tessa или Ссылки для добавления/изменения/удаления серверов в Tessa Applications).

Однако самым безопасным способом доступа извне к серверу Tessa является доступ через VPN в сеть предприятия и затем уже доступ в Tessa поверх VPN.

2.9. Изменение расположения папки для загруженных приложений

Настройка расположения папки для загруженных приложений производится в конфигурационном файле %appdata%\tessa\settings\application_catalogs.xml в параметре t:AppPath, по умолчанию указана папка %appdata%\tessa.

В параметре можно указать любой путь к папке загруженных приложений (подпапка applications от заданного пути) с учётом переменных окружения (%appdata%, %localappdata% и др.), в т.ч. указать путь, не являющийся частью переносимого профиля %appdata%.

Используйте эту настройку только в том случае, если размер переносимого профиля пользователя ограничен, и средствами сторонних приложений выполняется синхронизация этого профиля между рабочими станциями.

2.10. Параметры командной строки приложений.

Tessa Admin и Tessa Client.

Параметр

Короткая форма

Описание

/address

/a

Задаёт базовый адрес подключения. При указании этого параметра адрес в конфигурации приложения игнорируется.

/username

/u

Позволяет явно задать имя пользователя для авторизации на сервере.

/password

/p

Позволяет явно задать пароль для авторизации на сервере.

/publish

Инициирует процесс публикации приложения.

/admin

При публикации приложения устанавливает признак "только для администраторов".

/link

Запуск для обработки ссылки. В параметр передаются только параметры ссылки после ?. TessaClient.exe "/link:Action=MyAction&Param1=value1". Удобно для отладки.

Tessa Applications.

Параметр

Короткая форма

Описание

/address

/a

Задаёт базовый адрес подключения. Используется только вместе с параметром /publish.

/username

/u

Позволяет явно задать имя пользователя для авторизации на сервере.

/password

/p

Позволяет явно задать пароль для авторизации на сервере.

/publish

Инициирует процесс публикации приложения.

/link

Запуск для обработки ссылки. В параметр передается ссылка целиком TessaAppManager.exe "/link:tessa://server.alias?Action=MyAction&Param1=value1".

2.11. Логирование

Полезно знать, где располагаются файлы логов Tessa Applications. Определяются они файлом nlog.config рядом с выполняемыми файлами TessaAppLauncher.exe (располагается в папке установки, по умолчанию "%ProgramFiles(x86)%\Syntellect\Tessa Applications\") и TessaAppManager.exe (при первичной установке располагается в папке установки, по-умолчанию "%ProgramFiles(x86)%\Syntellect\Tessa Applications\app", если были обновления Tessa Applications, то в папке профиля пользователя %APPDATA%\tessa\appmanager). Там же определяется уровень логирования (по умолчанию логируются только ошибки).

По-умолчанию логирование настроено в текстовые файлы и журнал приложений Windows. Текстовые файлы:

  • %APPDATA%\tessa\logs\AppManager.txt

  • %APPDATA%\tessa\logs\AppLauncher.txt

2.12. Настройки приложений

У приложений есть конфигурационные файлы, в которых хранятся некоторые настройки, которые могут быть полезны в тех или иных случаях. Ниже описаны данные настройки и в каких случаях имеет смысл их менять. Конфигурационные файлы имеют имя вида TessaClient.exe.config и расположены рядом с соответствующими выполняемыми файлами.

Включение аппаратного ускорения при выводе на экран

Включение данной настройки может исправить ошибки совместимости с приложениями, которые организуют терминальные сессии. Для включения аппаратного ускорения при выводе на экран в desktop-приложениях TessaClient, TessaAdmin и Tessa Applications в конфигурационном файле *.exe.config в параметре SoftwareRendering необходимо указать true.

Включение данной настройки замедляет работу приложения, но может исправить ошибки совместимости с приложениями, которые организуют терминальные сессии. Используйте настройку с осторожностью, только в ситуации, когда она исправляет существующие ошибки, и предварительно убедившись в её работоспособности на компьютерах пользователей. Если эта настройка включена, то также установите настройку FadeAllowed равную false в том же конфигурационном файле.
Включение библиотеки для работы с современными сканерами

В конфигурационном файле TessaClient.exe.configTessaClient32.exe.config) параметр NewTwainDSM определяет, будет ли использоваться библиотека twaindsm.dll (значение true), предоставляющая доступ к новым версиям API TWAIN для работы с современными сканерами, или же используется библиотека twain_32.dll (значение false), которая обеспечивает лучшую совместимость со старыми моделями сканеров.

Значение по умолчанию false также подходит для большинства современных сканеров. Установите значение true только в том случае, если наблюдаются проблемы с некоторыми сканерами.

Прочие параметры приложений.

2.12.1. Tessa Client

Параметр Пример значения Описание

RemoteAddress

https://localhost/tessa

Адрес сервера приложений с установленными сервисами Tessa

FadeAllowed

true

Включить затемнение при неактивном окне приложения (может быть полезным при работе в терминале).

CardTracingMode

Off

Режим трассировки

2.12.2. Tessa Admin

Параметр Пример значения Описание

RemoteAddress

https://localhost/tessa

Адрес сервера приложений с установленными сервисами Tessa

2.12.3. Scheme Editor

Параметр

Пример значения

Описание

connectionStrings

<add name="default" connectionString="Server=.\SQLEXPRESS;Database=tessa;Integrated Security=false;User ID=sa;Password=password;Connect Timeout=200; Pooling=True; Max Pool Size=200; MultipleActiveResultSets=False" providerName="System.Data.SqlClient" />

Строка подключения к базе данных, с которой работают сервисы Tessa

3. Механизмы разграничения доступа

В системе используется два основных механизма по разграничению доступа: Дискреционная и Ролевая безопасность.

Дискреционная безопасность

Дискреционная безопасность - это уровень доступа (Пользователь/Администратор), который задается в карточке сотрудника. Используется в следующих случаях:

  • Для приложений, опубликованных как "административный". Например, Tessa Admin, опубликованный с параметром /admin будет доступен только сотрудникам с уровнем доступа Администратор.

  • Для карточек с флагом "административный". Т.е. сотруднику с уровнем доступа Администратор будут доступны все глобальные настройки (правая панель – меню Настройки), редактирование всех типов ролей, объектов маршрутов (шаблоны этапов, группы, вторичные процессы, методы расширений).

  • Администратор может редактировать карточки сотрудников, включая настройку замещений для любого сотрудника, смену пароля и т.д.

  • Администратор может закрывать сессии других сотрудников.

  • Администратор может для представлений и рабочих мест менять список ролей, кому они будут доступны. А также может выполнять импорт представлений и рабочих мест.

  • Администратору доступен просмотр истории действий.

  • Администратор может восстанавливать удаленные карточки или удалять их окончательно (см. Работа с удаленными карточками).

  • Администратор может менять любые шаблоны карточек (более подробно см. Руководство пользователя) за других пользователей, даже если те не давали таких прав.

Ролевая безопасность
  • По роли определяется доступ к разным объектам системы, которые не являются административными: к карточкам документов (по правилам доступа), к замещениям других сотрудников, к шаблонам карточек и файлов, к кнопкам маршрутов и др.

  • По вхождению в ту или иную роль пользователь видит представление со списком каких-то объектов (например, реестр документов и основную информацию по документам, отображенную в колонках).

  • По роли определяется видимость задач, а видимость задач в свою очередь влияет на возможность открыть карточку и подписывать в ней файлы; эти права выдаются "мимо" правил доступа. Более подробно см. раздел Система прав доступа к карточкам, включенным в типовое решение.

4. Заведение нового пользователя/администратора в системе

Для того, чтобы сотрудник мог войти в систему, должно выполняться следующее условие:

  • Для сотрудника должна быть заведена карточка в справочнике сотрудников и в ней должен быть указан его доменный аккаунт (если тип входа в систему - Пользователь Windows) или логин/пароль (если тип входа в систему - Пользователь Tessa).

Для того чтобы завести нового пользователя в системе и тем самым дать ему доступ к рабочим местам и представлениям необходимо создать карточку нового сотрудника. Для этого необходимо воспользоваться пунктом правого контекстного меню "Создать карточку → Роли → Сотрудник":

image173

В карточке сотрудника необходимо указать: ФИО, краткое и полное имя (если не указать, система сгенерирует их самостоятельно в формате Фамилия Имя). Далее выбрать Тип входа в систему и, в зависимости от выбранного типа, заполнить данные для доступа в систему:

  • Пользователь Windows - указать доменный аккаунт в формате домен\имя пользователя;

  • Пользователь Tessa - указать логин, пароль и повтора пароля.

А также выбрать Уровень доступа - Обычный или Администратор.

image174

Также можно указать электронную почту (если сотруднику нужно получать уведомления) и Язык уведомлений по умолчанию.

Поле "Внешний ID" используется при импорте сотрудников с помощью утилиты tadmin. Оно необходимо для связывания данных с внешней системой и проверки уникальности, заполняется только в случае, если данные сотрудника синхронизируются с какой-то внешней системой.

Блок "Синхронизация с Active Directory / LDAP" используется для отображения информации по синхронизации, а также запуска ручной синхронизации (более подробно см. Синхронизация с Active Directory / LDAP).

После того, как все необходимые данные сотрудника заполнены, нужно нажать кнопку "Сохранить" в левом меню системы.

image175

Через 1-2 минуты (после добавления сервисом Chronos сотрудника в роль "Все сотрудники") новый пользователь получит доступ к рабочему месту и представлениям, доступным пользователям по умолчанию.

Загрузить большое количество Сотрудников в Tessa можно с помощью синхронизации с Active Directory / LDAP или утилиты tadmin.

5. Синхронизация с Active Directory / LDAP

5.1. Описание модуля

Модуль предназначен для синхронизации с Active Directory / LDAP карточек Сотрудников, Подразделений и Статических ролей.

Модуль не входит в типовую поставку и приобретается отдельно.
Начиная с версии 3.3 синхронизация совместима с протоколом LDAPv3.

Посмотреть информацию о доступных модулях, включённых в лицензию можно в приложении Tessa Admin, раздел "Информация":

image337

Данный модуль может выполнять:

  • периодическую синхронизацию данных в указанные моменты времени;

  • синхронизацию данных по запросу пользователя (вручную).

Модуль синхронизирует:

  • Карточки Сотрудников:

    • ФИО,

    • Логин,

    • Email,

    • Телефон,

    • Мобильный телефон,

    • Должность.

  • Карточки Подразделений:

    • Название подразделения,

    • Глава подразделения,

    • Сотрудники, входящие в подразделение.

  • Карточки Статических ролей:

    • Имя роли,

    • Описание роли,

    • Сотрудники, входящие в статическую роль.

Если в Active Directory / LDAP удален (или заблокирован) сотрудник, удалены подразделение или группа, то после синхронизации в соответствующих карточках Tessa выставится флаг "Скрывать при выборе". В карточке Сотрудника, помимо этого, поменяется тип входа на "Вход воспрещён".

5.2. Автоматическая синхронизация

Для автоматической синхронизации необходимо включить основной плагин AdSyncPlugin и плагин периодической синхронизации AdSyncRecurrentPlugin, выставив в соответствующих конфигурационных xml файлах disabled="false". Все конфигурационные файлы плагинов сервиса Chronos хранятся в папке Chronos\Plugins\Tessa\configuration. Более подробно про плагины см. в разделе Настройка плагинов Chronos.

Затем необходимо настроить конфигурационный файл Chronos\app.json, добавив в раздел "Settings" строки, указанные ниже. По умолчанию в конфигурационном файле данных строк нет. Однако, если учетная запись, под которой запущен Chronos, является доменной учетной записью и входит в тот домен, который необходимо синхронизировать, то конфигурационный файл Chronos\app.json можно оставить без изменений.

В случае если для запуска Chronos используется локальный пользователь или необходимо использовать другую учетную запись для входа в домен, то необходимо в конфигурационный файл добавить следующие настройки:

Параметр

Пример значения

Описание

"AdSync.Server"

"192.168.0.1"

Контроллер домена. Если указать пустое значение, то будет использоваться текущий домен.

"AdSync.UserDomain"

"domain"

Домен пользователя, может отличаться от серверного, например, пользователь входит в домен test.test.com, а контроллер домена находится на test.com.

"AdSync.User"

"administrator"

Логин пользователя. Чтобы использовалась учетная запись, под которой запущен Chronos, данный параметр необходимо не заполнять.

"AdSync.Password"

"Master1234"

Пароль пользователя, используется вместе с "ADSync.User".

"AdSync.UseSSL"

false

Использовать SSL шифрование.

Далее необходимо открыть карточку "Синхронизация AD / LDAP" (правое меню в Tessa Client - "Настройки→Синхронизация AD / LDAP") и заполнить eё:

image338
  • В поле "Группа синхронизации сотрудников" указывается DN группы, из которой будут синхронизироваться сотрудники. В случае, если поле не заполнено, будут синхронизированы все сотрудники из корневых элементов;

  • Флаг "Не переименовывать статические роли" позволяет не изменять имя роли в соответствии с именем в LDAP для созданных в системе статических ролей;

  • В таблице "Корневые элементы синхронизации (OU)" указываются OU, которые вместе с иерархией дочерних переносятся в карточки Подразделений, а элементы – в карточки Сотрудников/Статических ролей. Задаются в формате DN. Можно выбрать тип объекта для синхронизации;

  • Блок "Периодическая синхронизация" отвечает за периодическую синхронизацию и позволяет отключить синхронизацию конкретных видов карточек;

  • Блок "Ручная синхронизация" позволяет запустить ручную синхронизацию конкретных типов объектов.

    Перед синхронизацией каждого сотрудника система также проверяет, входит ли данный сотрудник в группу, указанную в поле "Группа синхронизации сотрудников". Если сотрудник не входит в эту группу, то он игнорируется и не будет синхронизирован. Если поле "Группа синхронизации сотрудников" не заполнено, то сотрудник будет синхронизирован.

    Если ни один корневой элемент не задать, синхронизация Сотрудников, Подразделений и Статических ролей работать не будет.

Автоматическая синхронизация будет выполняться сервисом Chronos с периодом, указанным в плагине AdSyncRecurrentPlugin. По умолчанию плагин запускается раз в сутки в полночь.

5.3. Ручная синхронизация

Синхронизацию можно выполнять по требованию: синхронизировать отдельные карточки Сотрудников, Подразделений, Статических ролей или запустить полную синхронизацию.

Предварительно необходимо выполнить все настройки, описанные в разделе Автоматическая синхронизация (кроме включения плагина AdSyncRecurrentPlugin).

Запустить полную синхронизацию Сотрудников, Подразделений или Статических ролей можно открыв карточку настроек "Синхронизация AD / LDAP" и нажав на соответствующие кнопки в блоке "Ручная синхронизация":

image339

Синхронизация выполняется асинхронно. После запуска синхронизации будет создана операция, по которой можно отслеживать прогресс синхронизации. Список всех активных операций можно посмотреть на рабочем месте Администратор, представление "Прочее → Активные операции".

Также, при необходимости, можно выполнить синхронизацию отдельного объекта, т.е. конкретной карточки Сотрудника, Подразделения или Статической роли. Открыв нужную карточку необходимо раскрыть блок "Синхронизация с Active Directory / LDAP", нажав левой кнопкой мыши на названии блока. По умолчанию во всех карточках он свёрнут.

image340

В раскрывшемся блоке есть следующие поля:

image341
  • Дата последней синхронизации - дата и время последней синхронизации текущей карточки;

  • Дата последнего изменения - дата и время последнего изменения текущего объекта в Active Directory / LDAP;

  • Уникальное имя (DN) - уникальное имя объекта в Active Directory / LDAP;

  • Active Directory / LDAP ID - идентификатор объекта в Active Directory / LDAP;

  • Синхронизация отключена - флаг для отключения синхронизации текущей карточки;

  • Синхронизируется независимо от корневых элементов - флаг для синхронизации, даже если объект не принадлежит к дереву корневых элементов;

  • Кнопка "Запустить ручную синхронизацию" - кнопка для запуска ручной синхронизации текущей карточки.

В случае, если необходимо связать уже созданные в Tessa Подразделения, Сотрудников или Статические роли, то можно заполнить поле "Уникальное имя (DN)" и выполнить ручную синхронизацию. Синхронизация найдет запись в домене по указанному DN и свяжет записи между собой. Связывание выполняется по атрибуту objectGuid.

Сотрудники, добавленные в Подразделение или Статическую роль вручную (у Сотрудника не заполнено поле AdSyncID), а так же Сотрудники с флагом "Синхронизация отключена" не удаляются из состава роли/подразделения при синхронизации Подразделений.

5.4. Алгоритм работы синхронизации

После того, как операция синхронизации была создана вручную или периодическим плагином Chronos (AdSyncRecurrentPlugin), её подхватывает плагин AdSyncPlugin, который обрабатывает операции раз в 30 секунд (по умолчанию, настраивается в configuration/AdSyncPlugin.xml).

В первую очередь проверяется возможность перерасчёта ролей (раздел Активные операции). Если плагин не смог взять эксклюзивную блокировку (потому что длительное время выполнялась другая операция с ролями, такая как пересчёт замещений), то в лог пишется предупреждение, работа плагина при этом завершается (до следующего запуска).

После взятия блокировки из операции извлекается тип операции: синхронизация отдельной карточки или всех объектов.

  1. Если выполняется синхронизация отдельной карточки (например, по кнопке в карточке сотрудника):

    1. Для заданного типа проверяются все объекты с заполненным DN, но пустым AdSyncID, и выполняется поиск соответствий для объектов в системе и в Active Directory / LDAP.

    2. После этого по AdSyncID синхронизируемой карточки запрашивается объект из Active Directory / LDAP.

    3. После получения объекта выполняется синхронизация значений его свойств.

  2. Если выполняется синхронизация всех объектов:

    1. Проверяются все объекты с заполненным DN, но пустым AdSyncID, и выполняется поиск соответствий для объектов в системе и в Active Directory / LDAP.

    2. Система получает список ID корней, для которых включена синхронизация. После этого выполняется рекурсивный обход всех дочерних корней и проверяется, принадлежат ли они к списку корней, для которых включена синхронизация.

    3. Если принадлежат, то выполняется синхронизация выбранных в настройках объектов.

    4. После того, как рекурсивно будет пройден весь лес Active Directory / LDAP, проверяются объекты в системе, у которых выставлен флаг "Синхронизируется независимо от корневых элементов". Такие объекты синхронизируются как отдельные карточки (см выше).

    5. После завершения синхронизации, если не было никаких ошибок, происходит скрытие элементов, которые не были обновлены системой, - такие объекты считаются удалёнными в домене, и поэтому для них устанавливается флаг "Скрывать при выборе", фактического удаления не происходит.

6. Роли

Для каждой роли в системе создается отдельная карточка. В системе Tessa предусмотрено несколько типов ролей:

  • Сотрудник - карточка сотрудника;

  • Подразделение - в составе роли подразделения указываются сотрудники. Можно создать любую древовидную структуру подразделений, указывая "Родительское подразделение" в карточке подразделения;

  • Статическая роль - статическая роль, в состав которой добавляются нужные сотрудники. Может использоваться для настройки прав доступа или отправки заданий на всех сотрудников роли;

  • Контекстная роль - роль, зависящая от контекста карточки. Например, в типовом решении есть настроенные контекстные роли: Руководитель Инициатора (сотрудник, являющийся руководителем подразделения, в которое входит Инициатор процесса согласования); Автор документа (сотрудник, указанный в карточке документа в поле "Автор") и т.д.

  • Метароль - агрегирующая роль, создается автоматически плагином Chronos для каждого подразделения, которое содержит дочерние. В роль входят все сотрудники родительского, а также дочерних подразделений.

  • Динамическая роль - роль, автоматически пересчитываемая по указанному SQL запросу плагином сервиса Chronos. Например, роль "Все сотрудники".

Просмотреть список всех карточек ролей можно из рабочего места Администратора, представление – Роли:

image159

В представлении можно выполнить фильтр по типу роли.

6.1. Создание новой роли

Создать новую роль в системе можно с помощью правого меню системы: Создать карточку – Роли – выбрать тип создаваемой роли.

Создание карточки нового сотрудника описано в разделе Заведение нового пользователя/администратора в системе.

Загрузить большое количество Сотрудников, Подразделений и Статических ролей в Tessa можно с помощью синхронизации с Active Directory / LDAP, а с помощью утилиты tadmin можно загрузить Сотрудников и Подразделения.

6.2. Добавление заместителей

Добавление заместителей доступно для следующих типов ролей:

Рекомендуется использовать Карточка "Мои замещения" для настройки замещений.
  • Сотрудник;

  • Департамент;

  • Статическая роль.

Для каждой роли можно указать заместителей, которые, в случае отсутствия замещаемого сотрудника, смогут выполнить за него задания. Для добавления заместителей в карточке роли (Сотрудник, Департамент или Статическая роль) в области Заместители нажать на кнопку Добавить:

image160

В открывшемся окне указать заместителя и срок замещения:

image161
  • Заместитель – сотрудник, кому станут доступны задания текущего сотрудника/департамента/роли;

  • Замещаемый пользователь – замещаемый сотрудник. Если в данном поле указан сотрудник, то все задания этого сотрудника (Новые и взятые В работу) будут доступны заместителю. Если поле оставить пустым, то заместителю будут доступны только Новые задания сотрудника/департамента/роли (задания, взятые В работу каким-либо сотрудником, не будут доступны заместителю).

  • Замещение доступно – флаг для включения/отключения замещения;

  • Постоянное замещение – флаг выставляется, если текущее замещение не ограничено сроком;

  • Начало/Окончание замещения – срок замещения указывается, если это не постоянное замещение.

Таким образом, для каждой роли можно добавить несколько заместителей. Для удаления заместителя – выбрать заместителя и нажать кнопку Удалить в области Заместители.

При добавлении заместителя в колонке Активно по умолчанию установлено "нет". Периодический сервис на сервере приложений (Chronos) в указанные сроки замещения добавляет заместителя в состав роли. При этом в поле "Пользователи и заместители" этот пользователь появляется, а в таблице с замещениями колонка "Активно" переключается на "да". Сервис Chronos обрабатывает роли с периодичностью несколько минут, поэтому замещение включается ("Активно" переключается на "да") спустя некоторое время.

Указанным заместителям в указанные сроки будут доступны все задания замещаемого сотрудника.

Задания, которые были отправлены на временную роль "Исполнители задания" (т.е. роль, сформированную при отправке одной задачи на несколько исполнителей) не будут доступны заместителям, т.к. список заместителей для таких задач рассчитывается в момент отправки задачи. Однако, новые задачи, отправляемые на роль "Исполнители задания" (где в составе роли и текущий сотрудник) будут доступны указанным заместителям.
Заместитель помимо прав на исполнение заданий получит все права доступа замещаемого сотрудника/роли (т.е. права на просмотр отчетов, создание/редактирование карточек, просмотр реестров и т.д.). Таким образом, если замещение назначено на роль, то заместитель получит права, доступные для данной роли. Если замещение назначено на сотрудника, то заместитель получит права, доступные только данному сотруднику (исключая права, назначенные на роли, в которые входит этот сотрудник).

6.3. Карточка "Мои замещения"

Для каждого пользователя системы настраивать замещения можно с помощью карточки "Мои замещения" (дополнительная вкладка в карточке сотрудника):

image161 1

В карточке для заполнения доступны следующие поля:

  • Кто может редактировать - можно указать сотрудников, кому будет доступно редактирование заместителей текущего сотрудника;

  • Заместители - раздел для добавления заместителей. Для добавления новой строки нажать на кнопку "Добавить", откроется форма добавления замещения:

image161 2

  • Список ролей – список ролей, для которых настраивается замещение. В данном поле могут быть указаны: Статические роли, Контекстные роли, Подразделения, а также обобщающие роли:

    • Все статические роли - замещение на задания, назначенные на любые статические роли, в которые входит текущий сотрудник;

    • Все роли и подразделения - замещение на все задания, назначенные на текущего сотрудника и на все типы ролей, в которые входит сотрудник;

    • Все подразделения - замещение на все задания, назначенные на подразделения, в которые входит текущий сотрудник;

    • Лично я - замещение на все задания, назначенные на текущего сотрудника;

При указании в поле "Список ролей" значений Лично я, Все роли и подразделения или <ФИО сотрудника> - заместитель помимо прав на исполнение заданий получит все права доступа замещаемого сотрудника/роли (т.е. права на просмотр отчетов, создание/редактирование карточек, просмотр реестров и т.д.). Таким образом, если замещение назначено на роль, то заместитель получит права, доступные для данной роли. Если замещение назначено на сотрудника, то заместитель получит права, доступные только данному сотруднику (исключая права, назначенные на роли, в которые входит этот сотрудник).
  • Заместители – список сотрудников, кому будут доступны все задания указанных ролей текущего сотрудника;

  • Замещение доступно – флаг для включения/отключения замещения;

  • Постоянное замещение – флаг выставляется, если текущее замещение не ограничено сроком;

  • Начало/Окончание замещения – срок замещения указывается, если это не постоянное замещение.

Таким образом, для сотрудника можно добавить несколько заместителей на разные роли:

image161 3

Заместителям будут доступны как новые задания, так и задания, взятые в работу основным исполнителем.

Задания, которые были отправлены на временную роль "Исполнители задания" (т.е. роль, сформированную при отправке одной задачи на несколько исполнителей) не будут доступны заместителям, т.к. список заместителей для таких задач рассчитывается в момент отправки задачи. Однако, новые задачи, отправляемые на роль "Исполнители задания" (где в составе роли и текущий сотрудник) будут доступны указанным заместителям.

6.4. Настройки сотрудника

В каждой карточке сотрудника есть вкладка Мои настройки. Все настройки, указанные на данной вкладке каждый пользователь может менять себе сам (правая панель системы - кнопка Мои настройки).

У Администратора есть права для изменения настроек любого пользователя. Настройки поделены на несколько вкладок:

image161 7

Вкладка "Мои настройки":

  • Общие настройки:

    • Отключить встроенный предпросмотр PDF - отключить предпросмотр файлов PDF встроенными средствами Tessa и использовать внешнюю программу для предпросмотра, если она установлена.

    • Отключить затемнение неактивного окна - если флаг установлен, то окно приложения затемняется, когда оно становится неактивным. При этом область предпросмотра файлов может очищаться. Для отключения описанного поведения флаг необходимо снять.

    • Отключить все всплывающие уведомления - все всплывающие уведомления будут отключены (такие уведомления обычно отображаются в правом нижнем углу экрана). Это настройка не затрагивает уведомления email и другие виды уведомлений;

    • Разрешить предпросмотр через несколько внешних программ - разрешить предпросмотр одновременно через несколько внешних программ (на разных вкладках). Настройка не затрагивает встроенный предпросмотр или веб-браузер.

      Когда настройка отключена, то при активации предпросмотра через внешнюю программу на одной вкладке, очищается область предпросмотра через внешнюю программу в другой вкладке. Если включить настройку, то несколько одновременно активных внешних программ предпросмотра могут приводить к ошибкам в приложении.

    • Рабочие места, открываемые при запуске - перечисляются рабочие места, которые необходимо отображать по умолчанию при запуске приложения. Одно и то же рабочее место можно указать несколько раз, если требуется, чтобы при запуске приложения данное рабочее место было продублировано в нескольких вкладках. Если в данном поле ничего не указано, то пользователю будет открыто первое доступное рабочее место.

  • Типовое решение:

    • Отключить всплывающие уведомления по заданиям - отключает периодически всплывающие уведомления о том, что доступны новые задания;

  • Настройки учетной записи:

    • Сбросить все настройки - сбросить все настройки текущего пользователя на настройки по умолчанию. А именно: настройки показа боковых панелей, настройки затемнения неактивного окна, добавленные в дерево папки и поисковые запросы, настроенные группировки и показ колонок в представлениях.

    • Сохранить и применить настройки для сотрудников - кнопка для копирования настроек, указанных для текущего сотрудника в карточки других сотрудников. При нажатии на кнопку откроется окно, где можно указать сотрудников, для кого необходимо применить данные настройки. Можно указать любые роли (кроме контекстных), в том числе роль "Все сотрудники", если настройки надо распространить на всех сотрудников.

      image161 8

Вкладка "Боковые панели":

  • "Боковые панели" – настройка вызова правой/левой боковых панелей в веб-клиенте по нажатию левой кнопкой мыши, а не по наведению курсора.

Вкладка "Web клиент":

  • "Боковые панели" – настройка вызова правой/левой боковых панелей в веб-клиенте по нажатию левой кнопкой мыши, а не по наведению курсора.

Сам для себя изменить настройки Администратор может или в своей карточке сотрудника, или с помощью вызова окна настроек из правой панели системы - кнопка Мои настройки.

image161 9

В открывшемся окне все настройки аналогичны настройкам в карточке сотрудников.

С помощью кнопки "Мои настройки" → "Настройки новых пользователей" открывается диалог настроек, аналогичный диалогу "Мои настройки", но применяемый для всех новых сотрудников. Новыми считаются любые сотрудники, создаваемые после установки настроек.

7. Настройка типового решения

7.1. Включение типов карточек в типовое решение

Чтобы у карточки были доступны такие возможности типового решения, как маршруты, задачи, система прав или выделение номера, ее нужно включить в типовое решение.

Настройка выполняется через карточку настроек (в рабочем месте Tessa Client), доступную только администраторам и открываемую из правой боковой панели через пункт "Настройки → Типовое решение".

image126

При нажатии на плитку выводится карточка настроек.

image127

Настройки типового решения разделены на три вкладки:

Вкладка "Общие настройки":

  • Прямой порядок в листе согласования - выбор способа отображения информации по циклам согласования в автоматически формируемом листе согласования (пример показан ниже);

  • Скрыть комментарий для варианта завершения "Согласовать" - в заданиях типового процесса согласования для варианта завершения "Согласовать" скрыть поле для ввода комментария. При этом для варианта "Не согласовать" ввод комментария будет доступен.

  • Разрешить ручной ввод и автоматическое создание контрагентов - для всех типов документов, включённых в типовое решение, включить возможность вводить в поле "Контрагент" произвольное значение. После сохранения такой карточки документа автоматически будет создана новая карточка Контрагента с указаным наименованием.

  • Типы карточек - типы карточек, для которых будут использоваться различные возможности типового решения (подробное описание см. далее).

  • Расширения безопасности - дополнительные расширения безопасности (более подробно в руководстве разработчика).

  • Настройки системы:

    • Язык уведомлений по умолчанию - язык отправляемых системой почтовых уведомлений по умолчанию (в случае, если язык не установлен в карточке сотрудника);

    • Уведомление о необходимости изменить токен подписи - сотрудники, кому необходимо отправить уведомление в случае, если требуется сменить токен для подписи.

Вкладка "Настройки задач" - таблица для добавления сотрудников, которые имеют право на отправку заданий от имени руководителей (более подробное описание и примеры описаны в руководстве далее):

  • Руководители - список руководителей, от имени кого указанным ролям будет доступно отправлять задачи;

  • Роли, которые могут отправлять задачи - список ролей (сотрудники, департаменты, роли), которые смогут отправлять задачи от имени указанного руководителя.

Вкладка "Уведомления" - настройка текста уведомления, отсылаемого сотруднику при возврате задания из отложенного.

7.2. Порядок записей в листе согласования

Настройка "Прямой порядок в листе согласования" позволяет задать прямой порядок циклов согласования и записей внутри цикла. Опция применяется и для обычного и для печатного листа согласования в процессе согласования.

image128
image129

7.3. Типы карточек, включенные в типовое решение

В таблице указываются типы карточек, для которых будут использоваться различные возможности типового решения.

Если для карточки используются типы документов, то карточки данного типа будут всегда с типом документа и настройки указываются в карточках типов документов.

image130

Тип документа:

image131

И его настройки:

image132

Если же для карточки не используются типы документов, то такой же набор настроек доступен непосредственно из карточки настроек типового решения – для типа карточки.

image133

7.4. Типы документов и типы карточек

Для того чтобы можно было быстро сделать много похожих видов документов, в типовом решение предусмотрена возможность использования т.н. типов документов. Предназначено для быстрой настройки.

Возможность появляется, если у типа карточки в настройках типового решения установлен флаг "Использовать типы документов" и для типа карточки включены соответствующие поля из секции DocumentCommonInfo.

image134

Терминология:

Тип карточки – тип карточки, описанный как отдельный тип в Tessa Admin, со своей отдельной структурой (набором полей) и внешним видом.

Тип документа – подвид типа карточки. Все документы разных типов, но одного типа карточки – имеют одинаковый набор полей, форму, но могут иметь разные права, нумерацию, возможность регистрации, использования маршрутов, типовых задач.

Типы документов создаются как элементы справочника типов документов. Правая панель "Создать карточку –> Справочники → Типы документов".

image131

В системе предусмотрены четыре базовых типа карточки, на основе которых можно настраивать собственные типы документов. Основные отличия описаны ниже.

Входящий – имеет поле для ввода контрагента - отправителя.

Исходящий – имеет поле для ввода контрагента – получателя.

Договорной документ – является базой для любых документов, где есть сумма, валюта, и контрагент. Обычно это договор, ДС, акт, счет-фактура и т.д.

Документ – база для внутренних документов.

Все базовые типы карточек имеют общие поля, которые не используются в типовом решении и добавлены для удобства. Если они не находят применения в конкретном внедрении –их можно просто скрыть в настройках формы типа карточки в Tessa Admin.

image135

Это подразделение, получатели, исполнители. Их логика не определена типовым решением, и в каждом конкретном внедрении их можно использовать или не использовать, вкладывая в них различный смысл.

Еще раз обращаем внимание, что типы карточек и базовые типы документов предоставляются для удобства и могут меняться или не использоваться в каждом конкретном решении. Можно настраивать собственные типы карточек в Tessa Admin и включать их в типовое решение.

7.5. Выделение номера

Для типов карточек или документов, включенных в типовое решение, можно настроить типовую логику работы с номерами.

Разделяют два типа номера – основной и проектный.

Если карточка получает постоянный номер сразу же – то этот номер называется основным.

Если карточка сначала использует временный проектный номер, например проект договора, а в какой-то момент (обычно при регистрации, см. ниже) получает постоянный – то постоянный номер заменяет проектный и становится основным. При этом проектный номер сохраняется в карточке, чтобы по нему можно было искать или на случай отзыва регистрации.

Номер, который сейчас является основным, всегда виден в поле на основной вкладке карточки.

image136

Существуют следующие настройки выделения номера.

image137

Автоматическое выделение номера

  • При создании. Номер выделяется в момент создания карточки.

  • При сохранении. Номер выделится при первом сохранении.

  • Не выделять. Не выделять номер автоматически.

Флаг "Разрешить выделять вручную" - разрешает использование меню поля с номером – выделить и освободить номер. Обратите внимание, что пользователю нужны на это права (см. ниже).

Флаг "Освобождать номер при удалении" - очевиден из названия. Если тип карточки удаляется в корзину, то номер будет освобожден при удалении из корзины.

"Выделять из последовательности" - поле для ввода шаблона имени последовательности.

Каждая последовательность – это одна последовательность номеров. При указании имени последовательности можно указывать различные плейсхолдеры, такие как {yyyy} – год (см. ниже).

Например, если указана последовательность с именем Incoming_{yyyy}, то в момент выделения номера система определит дату документа, возьмет оттуда год, сформирует точное имя последовательности "Incoming_2015" и выделит оттуда номер. Это позволяет начинать нумерацию заново каждый год, месяц, никогда, и т.д.

Если разные типы карточек используют последовательность с одним и тем же именем – они будут иметь общую нумерацию.

Доступные плейсхолдеры:

Плейсхолдер Описание

{yyyy}

Номер года документа, например 2012.

{00000n}

Используется только для номера. Позволяет дополнять номер нулями до нужной длины.

{yy}

Последние две цифры номера года.

{MM}

Номер месяца вида "06".

{MMM}

Номер месяца вида "Jun".

{MMMM}

Номер месяца вида "June".

{dd}

Номер дня "03".

{M}

Номер месяца "6".

{d}

Номер дня "3".

При формировании номера могут быть использованы также более сложные плейсхолдеры, которые возвращают скаляр (одну строку):

Пример

Допустим, вы используете нумератор с именем вида Входящие-{YYYY}-{f:MainInfo.FolderName}. В карточке у вас есть поле "Папка" (MainInfo.FolderId, FolderName), где вы выбираете папку из номенклатуры дел. Если поле не заполняется автоматически сразу при создании карточки (специальным расширением), а должно выбираться регистратором, то для корректной работы в данном случае необходимо настроить:

  • выделение номера при сохранении;

  • поле сделать обязательным.

В таком случае регистратор создаст карточку (без номера), заполнит поле Папка, сохранит карточку и при этом автоматически выделится корректный номер из нумератора с именем вида Входящие-2015-ПИСЬМА, т.е. все будет корректно работать и серия номеров будет для каждой папки своя.

Если же, например, сделать это поле необязательным и кто-нибудь его не заполнит, то номер выделится из нумератора вида Входящие-2016-.

При создании карточки типового решения автоматически заполняются поля:

  • Регистратор - сотрудник, создавший карточку,

  • Дата создания - текущие дата / время,

  • Тип документа - тип текущего документа, например, "Служебная записка".

Можно написать дополнительные расширения, которые будут заполнять другие поля, и эти значения будут использованы при выделении номера с настройкой "выделять при создании".

Поле Формат полного номера - как будет выглядеть полный номер. Используются вышеописанные плейсхолдеры и любые суффиксы/префиксы и т.д. При помощи программных расширений можно реализовывать собственные плейсхолдеры.

7.6. Регистрация

Если в настройках типа карточки/документа стоит флаг "Использовать регистрацию", то будет доступна регистрация документа.

Регистрация – это просто перевод карточки в состояние "Зарегистрировано". Пользователю нужны права на осуществление этой операции. Это бывает удобно, когда необходимо:

  • Разделить права до и после регистрации. Например, в организации не используют маршруты для исходящих документов. Пользователь просто подготавливает проект и в какой-то момент времени отправляет регистраторам. Те проверяют и нажимают кнопку "Зарегистрировать". При этом правила доступа могут быть настроены так, что автор теряет доступ на редактирование зарегистрированного документа.

  • Выделить постоянный номер после регистрации при использовании проектного номера или вообще не использовать проектный номер.

Надо заметить, что зарегистрирована может быть и карточка, в которой используется маршрут. При этом регистрация документа, по которому завершен процесс (например, документ согласован), переводит его в состояние "Зарегистрирован", документ, процесс по которому не завершен – сначала отзовет процесс, затем уже зарегистрирует.

Документ можно отозвать с регистрации (для этого тоже нужны права). При этом он возвращается в то состояние, в котором был зарегистрирован (Согласован, Проект или др.) и также возвращается проектный номер (если был) и освобождается постоянный номер (если был выделен).

Настройка выделения номера при регистрации аналогичны выделению номера при создании.

image138

Регистрация предназначена для удобства и быстрой настройки.

7.7. Использование задач

Если в настройках типа карточки\документа стоит флаг "Использовать типовой процесс отправки задач", то по этому типу карточки можно будет отправлять задачи. При этом пользователю все равно нужны права на создание задач (см. ниже). Также в настройках типа карточки в Tessa Admin должен стоять флаг "Использовать задания".

image139

Если стоит флаг "Отключить проверку даты для подзадач", то будет отключена проверка даты при создании подзадачи. По умолчанию система ограничивает возможную дату завершения подзадачи по правилу:

  • Если родительская задача не просрочена, то ее дата завершения + 1 рабочий день.

  • Если просрочена, то текущая дата + 1 рабочий день.

7.8. Настройка представления со списком доступных авторов

Пользователь может отправить задание от имени другого пользователя. Список доступных этому пользователю авторов управляется представлением "WfResolutionAuthors". Представление выводит список доступных авторов, согласно настройкам, которые указаны в карточке настроек типового решения на вкладке "Настройка задач".

image140

Из примера (см. изображение) видно, что задачи от имени "Васильева В.В." могут отправлять сотрудники "Петров П.П." и "Соколов С.С.". Так же подобные настройки справедливы не только для персональных ролей, но и для департаментов, а так же любых других ролей, кроме контекстных. Подобная настройка указана во второй строке, которая позволяет любому сотруднику, входящему в департамент "Бухгалтерия", отправлять задания от имени пользователей "Набоков Н.П." и "Пенкин И.В.".

На скриншоте ниже приведён пример того, как пользователь "Администратор", при отправке от имени, может выбрать только пользователя "Васильев В.В.". Это продиктовано настройками, указанными в примере выше.

image141

7.9. Использование маршрутов

При установке флага "Использовать маршруты" в карточку данного типа добавляется вкладка "Маршрут", содержащая информацию о маршруте и возможности для управления процессом.

Снятие флага в настройках, при наличии в системе карточек этого типа, для которых был начат процесс, может привести к негативным последствиям.

7.9.1. Автоматическое согласование

Если в типе документа (или в настройках типового решения для типа документа) включены маршруты, то есть возможность настроить автоматическое согласование документов. В случае если установлен флаг "Автоматически согласовывать просроченные задания согласования", система будет сама завершать задания, просроченные на срок равный или более, чем указан в настройках. Так же система будет уведомлять о том, что документ будет автоматически согласован, с указанием даты планируемого автоматического согласования. Срок уведомлений так же указывается в настройках. Если срок уведомлений не указан, то система не будет предупреждать о планируемом автоматическом согласовании.

image184
image185

Задания будут согласовываться от пользователя "System", с указанием комментария, указанного в настройках, или с комментарием по умолчанию, если необходимая строка в настройках не указана.

Для функционирования автоматического согласования, необходимо, чтобы сервис "Chronos" был запущен и настроен, а также в папке плагина сервиса "Chronos" присутствовал файл лицензии (см. Замена лицензии).

7.10. Шаблоны файлов и плейсхолдеры

7.10.1. Карточка шаблона файла

В системе имеется возможность настроить шаблоны файлов, по которым из карточек документов или из представлений можно будет формировать файлы документов с автоматическим заполнением некоторых данных.

Создать новый шаблон файла можно с помощью правого меню системы - Создать карточку - Справочники - Шаблон файла:

image141 1

Будет открыта новая карточка шаблона файла. Необходимо заполнить следующие поля:

  • Название - название шаблона файла;

  • Группа - группа, в которую входит шаблон (не обязательно для заполнения). Группы могут использоваться для логической группировки шаблонов (при выборе их из карточки документа), например, группа "Письма":

    image141 3
  • Тип шаблона - карточка или представление. Указывается, где будет использоваться данный шаблон (для конкретных карточек документов или для представлений);

  • Доступно ролям - список сотрудников/ролей, которым будет доступно создание файлов по данному шаблону;

  • Типы/Представления - в зависимости от выбранного Типа шаблона в данном поле указывается список типов документов или список представлений, для которых будет использоваться данный шаблон файла;

  • Алиасы плейсхолдеров - можно определить алиас с заданным названием, затем он подставляется в текст документа вместо плейсхолдера алиаса (более подробное описание см. в разделе Алиасы плейсхолдеров);

  • Файлы - секция для добавления шаблонного файла. Для одного шаблона можно добавить только один файл.

image141 2

Шаблонный файл может быть только одним из следующих типов: docx, xlsx (xlsm, если с макросами), html или txt.

При формировании файла по шаблону из карточки документа или представления, вместо плейсхолдеров будут подставлены данные из полей карточки/представления (или данные из связанных таблиц).

Непосредственно в имени файла, приложенного к шаблону, также можно прописывать любые плейсхолдеры и алиасы, которые будут заменены в имени файла. При формировании имени открываемого файла символы, некорректные для файловой системы (такие как кавычки, двоеточия и др.) будут заменены на подчёркивание _, но, если файл прикладывается к карточке, то имя сохраняется как есть. Расширение файла не должно содержать плейсхолдеры. Примеры: Договор-{f:DocumentCommonInfo.FullNumber}.docx, {*alias} {$LocalizationString}.xlsx.

Плейсхолдеры необходимо вставить непосредственно в текст самого документа - docx, xlsx, html или txt.

Новые шаблоны файлов станут доступны для использования только после перезапуска пользователем Tessa Client.

Просмотреть список всех шаблонов файлов в системе можно из рабочего места Администратора, папка Прочие - Шаблоны файлов:

image141 4

Шаблон файла можно открыть на редактирование с помощью двойного клика левой кнопкой мыши в представлении на нужном шаблоне. В открытой карточке шаблона для редактирования приложенного файла необходимо открыть его в соответствующем режиме, нажав на приложенном файле правую кнопку мыши - Открыть для редактирования:

image141 7

В Типовом решении можно посмотреть пример настроенных шаблонов печати:

  • В формате docx - Протокол совещания;

  • В формате html - Мои задания;

  • В формате xlsx - Мои задания (Excel), Протокол совещания (Excel).

7.10.2. Алиасы плейсхолдеров

В списке алиасов в карточке шаблона файла можно определить алиас с заданным названием, затем он будет подставлен в текст документа вместо плейсхолдера алиаса:

image141 8
Имя алиаса не должно содержать пробельных символов или переводов строк (по диапазонам Unicode). Рекомендуется указывать алиасы английскими буквами.
Пример

Например, в документе есть строка: Тема документа: {*subject}. И в списке алиасов шаблона есть строка:

subject f:DocumentCommonInfo.Subject trim

Тогда при разборе выражения будет выполняться замена плейсхолдеров для строки: Тема документа: {f:DocumentCommonInfo.Subject trim}.

Алиасы работают для любых плейсхолдеров, в т.ч. для плейсхолдеров таблиц и плейсхолдеров, добавленных в расширениях.

7.10.3. Плейсхолдеры

Описанные в данном разделе плейсхолдеры используются как при формировании номера документа (см. Выделение номера), так и в шаблонах файлов.

Список доступных плейсхолдеров с их кратким описанием представлены в таблице (а также ссылки на соответствующие разделы с подробным описанием плейсхолдеров):

Плейсхолдер Описание

Плейсхолдер {f:…​}

Универсальный плейсхолдер, который позволяет вывести значение из любого поля карточки, а также соединить любое поле карточки с данными любых других таблиц, чтобы вывести значение из этих таблиц.

Плейсхолдер {t:…​}

Используется для вывода нескольких значений в виде таблицы или списка, где каждая строка (или элемент списка) содержит одну или несколько колонок.

Плейсхолдеры {fv:…​} и {tv:…​}

Аналогичны плейсхолдерам {f:…​} и {t:…​} (соответственно), но позволяют отобразить результаты выполнения представления с заданным алиасом, в данных по таблицам.

Плейсхолдеры {n}, {0n}, {00n} и др.

Используется для вывода номера строки в таблице, или номер элемента списка.

Дополнительные плейсхолдеры

Различные дополнительные плейсхолдеры, которые могут использоваться в шаблонах файлов.

Скалярное значение (одну строку) возвращают плейсхолдеры {f:…​} и {fv:…​}, а также плейсхолдеры {t:…​} и {tv:…​}, если используются с параметром separate by (separator string) (т.е. все значения списка объединяются в одну строку с указанным разделителем).

Плейсхолдер {f:…​}

Плейсхолдер {f:…​} - универсальный плейсхолдер, который позволяет вывести значение из любого поля карточки, а также соединить любое поле карточки с данными любых других таблиц, чтобы вывести значение из этих таблиц.

Примеры использования:

  1. {f:DocumentCommonInfo.AuthorName} – автор документа, это поле карточки AuthorName из секции DocumentCommonInfo.

    Если какой-то секции или поля нет (не удалось выполнить выборку), то вместо плейсхолдера подставляется пустая строка (см. ниже пример).
  2. {f:DocumentCommonInfo.AuthorID-(UserID)->RoleUsers.ID->DepartmentRoles.ID->Roles.Name} – сложная выборка "Департамент автора", которая соединяет поле карточки AuthorID из секции DocumentCommonInfo (т.е. идентификатор автора документа) с данными из таблиц RoleUsers, DepartmentRoles и Roles (в указанной последовательности), чтобы получить название департамента.

    Посредством стрелок → определяется способ соединения таблиц:
    • Section1.Field1->Section2.Field2:
      Система возьмет текущее значение поля карточки Section1.Field1 и использует его для выборки поля Field2 из таблицы Section2 по условию Section2.ID = Section1.Field1. Например, если в карточке есть ссылка на сотрудника в каком-то поле, то вы можете выбрать из справочника сотрудников его адрес электронной почты: DocumentCommonInfo.AuthorId->PersonalRoles.Email.

      Эквивалентная выборка
      select Field2 from Section2 where Id = Section1.Field1
    • Section1.Field1=>Section2.Field2:
      Аналогично предыдущему, но строка из связанной таблицы выбирается по RowId. Это нужно, если поле ссылается на строку в дочерней секции (справочника или другой карточки).

      Эквивалентная выборка
      select Field2 from Section2 where RowId = Section1.Field1
    • Section1.Field1-(KeyField)->Section2.Field2:
      Также выбирает значение из таблицы Section2, но выборка строки происходит по полю KeyField.

      Эквивалентная выборка
      select Field2 from Section2 where KeyField = Section1.Field1
      Если сложная выборка вернёт более одной строки, то данные строки будут выведены через точку с запятой. Например, плейсхолдер {f:OutgoingRefDocs.DocID->DocumentCommonInfo.FullNumber} выведет полные номера документов, с которыми связан текущий: Дпр-00004; Исх-00001; П-000231.
  3. В плейсхолдере также можно через ещё одно двоеточие дописать строку форматирования, например: {f:DocumentCommonInfo.CreationDate:dd/MM/yyyy HH\:mm} (разделитель между часами и минутами выводится с эскейп-символом \:, более подробное описание см. в разделе Плейсхолдер {t:…​}, Возможные параметры форматирования, п. 10).

    Будет подставлена дата создания карточки из поля CreationDate, отформатированное как "dd/MM/yyyy HH:mm" (день.месяц.год часы:минуты, т.е. 18.02.2016 12:01). Строка форматирования используется для преобразования значения поля в строку стандартными для .NET средствами (актуально для значений, отличных от строки, например, дата/время или число).

  4. Также значения данного плейсхолдера можно отсортировать, выбрать уникальный distinct или применить иное форматирование (кроме группировки - group by). Описание возможностей аналогично плейсхолдеру {t:…​}, см. Возможные параметры форматирования в плейсхолдере.

Плейсхолдер {t:…​}

Плейсхолдер {t:…​} нужен для вывода нескольких значений в виде таблицы или списка, где каждая строка (или элемент списка) содержит одну или несколько колонок (для списка это просто несколько значений рядом).

Внутри строки таблицы/элемента списка рекомендуется использовать плейсхолдеры, связанные с одной и той же таблицей, чтобы результат был ожидаемым (по одной строке таблицы на каждую строку результата).

Группировка (см. ниже) позволяет объединять и как угодно группировать любые данные из различных таблиц.

{t:Секция1.Поле1→Секция2.Поле2 distinct top 5 group by Секция2.Поле3, Секция1.Поле4 order by Секция1.Поле5 desc, Секция2.Поле6 format as (* [$LocalizedString]: [0]) separate by (;\n) utc trim:custom format}

Группировку/сортировку рекомендуется указывать только для первого плейсхолдера в строке, чтобы результат был ожидаемым (в порядке объявления в документе).

Однако, в особо сложных случаях, группировка и сортировка для плейсхолдеров в пределах строки могут отличаться. При этом при незаданной группировке она наследуется от предыдущего плейсхолдера (по порядку объявления).

Сортировка не наследуется и указывается индивидуально для каждого плейсхолдера, но часто сортировку не имеет смысла дублировать в плейсхолдерах, т.к. первый плейсхолдер определяет порядок выводимых строк, а остальные плейсхолдеры обычно только добавляют колонки в строки первого плейсхолдера.

Возможные параметры форматирования в плейсхолдере:

  1. Секция1.Поле1→Секция2.Поле2 - аналогично плейсхолдеру {f:…​}, т.е. таблиц может быть несколько, их можно объединять по ID ->, по RowID =>, по любой другой колонке - (ParentRowID) ->.

  2. distinct - определяет, что в результаты запроса попадут только строки, которые были определены как отличающиеся в результатах запроса. Аналогично запросу SQL вида select distinct. Это позволяет, например, вывести только фамилии исполнителей, которые отличаются между собой.

  3. top N - указываем, что требуется выбрать не больше, чем заданное количество строк из результатов. Например, top 10 для вывода первых десяти или top 1 для вывода первой строки (независимо от их количества).

  4. group by Секция2.Поле3, Секция1.Поле4 - позволяет указать, по каким ключевым колонкам строки будут объединяться между собой. По умолчанию (когда выражение group by не указано) объединение выполняется по Секция1.RowID, где Секция1 - это первая заданная секция. В выражении может быть опущено название секции, тогда будет использоваться первая заданная секция.

    Например, group by ParentRowID будет группировать строки по колонке Секция1.ParentRowID. Если запрос к базе данных вернёт больше одной строки с одними и теми же значениями ключевой колонки ParentRowID (в этом примере), то эти значения будут объединяться в пределах группы (строки таблицы) через символ разделителя (по умолчанию точка с запятой) по аналогии с выводом плейсхолдера {f:…​}. Например, будет отображена одна строка таблицы Иванов И.И.; Петров П.П. и другая строка Сидоров С.С. (т.к. первые две строки из результатов запроса имели одинаковый ParentRowID, а третья строка имела отличающийся ParentRowID).

  5. order by Секция1.Поле5 desc, Секция2.Поле6 - указание сортировки, которая выполняется при запросе данных из SQL. Если указано несколько колонок, то выполняется сначала сортировка по первой колонке, затем по второй. Необязательное слово desc указывает, что сортировка выполняется по убыванию, а asc - по возрастанию (по умолчанию). В примере выполняется сначала сортировка строк результата по колонке Секция1.Поле5 по убыванию, а затем в пределах одинакового значения в Поле5 - по колонке Секция2.Поле6 по возрастанию. Если секцию не указать, то будет выполнена сортировка по колонке первой таблицы.

    Например, order by Order указывает, что сортировка будет выполнена по колонке Секция1.Order. Указание сортировки особенно удобно для упорядоченных коллекционных секций карточки. Если выражение order by не задано, то сортировка будет произведена по результирующей колонке по возрастанию, в примере это Секция2.Поле2.

  6. format as (format string) - указывает, что каждое значение при выводе должно быть дополнительно отформатировано с учётом строки формата format string. Строка формата соответствует такой строке в стандартном выражении String.Format в .NET, где вместо фигурных скобок участвуют квадратные. В такой строке могут быть встроенные строки локализации.

    Например, format as (* [$LocalizedString]: [0]) аналогично вызову String.Format("* {$LocalizedString}: {0}", value), где подстрока {$LocalizedString} будет заменена на строку локализации, а {0} - это позиция для выводимого значения value. Символы \n соответствуют переводу строки.

  7. separate by (separator string) - определяет формат строки-разделителя separator string между несколькими значениями в пределах одной группы (для плейсхолдера {f:…​} это будут любые несколько значений). По умолчанию используется разделитель "; ", т.е. "точка с запятой и пробел". Символы \n соответствуют переводу строки. Разделитель ;\n означает, что между значениями будут вставлены точка с запятой и перевод строки. Например:

    Иванов И.И.;

    Петров П.П.;

    Сидоров С.С.

  8. utc - если значение, возвращаемое плейсхолдером, является датой (соответствует типам SQL: Date, DateTime, DateTime2), то оно выводится без приведения к локальному времени пользователя, который генерирует документ по шаблону. При выводе дат по умолчанию выводятся дата и время, приведённые к локальному времени, для типов SQL DateTime и DateTime2. Указание utc позволяет не выполнять корректировку времени в соответствии с часовым поясом пользователя. Тип данных SQL Date по умолчанию выводится как только дата (без времени), при этом не выполняется приведение к локальному времени, т.е. настройка utc работает по умолчанию и игнорируется при явном указании.

  9. trim - после окончательного формирования строки, которая заменяет плейсхолдер, удаляются начальные и конечные символы пробелов, табуляций и переводов строк (в соответствии с определением таких символов в таблицах Unicode). Например, из строки `Иванов И.И.; Петров П.П. ` будет удалён конечный пробел.

  10. custom format - дополнительное форматирование, выводимое в конце выражения плейсхолдера после двоеточия. Например, для вывода типа SQL DateTime как дата и время без секунд, можно использовать строку dd.MM.yyyy HH\:mm. Разделитель между часами и минутами выводится с эскейп-символом \:. Если нужен символ \, то его следует задвоить \\. Указанное значение аналогично использованию форматирования типов данных .NET через IFormattable.ToString(), в этом примере: dateTimeValue.ToString("dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture).

Если в выражениях плейсхолдера двоеточие используется в месте, не предусмотренном стандартным форматированием, например: format as (value: [0]), то при отсутствии явно заданной строки форматирования "custom format" требуется завершить определение плейсхолдера двоеточием, т.е. так, будто бы строкой "custom format" является пустая строка. Например: {t:OutgoingRefDocs.DocID→DocumentCommonInfo.AuthorName format as (Автор: [0]):}. Аналогично и для плейсхолдеров {f:…​}, {fv:…​}, {tv:…​}.

Все выражения, кроме списка таблиц в пункте 1, не обязательны для указания.

Плейсхолдеры {fv:…​} и {tv:…​}

Аналогичны плейсхолдерам {f:…​} и {t:…​} (соответственно), но позволяют отобразить результаты выполнения представления с заданным алиасом, в данных по таблицам.

Пример:

{tv:АлиасПредставления.ОтображаемаяКолонка top 5 with param АлиасПараметраCardID group by Колонка2, Колонка3 order by Колонка4 desc, Колонка5 format as (* [$LocalizedString]: [0]) separate by (;\n) utc trim:custom format}

  1. АлиасПредставления - это алиас представления, которое будет выполнено. Представление выполняется независимо от прав доступа пользователя на это представление (выполнение происходит на сервере, а возможность выполнить представление определяется только правами на использование шаблона файла). Не рекомендуется выдавать права доступа на роли для представлений, используемых только в шаблонах, т.к. это даст пользователю возможность выполнить представление без фильтрации по карточке, получив доступ ко всем данным в БД.

  2. ОтображаемаяКолонка - название колонки, возвращаемое представлением, которая будет отображена в плейсхолдере.

  3. top N - указывает, что требуется выбрать не больше, чем заданное количество строк из результатов. Если представление поддерживает пейджинг, то выбирается первая страница размером в N строк. Если представление не поддерживает пейджинг, то будут выбраны все строки, после чего заданное количество строк будет отображено, а остальные строки - игнорированы.

  4. with param АлиасПараметраCardID - указывает алиас параметра представления, в который будет передан идентификатор карточки, для которой генерируется шаблон. Если это выражение не задано, то идентификатор карточки не передаётся и представление не будет зависеть от карточки. Если шаблон генерируется из представления, то передается идентификатор текущего пользователя.

  5. group by Колонка2, Колонка3 - группировка строк в плейсхолдере {tv:…​} по названиям колонок, возвращаемых представлением. Если группировка не указана, то строки не группируются и возвращаются в том виде и в том же порядке, в котором их возвращает представление.

  6. order by Колонка4 desc, Колонка5 - сортировка, выполняемая в представлении по заданным колонкам. Сортировка выполняется средствами самого представления, а задаваемые колонки - это алиасы колонок, способ сортировки по которым определяется в представлении. Необязательное слово "desc" указывает, что сортировка выполняется по убыванию, а "asc" - по возрастанию (по умолчанию). Если выражение не указано, то выполняется сортировка по умолчанию, заданная в метаинформации представления #view.

  7. format as (* [$LocalizedString]: [0]) - форматирование каждого возвращаемого значения. Аналогично выражению format as для плейсхолдеров {f:…​} и {t:…​}.

  8. separate by (;\n) - указание разделителя между несколькими значениями в пределах группы (строки таблицы для {tv:…​}) или для всех возвращённых значений в плейсхолдере {fv:…​}. Аналогично выражению separate by для плейсхолдеров {f:…​} и {t:…​}.

  9. utc - вывод значения без корректировки по часовому поясу пользователя. Форматирование дат и корректировка часового пояса работает аналогично плейсхолдерам {f:…​} и {t:…​}.

  10. trim - удаление начальных и конечных пробельных символов. По аналогии с выражением в {f:…​} и {t:…​}.

  11. custom format - дополнительное форматирование. По аналогии с выражением в {f:…​} и {t:…​}.

Плейсхолдеры {n}, {0n}, {00n} и др.

При использовании в строке таблицы (или в элементе списка) данный плейсхолдер выводит номер строки. Это удобно для вывода номера строки отдельной колонкой.

Пример

{n} - {t:OutgoingRefDocs.DocDescription order by Order}

Выведет информацию по ссылкам на другие документы с указанием номера каждой ссылки:

  1. - Дпр-0003

  2. - И-0002

Указание {00n} дописывает нули до определённой длины, т.е. номер "5" выводит как "005".

Дополнительные плейсхолдеры

Дополнительные плейсхолдеры в основном используются в шаблонах файлов, но также могут быть использованы и при формировании номера:

  • Плейсхолдеры для вывода текущей даты/времени:

    • {date} - заменяется на текущую дату/время. В параметрах плейсхолдера можно указать формат отображения, например: {date:dd/MM/yyyy}.

    • {yyyy} - заменяется на четырехзначное указание года, например 2018.

    • {yy} - заменяется на двухзначное указание года, например 17.

    • {M} - заменяется на числовое обозначение текущего месяца, например 6.

    • {MM} - заменяется на числовое обозначение текущего месяца, например 06.

    • {MMM} - заменяется на текстовое обозначение текущего месяца (3 символа), например Jun.

    • {MMMM} - заменяется на текстовое обозначение текущего месяца, например June.

    • {dd} - заменяется на обозначение текущего дня, например 03.

    • {d} - заменяется на обозначение текущего дня, например 3.

      Например, плейсхолдеры {dd}.{MM}.{yyyy} заменятся на текущую дату в формате 28.03.2018.

  • {cardDigest} - заменяется на дайджест текущей карточки.

  • {$LocalizationString} - такой плейсхолдер заменяется на строку с алиасом LocalizationString, локализованную для языка текущего пользователя.

    Например, строка {$ApprovalHistory_Header} заменяется на "Approval history" для англоязычных пользователей и на "Лист согласования" для русскоязычных пользователей.

  • {userID} - заменяется на идентификатор текущего пользователя (выполняющего генерацию файла по шаблону), например: ffe132a8-23fc-4a5b-ac75-70e0b7854c59.

  • {userName} - заменяется на имя текущего пользователя, например: Иванов И.И.

  • {serverCode} - заменяется на текущий код сервера (полезно при формировании ссылок tessa://), например: prod.

  • {instanceName} - заменяется на текущее имя экземпляра сервера (полезно при формировании ссылок tessa://), например: tessa.

  • {sessionID} - заменяется на идентификатор текущей сессии, например: dde132a8-23fc-4a5b-ac75-70e0b7854c59.

  • {cardID} - заменяется на идентификатор карточки (для которой генерируется файл по шаблону), например: 12d8cf28-9902-4dfd-8cbc-0f8a4d994691.

  • {cardLink} - заменяется на ссылку tessa:// на открытие текущей карточки, например: tessa://tessaclient.prod?Action=OpenCard&ID=12d8cf28-9902-4dfd-8cbc-0f8a4d994691&Name=Карточка.

  • {webCardLink} - аналогично {cardLink}, только заменяется на ссылку для открытия карточки в легком клиенте.

  • {webAddress} - заменяется на ссылку на базовый адрес веб-клиента с завершающим слешом, т.е. на https://address.org/tessa/web/.

    Данный плейсхолдер, например, можно комбинировать в документе HTML, чтобы дать ссылку на узел дерева в рабочем месте по идентификатору узла:

    <a href="{webAddress}views/ef0523b2-7fad-45d4-a44d-cac7ea392ced">Ссылка на узел дерева "Мои задания"</a>

    Идентификатор узла можно узнать в Tessa Admin, вкладка Рабочие места - выбрать нужный узел в дереве и далее, в свойствах в параметре Id скопировать идентификатор выбранного узла.

  • {appLink} и {webAppLink} - заменяется на ссылку на приложение (толстый и лёгкий клиент соответственно). Используется, например, для отправки уведомления на почту сотрудникам с информацией об окончании срока действия пароля.

  • {passwordExpires} - генерируется из карточки сотрудника, заменяется на срок окончания действия пароля у сотрудника. Срок вычисляется следующим образом: "Дата и время последнего изменения пароля" в карточке сотрудника + "Срок действия пароля" в карточке Настройки сервера. Используется для отправки уведомления на почту сотрудникам с информацией об окончании срока действия пароля.

  • {link:Action} - заменяется на ссылку tessa:// с указанием действия (по умолчанию OpenCard для открытия карточки или файла), например: tessa://tessaclient.prod?Action=Parameter

  • {text:any text} - заменяется на текст, заданный в параметрах. Если текст содержит двоеточие, то в плейсхолдер следует завершить на двоеточие, например: {text:some text: other text:}

7.10.4. Особенности шаблонных файлов для представлений

В шаблоне файла для представления в плейсхолдерах {fv:…​} и {tv:…​} можно не указывать алиас представления, т.к. это будет выбранное представление (т.е. представление, из которого формируется файл по шаблону). При этом, при формировании файла по шаблону, будет учитываться предварительно настроенная фильтрация в представлении.

В случае, если мы указываем представление в плейсхолдере {fv:…​} или {tv:…​} (т.е. плейсхолдеры заданы для одного представления, а формироваться файл по шаблону будет из другого представления), то данное представление будет выгружено без учета параметров (т.е. без учета фильтрации в представлении). Данный функционал (выгрузка представления с учетом фильтрации), при необходимости, можно реализовать с помощью дополнительных расширений (см. Руководство Администратора).

Любые скаляры (т.е. плейсхолдеры, которые возвращают одно значение, см. Плейсхолдеры) также можно использовать в шаблонных файлах для представлений. Плейсхолдеры {f:…​}, {t:…​} будут выполнены в контексте карточки текущего сотрудника, то есть {f:PersonalRoles.Name} - вернет имя текущего сотрудника. Для плейсхолдеров {fv:…​} и {tv:…​} в параметр, указанный в with param, передается идентификатор текущего пользователя.

7.10.5. Примеры создания шаблонов файлов в формате docx

Пример docx шаблонного файла, в котором указаны плейсхолдеры, представлен на рисунке ниже (слева). Сформированный из карточки входящего документа по данному шаблону файл представлен на рисунке справа:

image141 5

В docx шаблонных файлах может использоваться плейсхолдер {t:…​} для вывода значений в таблицу, в виде списка или нумерованного списка.

Рассмотрим конкретные примеры:

  1. Пример вывода данных в виде нумерованного списка:

    Выведем список карточек, на которые ссылается текущая карточка, с указанием после запятой автора карточки.

    В файле .docx добавим строку: {t:OutgoingRefDocs.DocID->DocumentCommonInfo.FullNumber}, автор {t:OutgoingRefDocs.DocID->DocumentCommonInfo.AuthorName}
    Далее преобразуем данную строку в нумерованный список:

    image141 19

    При формировании файла по данному шаблону из карточки исходящего документа для каждой строки результата будет добавлена строка с очередным номером и заданным содержимым:

    image141 20
  2. Аналогично можно вывести данные в виде списка:

    image141 21
  3. И последний пример - выведем те же данные, но в виде таблицы:

    Добавим в docx документ новую таблицу с тремя колонками.

    В первой строке таблицы указываем название колонок: , Карточка, Автор. Во второй строке таблицы указываем плейсхолдеры:

    • {n} - порядковый номер записи;

    • {t:OutgoingRefDocs.DocID->DocumentCommonInfo.FullNumber} - номер карточки;

    • {t:OutgoingRefDocs.DocID->DocumentCommonInfo.AuthorName} - автор карточки.

    image141 22

    При формировании файла по данному шаблону из карточки исходящего документа для каждой строки результата в таблицу будет добавлена новая строка с очередным заданным содержимым:

    image141 23

Для указания в файле ссылок, например, на связанные карточки, необходимо в ворд файле указать гиперссылку:

image141 9

В поле Адрес указывается ссылка в следующем виде: https://tessalink/?link=ссылка_с_плейсхолдерами, т.е. в нашем примере в качестве гиперссылки указываем https://tessalink/?link=tessa://tessaclient.{serverCode}/{instanceName}?Action=OpenCard&ID={t:OutgoingRefDocs.DocID}&Name={t:OutgoingRefDocs.DocDescription}:

image141 10

Далее данную ссылку необходимо сделать в виде нумерованного списка.

После указания гиперссылки если снова открыть окно редактирования гиперссылки, то в поле Адрес можно заметить, что некоторые символы автоматически заменены, например: tessa://tessaclient.%7bserverCode%7d/?…​ Это связано с особенностями работы Word, вносить правки в ссылку не требуется, файл по шаблону будет формироваться корректно.

На рисунках ниже представлен docx шаблонный файл (на рисунке слева) и файл, сформированный из карточки входящего документа по данному шаблону (на рисунке справа):

image141 11

Аналогично можно давать ссылки на файлы и версии файлов, например, на лист согласования текущего документа: tessa://tessaclient.{serverCode}?Action=OpenCard&ID={f:DocumentCommonInfo.ID}&Name={f:DocumentCommonInfo.FullNumber}&FID=fd70bd20-ba8c-420f-9fc7-55c6c8898235&VID=bb68360d-7690-4163-b985-a0a88abe5f21.

Описание плейсхолдеров можно посмотреть в разделе Плейсхолдеры.

Примеры настроенных docx шаблонов можно посмотреть в Типовом решении (вкладка Администратор - Прочее - Шаблоны файлов):

  • Протокол совещания - шаблонный файл используется для формирования протокола совещания из карточки Протокола.

7.10.6. Примеры создания шаблонов файлов в формате html

Пример html шаблонного файла, в котором указаны плейсхолдеры представлен на рисунке ниже (слева). Сформированный из карточки входящего документа по данному шаблону файл представлен на рисунке справа:

image141 6

Для вывода данных построчно (например, список заданий в Листе согласования) используется специальный тэг <_row> …​ {t:…​} …​ {t:…​} …​ </_row>. Всё содержимое внутри тэга дублируется для каждой строки, которая получена от плейсхолдеров внутри строки в результате выполнения запроса SQL. На рисунке ниже представлен пример части .html кода (слева) и сформированный по шаблону файл (справа):

image137 1

Html шаблоны также могут использоваться для выгрузки представлений. Для вывода данных построчно используется тот же тег <_row>, внутри которого содержатся нужные плейсхолдеры.

Примеры настроенных html шаблонов можно посмотреть в Типовом решении (вкладка Администратор - Прочее - Шаблоны файлов):

  • Лист согласования - шаблонный файл может использоваться для карточек документов, у которых используется типовой процесс согласования.

  • Мои задания - шаблонный файл используется для выгрузки данных из представления Мои задания.

Группировка в шаблонных файлах формата html

Также в html доступен тег для группировки данных в таблице - <_group>, внутри которого может быть один или ни одного <_row>. Любые плейсхолдеры, входящие в <_group> и не входящие в <_row>, считаются группирующими. Т.е. группировка происходит по всем плейсхолдерам ({t:…​} или {tv:…​}), которые используются в области группы. Они объединяются в строку и по ней производится группировка. В области группы также могут быть еще любые плейсхолдеры, которые возвращают скаляры (т.е. одну строку).

Параметр для плейсхолдера is group, может использоваться только в области строки (<_row>), но вне области группировки.

На рисунке ниже представлена часть кода html страницы, которая должна выводить список заданий (из представления Мои задания). Группировка по полю Тип задания (плейсхолдер {tv:TypeCaption}). В колонках таблицы должна отображаться информация: состояние задания, информация по заданию, выполнить к (плановая дата/время завершения задания), до завершения (срок до завершения задания), карточка (ссылка на карточку документа, отображается номер карточки):

image141 17

При формировании из представления Мои задания файла по данному шаблону результирующий документ будет выглядеть следующим образом:

image141 18

Описание плейсхолдеров можно посмотреть в разделе Плейсхолдеры.

7.10.7. Примеры создания шаблонов файлов в формате txt

Пример txt шаблонного файла, в котором указаны плейсхолдеры представлен на рисунке ниже (слева). Сформированный из карточки договора по данному шаблону файл представлен на рисунке справа:

image336

В txt шаблонных файлах для построчного вывода и группировки данных используются те же теги, что и для html: <_row> и <_group>. На рисунке выше пример, где построчно выведена информация из секции "Ссылки". Используемый в примере форматтер #wrap описан далее.

Txt шаблоны также могут использоваться для выгрузки представлений.

7.10.8. Примеры создания шаблонов файлов в формате xlsx

Для шаблонов документов в формате Excel (если предполагается, что данные в документ будут записываться построчно, например, при выгрузке представления) помимо плейсхолдеров необходимо задать служебное имя для диапазона ячеек. С помощью данных имен указывается тип добавления новой записи в таблицу, а также группировки.

Имя диапазона ячеек Описание

r_AreaName

При добавлении новых строк они добавляются путем копирования и вставки новых строк.

Пример: в таблице строка 31, где заданы алиасы плейсхолдеров (см Алиасы плейсхолдеров), указан диапазон ячеек с именем r_Decided:

image141 28

В результирующем файле в таблицу путем копирования и вставки новых строк добавлены все записи из карточки протокола:

image141 29

j_AreaName

При добавлении новых строк они добавляются путем заполнения существующих строк.

Пример: для двух таблиц в строках 12-13, где заданы алиасы плейсхолдеров (см Алиасы плейсхолдеров), указаны диапазоны ячеек с именами соответственно j_Participants и j_Reports:

image141 26

В результирующем файле в каждую таблицу путем заполнения существующих строк добавлены все записи из карточки протокола:

image141 27

g_AreaName

Группировка строк по параметру. Внутри диапазона ячеек с группировкой обязательно должен содержаться диапазон с именем r_AreaName.

Пример можно посмотреть далее, в разделе Группировка в шаблонных файлах формата xslx.

AreaName - любое уникальное имя диапазона ячеек.

Для указания имени диапазона ячеек необходимо сначала выделить нужные ячейки и после указать имя:

image141 24

Диспетчер имен (окно для просмотра, редактирования, удаления имен диапазонов) можно открыть нажав в Excel сочетание клавиш Ctrl + F3:

image141 25

Более подробно о настройке xslx шаблонного файла описано далее.

Примеры настроенных xslx шаблонов можно посмотреть в Типовом решении (вкладка Администратор - Прочее - Шаблоны файлов):

  • Мои задания (Excel) - шаблонный файл используется для выгрузки данных из представления Мои задания;

  • Протокол совещания (Excel) - шаблонный файл используется для формирования протокола совещания из карточки Протокола.

Группировка в шаблонных файлах формата xslx

Группировка происходит по всем плейсхолдерам ({t:…​} или {tv:…​}), которые используются в области группы. Они объединяются в строку и по ней производится группировка. В области группы также могут быть еще любые плейсхолдеры, которые возвращают скаляры (т.е. одну строку). Параметр для плейсхолдера is group, может использоваться только в области строки (r_AreaName или j_AreaName), но вне области группировки.

В данном разделе рассмотрим пример создания шаблонного файла в формате xlsx для представления "Мои задания": вывод списка моих заданий с группировкой по одному плейсхолдеру - Тип задания.

А также в данном примере будем использовать Алиасы плейсхолдеров:

t_type          tv:TypeCaption
t_state         tv:StateName
t_role          tv:RoleName
t_result        tv:TaskInfo
t_date          tv:PlannedDate
t_completed     tv:TimeToCompletion

Формируем Excel файл, где прописываем заданные алиасы плейсхолдеров. Для колонки Карточка (ссылка на карточку) указываем ссылку в следующем формате (более подробно о плейсхолдерах в разделе Плейсхолдеры):

tessa://tessaclient.{serverCode}/{instanceName}?Action=OpenCard&ID={tv:CardID}&Name={tv:CardName}

image141 13

В данном примере будет настроена группировка по {*t_type}, т.е. типу задания.

Далее задаем имя для диапазона ячеек. Это необходимо для того, чтобы вся информация из представления записалась в таблицу построчно.

Выделяем ячейки в строке с плейсхолдерами (кроме ячейки с группировкой - {t_type}) и задаем для них имя (имя указываем с обязательным служебным префиксом r_):

image141 14

Теперь зададим группировку. Необходимо выделить диапазон ячеек, включающий группировку, плюс диапазон r_Test. Для выделенного диапазона задаем имя (имя указываем с обязательным служебным префиксом g_):

image141 15

Шаблонный файл готов, его можно сохранить и добавить к карточке Шаблона файла. При формировании файла по данному шаблону из представления Мои задания результирующий файл будет выглядеть следующим образом:

image141 16

Аналогично, как и для docx документов, ссылку в результирующем документе можно вывести в виде гиперссылки. Для этого в шаблонном файле для ячейки со ссылкой на карточку указываем гиперссылку:

image141 30

В поле Адрес указывается ссылка в следующем виде: https://tessalink/?link=ссылка_с_плейсхолдерами, т.е. в нашем примере в качестве гиперссылки указываем https://tessalink/?link=tessa://tessaclient.{serverCode}/{instanceName}?Action=OpenCard&ID={tv:CardID}&Name={tv:CardName}.

После указания гиперссылки если снова открыть окно редактирования гиперссылки, то в поле Адрес можно заметить, что некоторые символы автоматически заменены, например: tessa://tessaclient.%7bserverCode%7d/?…​​ Это связано с особенностями работы Excel, вносить правки в ссылку не требуется, файл по шаблону будет формироваться корректно.

7.10.9. Форматтеры и вставка изображений в плейсхолдеры

Форматтеры позволяют модифицировать текст (выполнять форматирование результата, полученного из плейсхолдера) или вместо текста вывести изображение. Они работают для форматирования всех стандартных плейсхолдеров.

Форматтеры выводятся вместо стандартного форматирования после двоеточия (см. примеры ниже).

Также форматтеры можно объединять в цепочки, разделяя их через точку с запятой. Подробное описание цепочек форматтеров и примеры см. в разделе Цепочки форматтеров.

Список доступных форматтеров с их кратким описанием представлен в таблице (а также ссылки на соответствующие разделы с подробным описанием форматтера):

Форматтер Описание

#image

Форматтер изображения - на входе получает массив байт, например, из поля в базе данных, и на выходе формирует его как изображение.

#barcode

Получает строку текста и вставляет её как штрих-код указанного формата.

#qrcode

Получает строку текста и вставляет её как QR-код указанного формата.

#format

Применяется для форматирования полученного текста, например, даты (аналогично форматированию в плейсхолдерах).

#align

Применяется для выравнивания полученного текста.

#wrap

Применяется для выравнивания полученного текста c переносом на следующую строку, если размер превышает допустимый предел.

#file

Форматтер загружает заданный файл или версию файла по идентификатору и представляет как массив байт, который можно направить в другие форматтеры, например, в #image или #text.

#text

Форматтер представляет заданный массив байт как текст.

#cardLink и #webCardLink

Форматтеры, преобразующие входящий Guid в ссылку на карточку (в толстом и легком клиенте соответственно). Пример использования см. в разделе Цепочки форматтеров.

#noencode

Форматтер, который предотвращает вызов Encode-методов для плейсхолдера при замене его в документе. Актуально, в частности, для HTML документов, для которых в форматтере можно вставлять HTML-разметку, которая будет вставлена именно как тэги HTML, а не как обычный текст.

При использовании форматтеров, которые вставляют изображение (т.е. #image, #barcode, #qrcode) для шаблонов html на месте плейсхолдера при формировании документа по шаблону автоматически будет сгенерирован тэг объект <image />, содержащий бинарные данные изображения и разные параметры. Пример html шаблона см. в разделе Форматтер #barcode.

Для корректной вставки изображений в шаблоны форматов Word и Excel необходимо в шаблоне добавить объект типа "Надпись" и в тексте надписи указать плейсхолдер (или алиас).

Если данные, по которым строится изображение (#image), штрих-код (#barcode) или QR-код (qrcode) вернули "null" (в т.ч. только пробелы) или массив байт нулевого размера (из представления, базы данных, другого форматтера и т.д.), то в документе HTML тег <image/> не генерируется на месте плейсхолдера, а в документах Word и Excel объект "Надпись" будет удалён.

Форматтер #image

Форматтер изображения на входе получает массив байт, например, из поля в базе данных, и на выходе формирует его как изображение.

#image(w=300;h=200;img=jpeg;alt=Image text;reformat)

Описание параметров форматтера изображения:

  • w - ширина изображения, если размер не указан в параметрах, то используется либо исходный, либо тот, который есть у надписи в Word/Excel.

  • h - высота изображения, если размер не указан в параметрах, то используется либо исходный, либо тот, который есть у надписи в Word/Excel.

  • img - указывается тип изображения при вставке в документ. При этом не выполняет конвертацию, а просто указывает на исходный тип картинки. По умолчанию это PNG.

    В HTML для всех современных браузеров и в Word/Excel изображение успешно отобразится с параметром по умолчанию, даже если его тип отличен от PNG, но если вдруг возникнут проблемы и изображение не будет отображено, то можно задать тип явно. Доступны типы (соответствующие одноимённым форматам): bmp, emf, exif, gif, icon, jpeg, png, tiff, wmf. Укажите unknown, если тип неизвестен и об этом надо явно оповестить браузер или Word/Excel.
  • alt - используется, чтобы задать альтернативный текст в тех случаях, когда картинка недоступна или когда её должен прочитать голосовой помощник Windows.

    Может использоваться во всех типах шаблонов - html, Word, Excel. Для Word-а замещающий текст можно просмотреть, вызвав контекстное меню правой кнопкой мыши по изображению и выбрав пункт "Замещающий текст" (или выбрав "Формат рисунка" - для более старых версий Word). При включении голосового помощника вместо изображения будет зачитан указанный текст.

    Замещающий текст также может содержать локализацию, например:

    #qrcode(t=url;alt=$KrTypes_DocTypes_Incoming)

    Если в данном параметре требуется помимо строки локализации указать какой-то текст, то необходимо записывать в следующем формате:

    #qrcode(t=url;alt={$KrTypes_DocTypes_Incoming} - Ссылка на карточку)

    При необходимости указании плейсхолдера с таким форматтером (который содержит в себе фигурные скобки) необходимо использовать Алиасы плейсхолдеров, иначе документ не будет формироваться корректно.
  • reformat - используется только в Word/Excel. Если данное свойство не указано, то при вставке изображения в объект "надпись" все параметры надписи (включая рамку, обтекание текстом и соотношение сторон) будут сохранены. Если reformat указан, то параметры надписи будут сброшены, и они будут определяться исключительно указанной шириной/высотой (или же шириной/высотой исходного изображения). Для документа HTML свойство reformat игнорируется.

Перечисленные свойства применимы для всех форматтеров изображений. При вставке в HTML на месте плейсхолдера будет сгенерирован тэг объект <image />, содержащий бинарные данные изображения и разные параметры.

Для Word и Excel надо вставить объект типа "надпись" и в тексте надписи указать плейсхолдер (или алиас плейсхолдера). Надпись будет заменена на объект "Рисунок" с изображением.

Пример

Для примера возьмем иконку из стандартного представления "Приложения" (Администратор - Прочее - Приложения), и отобразим её в файле шаблона в виде изображения размером 300х300 пикселей.

В шаблонном документе Word создадим таблицу, в левой колонке отобразим имя приложения с помощью плейсхолдера {tv:Applications.AppName}, во второй колонке добавим две области "Надпись", в каждой из которых плейсхолдер получает иконку и с помощью форматтера отображает изображение размером 300х300: {tv:Applications.Icon:#image(w=300;h=300)}.

image277

Поскольку плейсхолдер табличный, то в таблице он для каждого приложения отобразит его иконку и в результирующем файле, сформированном по данному шаблону, мы увидим:

image278

Форматтер #image также может сконвертировать входящее изображение в формат png:

#image(png;…​прочие параметры).

Если на входе было изображение в .bmp (или любое другое), то оно будет сконвертировано в .png. Если на входе уже был .png, то конвертация не выполняется и изображение показывается в исходном виде. В отличие от остальных перечисленых параметров, этот работает только для форматтера #image и нужен он в случае, если изображение в исходном виде не отображается в документе, или оно занимает слишком много места (как в случае с .bmp).

Форматтер #barcode

Форматтер штрих-кода получает строку текста и вставляет её как штрих-код. Штрих-код всегда выводится как изображение png.

Строка, полученная от плейсхолдера, должна содержать только корректные для формата символы. Например, использование русских букв для штрих-кода будет некорректно и оно приведёт к ошибке в момент формирования документа.

Форматтер может содержать как все вышеперечисленные параметры (описанные в разделе Форматтер #image), так и параметр t, где указывается тип штрих-кода.

Возможные типы штрих-кодов (описание типа можно найти по названию в интернете): UPCA, UPCE, UPC_SUPPLEMENTAL_2DIGIT, UPC_SUPPLEMENTAL_5DIGIT, EAN13, EAN8, Interleaved2of5, Standard2of5, Industrial2of5, CODE39, CODE39Extended, CODE39_Mod43, Codabar, PostNet, BOOKLAND, ISBN, JAN13, MSI_Mod10, MSI_2Mod10, MSI_Mod11, MSI_Mod11_Mod10, Modified_Plessey, CODE11, USD8, UCC12, UCC13, LOGMARS, CODE128, CODE128A, CODE128B, CODE128C, ITF14, CODE93, TELEPEN, FIM, PHARMACODE.

Если формат не указан, то используется формат по умолчанию - CODE128.

Пример

Создадим шаблон файла для входящего документа, где будет выводиться номер документа в виде штрих-кода. В шаблоне добавляем область "Надпись", где указываем плейсхолдер для получения номера карточки и форматтер для вывода штрих-кода:

{f:DocumentCommonInfo.FullNumber:#barcode(t=ean13;w=150;h=30)}

В результирующем файле мы видим сформированный штрих-код (правый рисунок):

image279

Чтобы в Word/Excel изображение выводилось без "рамки", можно либо использовать параметр reformat, описанный выше, либо в формате фигуры средствами Word/Excel убрать границу у надписи.

Аналогичный пример в формате html:

image281

Может быть указан опциональный параметр l, позволяющий вывести метку с текстом штрих-кода рядом с изображением. По умолчанию метка не выводится. Текст выводится как часть изображения и вставляется соответствующим образом в документ. Если вам нужно вставить текстовое представление штрих-кода как текст, то вместо этого параметра добавьте в шаблон файла второй текстовый плейсхолдер, связанный с тем же полем.

Возможные значения параметра l (без учёта регистра): None (метка не выводится), TopLeft (метка с текстом выводится сверху слева от изображения), TopCenter (метка с текстом выводится сверху по центру от изображения), TopRight (метка с текстом выводится сверху справа от изображения), BottomLeft (метка с текстом выводится снизу слева от изображения), BottomCenter (метка с текстом выводится снизу по центру от изображения), BottomRight (метка с текстом выводится снизу справа от изображения).

Пример

Используем параметр l для вывода метки снизу по центру от графического представления:

{f:DocumentCommonInfo.FullNumber:#barcode(t=ean13;l=bottomcenter;w=150;h=30)}

image369
Форматтер #qrcode

Фортматтер QR-кода аналогичен форматтеру штрих-кода. QR-код позволяет как кодировать любой текст, так и специальные действия, которые можно считать смартфоном и как-то обработать.

Например, может быть QR-код со ссылкой на веб-страницу (URL), телефонным номером для возможности позвонить по этому номеру или добавить его в контакт, адресом email, на который надо написать письмо, и др.

Помимо параметров, описанных в разделе Форматтер #image у данного форматтера есть еще дополнительные параметры:

  • t - задается тип QR-кода. Доступны следующие типы:

    • Text - QR-код, вставляемый в виде текста.

    • Url - QR-код, вставляемый как URL-ссылка. Если протокол не указан, то используется http://.

    • Email - QR-код, вставляемый как mailto-ссылка для заданного email получателя.

    • SMS - SMS-сообщение, отправляемое на заданный телефонный номер.

    • MMS - MMS-сообщение, отправляемое на заданный телефонный номер.

    • Phone - QR-код, вставляемый как телефонный номер.

    • Skype - QR-код, вставляемый как звонок заданному пользователю Skype.

    • WhatsApp - QR-код, вставляемый как WhatsApp-сообщение заданному пользователю.

      Если тип не указан, то используется тип по умолчанию t=Text.

  • ecc - определяет уровень коррекции ошибок для генерируемого QR-кода, т.е. определяет объём нечитаемой информации, при наличии которой QR-код всё равно корректно распознаётся смартфоном. Более высокий уровень означает больший размер генерируемого изображения. Доступны следующие варианты:

    • L - 7% информации может быть потеряно.

    • M - 15% информации может быть потеряно.

    • Q - 25% информации может быть потеряно.

    • H - 30% информации может быть потеряно.

      Если параметр не указан, по умолчанию используется ecc=Q.

  • utf8 - определяет факт того, что текст кодируется в UTF8 внутри QR-кода. Если флаг не указан, то используется другая кодировка, определяемая стандартном QR-кода, обычно это ISO-8859-1.

    Этот параметр может влиять на считывание QR-кода некоторыми устройствами. По умолчанию не рекомендуется указывать.

  • bom - определяет необходимость вставки специальных символов BOM (byte order mark) в начале строки для кодирования UTF-8; используется совместно с флагом utf8.

    Этот параметр может влиять на считывание QR-кода некоторыми устройствами. По умолчанию не рекомендуется указывать.

  • px - количество пикселей в т.н. блоке QR-кода, который влияет на размер генерируемого изображения (или на чёткость изображения при вставке в документ с явно указанными размерами).

    По умолчанию значение px=2, допустимо значение "1" или больше.

Пример

В шаблон файла для входящего документа добавим QR-код для звонка контактному лицу контрагента, указанного в карточке.

Для отображения QR-кода создадим область "Надпись", где укажем плейсхолдер для получения номер телефона контактного лица контрагента и форматтер для вывода QR-кода типа Phone:

{f: DocumentCommonInfo.PartnerID→Partners.Phone:#qrcode(t=phone)}

В результирующем файле мы видим сформированный QR-код (правый рисунок):

image280
Форматтер #format

Форматтер аналогичен форматированию в плейсхолдерах, т.е. {f:DocumentCommonInfo.DocDate:dd.MM.yyyy} и {f:DocumentCommonInfo.DocDate:#format(f=dd.MM.yyyy)} равнозначны и вернут одинковый результат.

Данный форматтер нужен, чтобы иметь возможность передать его дальше по цепочке форматтеров. Например, генерируем QR-код по строке с датой: {f:DocumentCommonInfo.DocDate:#format(f=dd.MM.yyyy);qrcode}

Также он может использоваться для локализации полученных данных. Например, если в поле "Тема" карточки документа помимо обычного текста вставлена строка локализации, то для корректного вывода в шаблоне необходимо указать:

{f:DocumentCommonInfo.Subject:#format(localize)}

при этом строка локализации на входе должна быть в формате $String или text {$String} text.

Форматтер #align

Форматтер #align используется для выравнивания текста в заданном направлении:

#align(right=30;trim;char=.)

Описание параметров форматтера выравнивания:

  • right=N/center=N/left=N - направление выравнивания текста, где N - количество символов, до которых необходимо выравнивать текст.

  • trim - если параметр указан, то при превышении допустимого размера произойдет обрезание строки.

  • char - символ, используемый для выравнивания. Можно указывать символ или код Unicode. Например: char=. или char=0x002E. Если параметр не указан, то используется пробел.

Пример

Шаблон в формате txt, который выводит тему документа, дополнив строку точками, длина строки - 25 символов. В случае превышения (тема документа более 25 символов), строка будет обрезана:

{f:DocumentCommonInfo.Subject:#align(center=25;trim;char=.)}

image324

Документ, сформированный по данному шаблону с темой, имеющей длину менее 25 символов:

image325

Документ, сформированный по данному шаблону с темой, имеющей длину более 25 символов:

image326
Форматтер #wrap

Форматтер #wrap аналогичен форматтеру #align (параметр trim не поддерживается). При превышении допустимого значения происходит перенос остатка на следующую строку.

Данный форматтер корректно функционирует только для текстовых файлов формата .txt.
Пример

Возьмем тот же пример, что и для форматтера #align, где строка была обрезана. Только в данном случае выполним перенос строки с помощью форматтера #wrap:

{f:DocumentCommonInfo.Subject:#wrap(center=25;char=.)}

image327

Документ, сформированный по данному шаблону:

image328
Обратите внимание, что в шаблонном файле для корректной работы переноса строк неоходимо после плейсхолдера с форматтером #wrap добавить перенос строк.

На рисунке ниже пример, где видны переносы строк.

image331

По такому шаблону файл будет сформирован корректно, как на рисунке выше. Если же в конце не добавить перенос строк, например:

image332

То по данному шаблону файл сформируется вот в таком виде:

image333
Цепочки форматтеров

Форматтеры можно объединять в цепочки, разделяя их через точку с запятой.

Пример

Выведем список ссылок на карточки (из поля "Ссылки в документе") и QR-коды для открытия карточек по ссылкам в веб клиенте на смартфоне.

В первой колонке таблицы запишем: {t:OutgoingRefDocs.DocDescription order by Order} - упорядоченный список ссылок, во второй колонке - {t:OutgoingRefDocs.DocID order by Order:#webCardLink;qrcode(t=url)} - в каждой строке таблицы для идентификатора документа, на который ведёт ссылка, генерируем адрес веб-клиента (для открытия ссылки в браузере), а затем по адресу (как по строке текста) генерируем QR-код типа "URL" (ссылка).

image282

В цепочке от первого форматтера ко второму передаётся результат работы первого в виде строки. Поэтому после вызова qrcode (он возвращает массив байт с картинкой, а не текст) нет смысла отдавать результат никакому другому форматтеру из стандартных (написанный разработчиком форматтер сможет извлечь изображение и выполнить его постобработку, но по умолчанию в системе нет таких средств).

Форматтер #file

Форматтер #file загружает заданный файл или версию файла по идентификатору и представляет как массив байт, который можно направить в другие форматтеры, например, в #image или #text, т.е. по сути позволяет приложенные к карточке файлы изображений отобразить в шаблоне файла.

Пример

В документе добавим таблицу из одной колонки, внутри колонки создадим объект "Надпись", в которой укажем следующую конструкцию:

{t:Files.RowID:#file;image}

Результат создания файла по шаблону из карточки, к которой приложено три файла изображений:

image283

В данном примере мы ищём файл по идентификатору #file, далее массив байт передаем в форматтер #image, который формирует изображение.

Для поиска файла по идентификатору версии файла форматтер используется с параметром version, например: {t:Files.VersionRowID:#file(version);image(w=120;h=60)}.

Идентификатор может быть получен не только из колонки-идентификатора, но и из строки, которая содержит идентификатор в поддерживаемом формате (обычный Guid в фигурных скобках, более подробно в MSDN).

Также идентификатор можно указать прямо в плейсхолдере, например: {text:4e4eb070-2333-40bd-8516-7e7c4592fbf4:#file;image}.

Форматтер #text

Форматтер #text представляет заданный массив байт как текст. Массив байт можно получить непосредственно из поля карточки, представления, или как в примере выше, из форматтера #file (т.е. из файла или версии файла с заданным идентификатором).

Для данного форматтера есть параметр t, в котором можно указать кодировку, например: {t:Files.RowID:#file;text(t=utf16)}.

Если для форматтера кодировка не задана, то текст берется в соответствующей кодировке Unicode на основании BOM (byte order mark - специальные нечитаемые символы в начале текстового файла), если он есть. Если BOM нет, то используется ANSI (это кодовая страница, заданная в региональных параметрах учётной записи Windows, например, страница 1251 для русскоязычного Windows).

Указать кодировку можно или из следующих значений (без учёта регистра):

  • utf7 - UTF-7

  • utf8 - UTF-8

  • utf16 или utf16le - UTF-16 Little Endian

  • utf16be - UTF-16 Big Endian

  • utf32 - UTF-32

  • ascii - ASCII

Или указав кодовую страницу, которая известна в .NET, подробнее в MSDN.

7.11. Система прав доступа к карточкам, включенным в типовое решение

Для карточек, включенных в типовое решение, автоматически начинает работать подсистема разграничения доступа.

7.11.1. Общий механизм расчета прав доступа к карточке

Доступ к карточкам документов осуществляется согласно карточкам правил доступа и заданиям процесса, которые находятся в карточке.

Система определяет, какие правила соответствуют типу карточки, состоянию процесса и ролям, в которые входит текущий пользователь и рассчитывает права соответственно этим правилам.

7.11.2. Карточка правил доступа

Карточки правил доступа доступны только администраторам, тип карточки правил доступа находится в группе карточек-настроек:

image142

Внешний вид карточки:

image143

В карточке правил доступа указывается:

  • Тема карточки – обязательное поле, указывается краткое название карточки.

  • Описание – необязательное поле, указывается информация, раскрывающая тему карточки.

  • Типы – обязательное поле, типы карточек, включенных в типовое решение, к которым применяется правило.

  • Состояния карточек – состояния карточек, в которых будут работать определенные ниже разрешения. Если поле не заполнено, может работать только право на создание карточки.

  • Список ролей – обязательное поле; роли, для которых выдаются указанные права для указанных типов карточек в указанных состояниях.

    В списке ролей можно указать, в том числе, и контекстные роли, например, "Инициатор" или "Создатель карточки".
  • Список разрешений – разрешения, выдаваемые для указанных типов карточек в указанных состояниях для пользователей, состоящих в указанных ролях. Право на создание карточки не зависит от указанных состояний.

7.11.3. Права доступа к карточке

Существует 14 прав доступа к карточке:

  • Создание карточки – пользователь, обладающий данным правом, может создавать карточку указанного в правиле типа. После создания карточки и до ее первого сохранения пользователь может редактировать карточку и маршрут согласования. При определении доступности создания карточки указанные в правилах доступа контекстные роли игнорируются.

  • Чтение карточки – пользователь может открывать карточку и просматривать ее содержимое.

  • Редактирование карточки – пользователь может редактировать поля карточки (кроме маршрута, номера документа и файлов, доступ, к редактированию которых, определяется отдельными правами).

  • Редактирование маршрута – пользователь может редактировать маршрут (кроме активных и завершенных этапов).

  • Ручное редактирование номера – пользователь может изменять номер документа.

  • Подписание файлов - пользователь сможет подписывать электронной подписью приложенные файлы для для указанных типов документов.

  • Добавление файлов – пользователь может добавлять файлы в карточку.

  • Редактирование собственных файлов - пользователь может редактировать только файлы, которые он сам добавил к карточке.

  • Редактирование всех файлов – пользователь может редактировать любые файлы карточки.

  • Удаление собственных файлов - пользователь может удалять только файлы, которые он сам добавил к карточке.

  • Удаление всех файлов – пользователь может удалять любые файлы карточки.

  • Удаление карточки – пользователь может удалить карточку.

  • Инициация типового процесса отправки задач – пользователь может создавать задачи для этого документа, а также отправлять документ на ознакомление.

  • Подписка на уведомления - пользователь может включать подписку на уведомления по карточке.

7.11.4. Представление правил доступа

Просмотреть и открыть карточки правил доступа можно в соответствующем представлении "Правила доступа", которое находится в рабочем месте администратора, в папке "Типовое решение". В представлении отображается вся информация, указанная в карточке правил:

image146

Для представления доступны сабсеты по указанным разрешениям, состояниям карточки, указанным ролям и типам карточек:

image147

Также для представления доступны поисковые параметры – название, описание, тип, состояние, роль, разрешение и сотрудник:

image148

Поиск по названию, описанию, типу, состоянию, роли и разрешению – происходит выборка карточек содержащих указанные названия/описания/типы/состояния/роли/разрешения.

Поиск по сотруднику проверяет все указанные в карточке правил доступа не контекстные роли на предмет вхождения в них указанного в поисковом параметре сотрудника.

7.11.5. Права доступа, определяемые этапом согласования/подписания

Кроме правил доступа, определяемых соответствующими карточками, можно в этапе согласования или подписания дополнительно указать право на редактирование карточки и право на редактирование любых файлов карточки, отметив соответствующие настройки в форме этапа. Эти права будут выданы согласующим/подписантам этапа в последствии (если согласующий/подписант взял задание в работу).

image149

Для параллельного этапа включение этих опций может стать причиной конфликта сохранения, о чем написано в информационном блоке около этих флагов.

7.11.6. Определение прав доступа при создании карточки

Пользователь, не имеющий прав на создание карточки определенного типа (на момент запуска TessaClient) не увидит элемента панели создания карточки этого типа. Тем не менее, при попытке создания карточки происходит проверка возможности действия – если есть правила доступа, в которых указан пользователь (или роль, в которую он входит) и отмечено право создания карточки типа создаваемой карточки, то пользователь успешно создаст карточку. Если пользователь после запуска клиента успел утратить права на создание карточки такого типа, будет отображено соответствующее сообщение об ошибке:

image151

После создания карточки пользователь получит возможность редактировать карточку до первого сохранения. После сохранения карточки, права доступа к ней станут определяться обычным (определение прав доступа при чтении карточки) образом.

7.11.7. Определение прав доступа при чтении карточки

Определение прав, которыми обладает пользователь при открытии карточки, происходит в зависимости от типа карточки, состояния процесса, заданий карточки и настроек этапов процесса.

  1. Если в карточке есть любое задание, доступное пользователю (как исполнителю, автору и т.д.), пользователь может читать карточку, а также имеет права на подписание (с помощью ЭЦП) приложенных к карточке файлов.

  2. Если в карточке есть задание на доработку и текущий пользователь - исполнитель:

    • Если задание не в работе – пользователь может читать карточку.

    • Если задание в работе – пользователь может читать и редактировать карточку, редактировать и добавлять файлы, редактировать маршрут.

  3. Если в карточке есть задание согласования или подписания и текущий пользователь – исполнитель:

    • Если задание не в работе – пользователь может читать карточку.

    • Если задание в работе – пользователь может читать карточку и добавлять файлы (и редактировать ранее добавленные им файлы). Также, этапом согласования/подписания могут быть даны права на редактирование карточки и редактирование файлов.

  4. Если в карточке есть задание комментирования и текущий пользователь исполнитель – пользователь может читать карточку и добавлять файлы (и редактировать ранее добавленные им файлы).

  5. Если карточка находится в состоянии "Проект" - пользователь открывает карточку сразу со всеми правами, которыми он обладает согласно определенным правилам.

  6. Если пользователю карточка направлена на ознакомление - пользователь может читать карточку.

  7. Во всех иных случаях при чтении карточки проверяется только наличие прав на чтение, и карточка открывается только для чтения.

В случае если карточка открыта не со всеми правами, которые требуются пользователю, пользователь может нажать на кнопку "Редактировать" в левом меню системы:

image152

При нажатии на кнопку "Редактировать" карточка будет открыта со всеми правами, определенными для пользователя. Выход из режима редактирования осуществляется путем обновления карточки с помощью соответствующей кнопки в левом меню системы или нажатием клавиши [F5]. Если при расчете прав не было получено право на редактирование непосредственно карточки, пользователь увидит информационное сообщение со списком полученных прав:

image153

Если на момент нажатия на кнопку "Редактировать" карточка содержала несохраненные изменения, система предложит на выбор предварительно сохранить изменения, отказаться от изменений или не переходить в режим редактирования (опции "Да", "Нет", "Отмена" соответственно):

image154

В случае если пользователь утратил права на чтение карточки в процессе работы с ней (например, создал карточку и сохранил ее, но не имеет прав на чтение), пользователь сможет в течение небольшого времени (и до закрытия карточки), читать текущую версию карточки. Т.е. если другой пользователь обновил карточку, а утративший права на чтение карточки пытается ее обновить – он получит ошибку.

7.11.8. Определение прав доступа при удалении карточки, возврате карточки на доработку, отзыве и отмене процесса

При попытке удаления карточки, возврата карточки на доработку или отзыва/отмены процесса происходит проверка допустимости действия для данного пользователя, если действие допустимо – оно происходит, если нет – пользователь видит ошибку, сообщающую о недостаточных правах для действия.

Права на удаление карточек определяются правилами доступа. Права на возврат карточки на доработку, отзыв и отмену процесса настраиваются в соответствующих вторичных процессах (вкладка Администратор → Маршруты → Вторичные процессы).

7.11.9. Некоторые примеры расчета прав доступа на карточку

Пример 1 – чтение карточки

Карточка типа "Документ" создана и находится в состоянии "Проект".

В карточке правил доступа "Правило 1" в типах указан "Документ", в состояниях указан "Проект" и др., в ролях указан "Пользователь 1", отмечено право на чтение карточки.

В карточке правил доступа "Правило 2" в типах указан "Документ", в ролях указана роль "Отдел 1", в которую входит пользователь, отмечено право на редактирование карточки.

В карточке правил доступа "Правило 3" в типах указан "Документ", в ролях указана роль "Сотрудник отдела создателя карточки", отмечено право на редактирование маршрута.

При открытии карточки будут выбраны правила, в которых указан тип "Документ", состояние "Проект" и не контекстные роли, в которые включен пользователь. Согласно выбранным правилам пользователь получит возможность читать и редактировать карточку.

Т.к. карточка находится в состоянии "Проект", она не будет содержать задания процесса, которые могли бы расширить набор прав пользователя для этой карточки.

Далее будут выбраны контекстные роли для типа "Документ" и состояния "Проект" и соответствующие им наборы разрешений. Если "Пользователь 1" входит в роль "Сотрудник отдела создателя карточки", то он получит право на редактирование маршрута.

Пример 2 – создание карточки

Пользователь "Пользователь 1" пытается создать карточку типа "Договор"

Определено правило доступа "Правило 1" для типа "Документ", роли "Отдел 1" и "Отдел 2", отмечено право на создание карточки.

При попытке создания карточки "Договор" будет проверено наличие правил, в которых указан тип "Договор", отмечено право на создание карточки и указаны роли, в которые входит пользователь. Т.к. карточка еще не создана – у нее нет состояния, поэтому правила будут выбираться без фильтрации по состоянию. Также будут игнорироваться контекстные роли, т.к. для несуществующей карточки невозможно определить содержание контекстной роли. Если такие правила существуют – пользователь сможет создать карточку, таким образом, если пользователь входит в роль "Отдел 1" или в "Отдел 2", он успешно создаст карточку и сможет ее редактировать, редактировать маршрут, добавлять и редактировать файлы до первого сохранения, после которого доступ к карточке будет определяться стандартным для открытия карточки образом.

Пример 3 – чтение карточки, отмена согласования, удаление карточки

Пользователь "Пользователь 1" открывает карточку типа "Входящий" в состоянии "На согласовании", которая была им создана ранее.

Определено правило доступа "Правило 1" для типа "Входящий", состояния "Отмена", для контекстной роли "Создатель карточки" и отмечено право удаления карточки.

В карточке вторичного процесса "Отменить процесс" не указаны типы (т.е. кнопка будет доступна для всех типов карточек), указана роль "Отдел 1", в которую входит пользователь, состояние - "На согласовании".

Карточка содержит не взятое в работу задание комментирования для роли "Все сотрудники", в которую входит "Пользователь 1".

Система дает пользователю "Пользователь 1" доступ на чтение карточки, т.к. есть задание комментирование для "Все сотрудники" и "Пользователь 1" является исполнителем задания, хотя оно еще не взято в работу.

"Пользователь 1" может отменить процесс согласования, и отмена пройдет успешно согласно настройкам карточки вторичного процесса, который отвечает за отмену процесса.

После отмены процесса пользователь может удалить карточку, т.к. он является создателем карточки и входит в контекстную роль "Создатель карточки", для которой доступно удаление карточки в состоянии "Отмена".

7.12. Права на просмотр отчетов

В типовом решении предустановлено два вида отчетов (вкладка Пользователь, папка Отчеты): Текущие задания, Завершенные задания.

В зависимости от роли, пользователям доступна следующая информация в отчетах:

  • Администратор - отчет по заданиям всех сотрудников и департаментов в системе;

  • Руководитель департамента - доступен отчет по заданиям всех сотрудников департамента данного руководителя;

  • Сотрудник - доступен отчет только по своим заданиям в системе.

Также, при необходимости, сотрудникам может быть настроен доступ на отчеты по другим департаментам или сотрудникам.

Добавить права на просмотр отчетов можно с помощью правого меню системы - Создать карточку - Настройки - Права на просмотр отчетов:

image154 1

В новой вкладке будет открыта карточка настройки прав доступа на отчеты, где необходимо заполнить следующие поля:

  • Тема - описание карточки доступа на отчеты;

  • Кто может смотреть - список сотрудников, департаментов или ролей, кто сможет просматривать указанные отчеты;

  • Кого можно смотреть - список департаментов или сотрудников, чьи отчеты по заданиям будут доступны указанным сотрудникам/ролям:

image154 2

Таким образом можно создать нужное количество карточек с правами на просмотр отчетов. Список всех прав на просмотр отчетов доступен из соответствующего представления на вкладке Администратор - папка Типовое решение:

image154 3

С помощью двойного клика левой кнопкой мыши по нужной карточке, её можно открыть и отредактировать.

8. Уведомления

Вы можете создать карточку уведомления и использовать ее при разработке собственных маршрутов документов и собственных решений. Также некоторые платформенные механизмы используют карточки уведомлений.

Карточка уведомления представляет из себя настройки, по которым система сформирует письмо и отправит его пользователю". Создать карточку уведомления можно из правой панели "Создать карточку → Справочники → Уведомление".

image342

Уведомление во многом похоже на шаблон файла html и настраивается похожим образом при помощи плейсхолдеров.

Название - название карточки уведомления. Определяет как карточка будет видна в представлении и в ссылающихся объектах.

Описание - подробное опиание карточки, для чего она используется.

Тип уведомления - ссылка на справочник "Типы уведомлений". Необязательное, предназначено для структурирования уведомлений. Системой в настоящий момент не используется.

Алиасы плейсхолдеров - аналогично шаблонам файлов, тут можно задать алиасы для длинных или тяжелочитаемых плейсхолдеров.

Тема письма - при помощи плейсхолдеров тут можно сформировать тему письма.

Текст письма - тело письма в формате html.

Подробно о плейсхолдерах и шаблонах файлов вы можете прочитать в разделе Шаблоны файлов и плейсхолдеры.

9. Маршруты документов

9.1. Введение в маршруты

Подсистема Маршруты документов предназначена для простой настройки маршрутов прохождения и обработки документов. Её основная цель - чтобы администраторы могли самостоятельно настраивать сложные маршруты документов (бизнес-процессы), не привлекая специалистов по внедрению.

Основные компоненты подсистемы маршрутов

  • Маршрут - это последовательность этапов различных типов, которые выполняются в указанной последовательности. Маршрут строится на основании различных настроек, заданных администратором, а также может быть изменен пользователем в пределах, разрешенных его правами доступа и настройками маршрутов. Возможность для пользователя изменять маршрут, а для администратора - управлять и контролировать этот процесс - уникальная особенность подсистемы маршрутов платформы TESSA.

    routes1
  • Этап маршрута - основной элемент построения маршрута. Этапы могут быть различных типов, предназначенные для различных целей. С платформой поставляется большой набор этапов для различных целей, например этапы для согласования, исполнения, смены состояния и т.д. С их помощью можно простыми средствами построить сложные последовательности действий. Также можно создавать собственные типы этапов (для этого требуется программирование), которые будут прозрачно встроены в общую систему.

    routes2

Компоненты, настраиваемые администратором

  • Шаблон этапа - это специальная карточка, которая содержит в себе один или несколько заранее настроенных этапов маршрута. Подсистема строит маршрут документа, собирая этапы из различных шаблонов. Карточка содержит целый ряд настроек, управляющих правилами подстановки или пропуска этого шаблона по различным условиям. У каждого этапа в составе карточки шаблона также есть ряд настроек, позволяющих управлять его подстановкой в маршрут, а также организовывать различные действия при выполнении этапа.

  • Группа шаблонов - это также специальная карточка, объединяющая несколько шаблонов этапов в одну группу, и позволяющая управлять их подстановкой и выполнением в маршруте как единым целым. Маршрут любой карточки будет состоять из одной или нескольких групп, выполняемых последовательно.

  • Кнопка процесса - это карточка, позволяющая описывать новые кнопки (тайлы) в контекстной (левой) или глобальной (правой) панели приложения системы. С кнопкой можно связать группу шаблонов, которая должна выполниться по ее нажатию или указать дополнительные параметры управления процессом.

    routes3
  • Сценарии (скрипты) - при помощи простых скриптов можно чрезвычайно сильно расширить возможности подсистемы маршрутов. Для скриптов используется синтаксис C#, и в различных объектах системы вы с их помощью можете модифицировать маршруты и их поведение, манипулировать данными карточек, организовывать циклы и сложные связи между различными этапам, управлять условиями подставки и пропуска этапов. Далее будет приведено большое количество примеров таких условий и скриптов, вы увидите, что это несложно. Обычный администратор, владеющий базовыми навыками скриптинга, легко сможет использовать их в работе.

  • Методы расширений - это карточка, позволяющая определить библиотеку различных вспомогательных методов (скриптов), которые в дальнейшем использовать в скриптах и условиях. Методы расширений позволяют сильно упростить скрипты и не дублировать одинаковые действия.

9.1.1. Виды процессов маршрутов, расчет маршрута и его выполнение

Существуют два вида процессов маршрутов: основной процесс и второстепенный процесс.

  • Основной процесс - это главный процесс маршрута по карточке. Его вы можете видеть на вкладке Маршрут.

  • Второстепенный или вторичный процесс - это процессы, которые стартуют по различным внешним событиям, в основном по тайлам. Эти процессы обычно синхронные - они запускаются, выполняют какие-то действия (меняют состояние, выполняют переход в основном процессе и т.д.) и завершаются. Но могут быть и вторичные процессы, которые отправляют задания и, соответственно, "замирают" и ждут завершения заданий для своего завершения. Такие процессы называются асинхронными. Вторичные процессы не видны на вкладке маршрут, и, соответственно, не могут быть явным образом изменены пользователем.

Также различают два вида процессов по синхронности этапов, входящих в маршрут.

  • Асинхронный процесс - процесс, некоторые этапы которого асинхронные, т.е. не могут выполниться сразу, а ждут чего-то от пользователя или внешней системы. Например, отправка задания - это асинхронный этап. Система отравляет задание и ждет, когда пользователь завершит его. Только тогда процесс идет дальше.

  • Синхронный процесс - это процесс, все этапы которого выполняются сразу же. Такой процесс рассчитывается и выполняется целиком в памяти.

Расчет маршрута или его части выполняется в следующих ситуациях:

  • Запуск процесса. В этом случае система полностью строит маршрут - вычисляет последовательность групп, и в них последовательность этапов (через шаблоны этапов). Подробно все эти ситуации описаны ниже.

  • "Вход" в группу. Когда при выполнении процесса маршрут дошел до какой-то группы, то перед началом выполнения система перестраивает группу.

  • При достижении этапа "Пересчет маршрута". Если в состав какой-нибудь группы входит этап "Пересчет маршрута", то при выполнении этого этапа система полностью пересчитает состав текущей группы после этапа "Пересчет маршрута".

  • При нажатии кнопки "Пересчитать маршрут" на вкладке "Маршрут".

При расчете маршрута основного процесса при запуске система включает в маршрут:

  • Группы, которые не связаны с кнопками\тайлами И

    • которые по типу документа и роли соответствуют текущему типу документа и сотруднику, запускающему процесс

  • Затем выполняются сценарии инициализации всех групп (построение маршрута)

  • Затем выполняются условия включения группы в маршрут (построение маршрута), у подтвержденных групп, которые останутся в маршруте (условие истинно), устанавливается флаг Confirmed = true в контексте.

  • Затем для каждой подтвержденной группы (условие включения в маршрут истинно) по очереди:

    • Вычисляются шаблоны этапов, которые включены в эту группу И

      • которые по типу документа и роли соответствуют текущему типу документа и сотруднику, запускающему процесс

    • выполняются сценарии инициализации этих шаблонов этапов

    • выполняются условия включения в маршрут этих шаблонов этапов. У подтвержденных шаблонов, этапы которых останутся в маршруте (условие истинно), устанавливается флаг Confirmed = true в контексте.

    • строится маршрут по этой группе по подтвержденным этапам

    • выполняются сценарии постобработки для всех шаблонов, в т.ч. неподтвержденных

  • Затем для всех групп выполняются сценарии постобработки (построение маршрута), в том числе для неподтвержденных.

  • Далее система приступает к выполнению первой группы маршрута с выполнением ее пересчета. Пересчет группы выполняется по тем же правилам, что и для всего маршрута.

Например
В маршруте участвуют три группы: Группа 0 (условие ложно), Группа 1 (условие истинно), Группа 2 (условие истинно).
Терминология:
* Before - сценарий инициализации группы или шаблона этапа
* Condition - условия включения в маршрут (построение маршрута) группы или шаблона этапа
* After - сценарий постобработки группы (построение маршрута) или шаблона этапа

1. Выполняем Before для всех трех групп
2. Выполняем Condition для всех групп
2.0 Не берем шаблоны для группы 0, т.к. Condition = false
2.1 Берем шаблоны для группы 1
2.1.1 Выполняем Before для всех шаблонов группы 1
2.1.2 Выполняем Condition для всех шаблонов группы 1
2.1.3 Строим маршрут для группы 1 на основе подтвержденных в п 2.1.2
2.1.4 Выполняем After для всех шаблонов группы 1. Маршрут, построенный в 2.1.3 доступен в контексте.
2.2 Берем шаблоны для группы 2
2.2.1 Выполняем Before для всех шаблонов группы 2
2.2.2 Выполняем Condition для всех шаблонов группы 2
2.2.3 Строим маршрут для группы 2 на основе подтвержденных в п 2.2.2
2.2.4 Выполняем After для всех шаблонов группы 2. Маршрут, построенный в 2.2.3 доступен в контексте.
3. Выполняем After для всех трех групп. На этом моменте доступен полный маршрут по всем группам

При расчете маршрута вторичного процесса, связанного с кнопкой\тайлом система включает в маршрут:

  • Группы, которые непосредственно связаны с этим тайлом И

    • проверяется вхождение текущего сотрудника в роли, указанные в поле "Роли" группы

    • если тайл глобальный (правая панель), то поле "Тип документа" группы игнорируется

    • если тайл контекстный (левая панель), то в маршрут попадают только группы, у которых в поле "Тип документа" присутствует тип текущего документа.

  • Далее маршрут считается по общим правилам.

*Пересчет группы" при начале ее выполнения выполняется системой по аналогии с полным перестроением маршрута:

  • Сначала выполняется сценарий инициализации (построение маршрута) группы.

  • Затем выполняется условие включения в маршрут (построение маршрута) группы.

    • Если условие истинно, то вычисляются шаблоны этапов, которые включены в эту группу И

      • которые по типу документа и роли соответствуют текущему типу документа и сотруднику, запускающему процесс

    • выполняются сценарии инициализации этих шаблонов этапов

    • выполняются условия включения в маршрут этих шаблонов этапов. У подтвержденных шаблонов, этапы которых останутся в маршруте (условие истинно), устанавливается флаг Confirmed = true в контексте.

    • строится маршрут по этой группе по подтвержденным этапам

    • выполняются сценарии постобработки для всех шаблонов, в т.ч. неподтвержденных

  • Затем для группы выполняется сценарий постобработки (построение маршрута).

  • Далее система приступает к выполнению этой группы маршрута.

Таким образом, группа, которая была изначально включена в маршрут, будет пересчитана и может быть выключена из него перед своим выполнением.

Пересчет части маршрута этапом "Пересчет маршрута" выполняется следующим образом:

  • Система полностью пересчитывает текущую группу, так же, как и при входе в группу.

  • Если в пересчитанной группе этапа "Пересчет маршрута" нет - выдается ошибка.

  • Если в пересчитанной группе ранее этапа "Пересчет маршрута" есть новые этапы - выдается ошибка.

  • Если всё в порядке, управление передается на следующий этап в группе.

Правила выполнения маршрута:

  • Система выполняет маршрут в глобальном порядке групп, входящих в него.

  • При "входе" в группу, т.е. перед выполнением первого этапа, входящего в эту группу, система выполняет и проверяет рантайм-условие (выполнение маршрута). Если условие ложно, система переходит к следующей группе в маршруте.

  • Если рантайм-условие истинно, то выполняется сценарий рантайм-инициализации (выполнение маршрута) группы.

  • Далее система по очереди выполняет этапы, входящие в группу, при этом для каждого этапа по очереди:

    • вычисляется условие

    • если условие истинно, то выполняется сценарий инициализации и выполняется собственно этап

    • при завершении этапа выполняется сценарий постобработки

  • После завершения последнего этапа, входящего в группу, выполняется сценарий рантайм-постобработки группы (выполнение маршрута).

  • Система проверяет, не появилось ли новых групп, которые должны выполняться между завершенной и следующей группой. Для этого она:

    • Формирует список групп, подходящих по типу документа и роли сотрудника, которые по порядку (поле "Порядок") должны выполняться между текущей завершенной группой и следующей.

    • Если такие группы есть, для них выполняется полный пересчет маршрута по общим правилам.

9.2. Примеры маршрутов

Далее мы на различных примерах, простых и сложных, увидим, как работают маршруты документов.

Все примеры, описанные в этом разделе, вы можете загрузить и установить как отдельную библиотеку. Она рассчитана на установку поверх типовой конфигурации, поставляемой со сборками платформы. Как загрузить и установить, описано в разделе Установка примеров. На нашем демо-стенде примеры уже установлены, вы можете просто продолжить чтение.

Каждый пример мы разберем в несколько шагов. Сначала мы увидим, что именно мы ожидаем от этого примера. Потом мы выполним его по шагам. И, наконец, разберемся, как он настроен.

Примеры, которые мы рассмотрим:

9.3. Инициация нового договора (пример)

Ниже представлена общая схема процесса.

routes sample1

После инициации договор будет отправлен на согласование, если он дороже 100 000.

После успешного согласование он будет переведен в состояние "На подписании руководителем" и отправлен на подписание руководителю.

Затем договор будет переведен в состояние "На подписании контрагенту" и отправлен инициатору на организацию подписания контрагентом.

И в самом конце договор получит состояние "Подписано сторонами".

Интересным аспектом этого процесса является собственный этап доработки, который включен в подписание. Если кто-либо (руководитель или контрагент) не подписали документ, то после доработки документ вновь уйдет на подписание, а не на полный цикл согласования с прохождением всех согласующих.

Итак, давайте инициируем договор. Пример процесса настроен так, что один и тот же сотрудник выполняет все роли процесса. Это сделано для удобства демонстрации. В реальной жизни все эти роли выполняют разные люди.

В правой панели нажмите тайл "Инициировать договор".

routes sample1 01

Создастся и откроется карточка договора. Обратите внимание, что к ней уже приложен файл условного шаблона договора.

routes sample1 02

Давайте попробуем отправить договор на согласование не внося изменений в сумму. Она меньше 100 000 и это значит, что договор должен сразу попасть на подписание.

Нажмем в левой панели кнопку "Запустить процесс". Мы запустили маршрут прохождения документа.

routes sample1 03

Запустился процесс и нам сразу же пришло задание на подписание, минуя согласование.

routes sample1 04

Обратите внимание на сформированный маршрут на вкладке "Маршрут".

routes sample1 05

Обратите внимание, что состояние карточки изменилось на "На подписании руководителем". Состояние карточки можно посмотреть и на основной вкладке карточки, и на вкладке "Маршрут".

routes sample1 06

Вернемся к процессу. В задании на подписание нажмите кнопку "В работу", чтобы взять задание в работу.

routes sample1 07

Теперь, когда задание у вас в работе, вы можете сделать всё, что предусмотрено возможностями этапа подписания. Вы можете подписать и отказать в подписании, запросить дополнительные комментарии и делегировать свое задание. Давайте подпишем, чтобы процесс перешел к следующему этапу.

Нажмите кнопку "Подписать", вы увидите поле для ввода комментария. Нажмите "Подписать" еще раз для подтверждения завершения задания.

Нам сразу же приходит следующее задание. Это задание инициатору на организацию подписания контрагентом.

routes sample1 08

Обратите внимание, что состояние карточки изменилось и теперь оно "На подписании контрагентом".

Давайте откажем в подписании. Нажмите кнопку "В работу". Затем нажмите кнопку "Отказать", введите комментарий (при отказе в подписании он обязательный) и нажмите еще раз "Отказать".

routes sample1 09

И нам сразу же приходит задание редактирования/доработки. Состояние карточки изменилось на "На редактировании".

Обратите внимание, что переходы с этапа на этап выполняются системой мгновенно. Производительность и скорость выполнения маршрутов не зависит от их количества.

routes sample1 10

Давайте посмотрим на содержимое листа согласования. Лист согласования - это специальный виртуальный файл, который для вашего удобства система формирует у каждой карточки, участвующей в согласовании. В нем в удобном для просмотра, печати или, например, отправки почтой, в табличном виде представлен процесс согласования и подписания документа. Файл "Лист согласования" всегда актуальный, так как формируется системой автоматически в момент запроса содержимого и физически в карточке не хранится.

routes sample1 11

Также посмотреть текущее состояние всех документов, отправленных вами на согласование, вы можете в представлении "Мои документы" в рабочем месте "Пользователь".

routes sample1 12

Давайте инициируем новый цикл согласования. Возьмите в работу задание редактирования и нажмите кнопку "Начать новый цикл".

routes sample1 13

Вы опять увидите задание на подписание руководителем. Система начала новый цикл согласования.

Чтобы успешно завершить процесс, возьмите в работу и нажмите "Подписать" в этом задании и в следующем задании на организацию подписания контрагентом.

Процесс завершится и состояние карточки изменится на "Подписано сторонами".

routes sample1 14

Конечно, в реальной жизни процесс сложнее и после успешного подписания необходимо начинать подготовку к выполнению контракта. Все это не сложно сделать при помощи подсистемы маршрутов.

Теперь давайте инициируем договор с большей суммой. Еще раз нажмите в правой панели кнопку "Инициировать договор".

В открывшейся карточке договора введите сумму 200 000.

routes sample1 15

И опять в левой панели нажмите тайл "Запустить процесс".

И нам сразу же приходит задание на согласование договора, которого не было в прошлый раз.

routes sample1 16

Посмотрим на вкладку "Маршрут". Появился новый этап "Согласование внутри компании". Он состоит из последовательного согласования ролями "Руководитель инициатора" и подразделением "Финансовый департамент".

routes sample1 17

Если вы согласуете документ (возьмите в работу задание, и нажмите "Согласовать"), а затем сделаете это еще раз в следующем задании, то попадете опять на этап подписания внутри компании - сначала руководителем, а затем и контрагентом. Поэкспериментируйте с выполнением процесса. Попробуйте различные варианты.

Обратите внимание, что все аспекты этого процесса реализованы при помощи механизма маршрутов документов. Тайл инициации договора, настройки этапов, условия пропуска или включения этапов, порядок этапов, исполнители на этапах. Такой процесс чрезвычайно прост в своей настройке.

9.4. Подготовка, согласование и исполнение служебной записки\заявки (пример)

Следующий пример существенно сложнее. Это процесс служебной записки разных типов.

Давайте посмотрим на схему процесса.

routes sample2

Пользователь инициирует служебную записку/заявку разных типов: обычную и финансовую. Названия выбраны для примера и глубокой семантики не несут. Пользователь не создает никаких карточек сам, вместо этого он инициирует процесс нужного типа, и уже система решает, что ему нужно для продолжения.

В зависимости от выбранного пользователем типа процесса система создает карточку заявки по различным шаблонам, отправляет по ней инициатору задание на заполнение заявки, при этом процесс организован так, что карточка заявки сама собой открывается пользователю в его рабочем месте.

Далее инициатор заполняет карточку заявки и завершает задание. Система выполняет различные валидации, которые тоже организованы в процессе:

  • Проверяется, что тип заявки всегда указан. В этом случае пользователю не удастся завершить свое задание.

  • Для финансовых заявок проверяется, что приложен файл, который называется "Обоснование…​". А в случае этой ошибки система заново пришлет пользователю задание на заполнение заявки с другим текстом задания. Это сделано таким образом просто для демонстрации возможности.

Когда заявка инициирована, она отправляется на согласование. Согласование требуется только для финансовых заявок. В нем участвуют роли "Руководитель инициатора" и "Финансовый департамент". Интересно, что времени на согласование система будет давать всё меньше с каждым новым циклом согласования.

Далее заявка отправляется на исполнение. Исполняют ее различные роли в зависимости от типа заявки. После исполнения система отправляет задание инициатору с просьбой подтвердить выполнение.

Если инициатор не подтверждает выполнение заявки, то система вновь отправляет задание исполнителю заявки с комментарием недовольного инициатора.

Давайте запустим процесс. Нажмите тайл "Обычная СЗ" в группе тайлов "СЗ" на правой панели.

routes sample2 01

Система сама создает для нас документ по нужному шаблону, стартует процесс и присылает задание на заполнение заявки! При этом карточка автоматически открывается в клиентском рабочем месте. Нам не нужно вспоминать, какая карточка отвечает за какой процесс или какой шаблон документа надо использовать.

routes sample2 02

Посмотрим, как выглядит сформированный маршрут документа на вкладке "Маршрут". В настоящий момент активен этап "Заполнение СЗ".

routes sample2 07

Карточка уже содержит какую-то форму заявки, которую нужно заполнить. Она может быть разной для разных ситуаций. Если вы хотите отредактировать документ, нажмите правой кнопкой на файле, выберите "Редактировать", в открывшемся приложении отредактируйте документ, сохраните и закройте приложение, а затем сохраните карточку тайлом "Сохранить" в левой панели, или нажав [Ctrl+s].

Как видите, в задании уже написано, что нам нужно сделать.

Давайте попробуем очистить поле "Категория документа". Выделите значение и удалите его.

Теперь нажмите кнопку "В работу" в задании.

routes sample2 03

Теперь вам доступны все возможности работы с этим заданием. Задание можно просто завершить. Еще вы можете отправить задание другому сотруднику или сотрудникам, вы можете создать подчиненное задание, чтобы получить какие-то дополнительные материалы и данные. Возможностей очень много и они подробно описаны в руководстве пользователя в разделе "Работа с задачами".

Давайте завершим задание, чтобы сообщить системе что заполнение заявки вами завершено и можно продолжить маршрут. Нажмите кнопку "Завершить" в задании. Далее на форме завершения задания нажмите кнопку "Завершить" еще раз для подтверждения. Комментарий можно оставить пустым.

routes sample2 04

Система выведет сообщение об ошибке. Мы не указали категорию заявки. Это одна из проверок, предусмотренных процессом. Можно реализовывать проверки любой сложности на любых этапах маршрута.

routes sample2 05

Давайте вернемся в карточку и заполним поле "Категория". Выберите "Прочие СЗ" из выпадающего списка и опять завершите задание, нажав кнопку "Завершить".

routes sample2 06

И система немедленно присылает нам задание на исполнение заявки. Для удобства текущий сотрудник включен во все роли процесса, но в реальной жизни эти роли выполняют разные люди.

routes sample2 08

Обратите внимание, что переходы между этапами выполняются мгновенно. Так работает современная быстрая платформа управления документами. Производительность работы маршрутов не зависит от количества карточек и активных маршрутов и всегда будет высокой.

Состояние карточки изменилось на "На исполнении". Часто со сменой состояния также настраивают изменения прав доступа на карточку, например, чтобы инициатор имел права на изменение данных и файлов карточки, только пока она в состоянии "Проект".

routes sample2 09

Давайте возьмем задание в работу. Нажмите кнопку "В работу". Опять, как и в задании на заполнение, нам становится доступно множество возможностей. На этапе исполнения они могут быть полезны. Например, исполнитель может отправить задание другому сотруднику с возвратом после завершения, чтобы проконтролировать исполнение заявки до того, как система отправит ее инициатору.

Например, так:

routes sample2 10

И назад при завершении оно придёт так:

routes sample2 11

Мы же просто завершим задачу - заявка исполнена. Нажмите кнопку "Завершить" в задании и подтвердите завершение.

И система мгновенно присылает инициатору (опять нам) задание на подтверждение выполнения заявки.

routes sample2 12

Возьмем задание в работу. Нажмите кнопку "В работу". Обратите внимание, что это другое задание. В нем нам доступны только два варианта завершения "Выполнено" и "Не принято". Эти варианты специально настроены под данный шаг маршрута.

routes sample2 13

Давайте не примем выполнение. Мы чем-то недовольны. Нажмите кнопку "Не принято", заполните комментарий и еще раз нажмите "Не принято" для подтверждения завершения.

routes sample2 14

И мы опять переходим на этап выполнения заявки. Система вновь отправила задание исполнителю с комментарием инициатора.

routes sample2 15

Давайте опять возьмём задание в работу и затем завершим его. Нажмите "В работу", затем нажмите "Завершить" и на форме завершения задания еще раз нажмите "Завершить".

Система вновь присылает нам задание на подтверждение. Возьмите его в работу, и нажмите "Выполнено".

Исполнение заявки принято, процесс завершен, карточка перешла в состояние "Исполнен".

routes sample2 16

На вкладке "История заданий" вы всегда можете увидеть полную историю всех заданий, отправлявшихся и завершавшихся в рамках процесса.

А в рабочем месте "Пользователь" в представлении "Мои документы" вы всегда можете увидеть список всех инициированных вами документов и их текущее состояние.

routes sample2 17

А теперь давайте инициируем финансовую заявку, чтобы посмотреть на работу согласования. Нажмите в правой панели тайл "Финансовая СЗ".

routes sample2 18

Вновь система создала карточку заявки, запустила по ней процесс и сразу открыла нам карточку. Это очень удобно, когда мы знаем, что инициатор процесса выполняет первый этап маршрута. Когда первый этап маршрута выполняет другой сотрудник\роль, этого можно не делать.

routes sample2 20

Заполним карточку, возьмем в работу и завершим задание на заполнение карточки. Обратите внимание, что мы не прикладываем к карточке файл "Обоснование…​", как того требует процесс и текст задания. Пользователи сплошь и рядом так делают. Нажмите "В работу", затем нажмите "Завершить" и еще раз "Завершить" для подтверждения.

И система сразу же возвращает нам задание на заполнение карточки, уже с другим текстом. Текст гласит, что мы забыли приложить нужный файл. Возврат задания сделан просто для демонстрации возможности, обычно удобнее ругаться сразу при завершении задания, как мы это видели при пустом поле "Категория".

routes sample2 19

Давайте переименуем файл. Щелкните по нему правой кнопкой, выберите "Переименовать" и введите имя файла "Обоснование покупки". Нажмите "Ок" для завершения диалога.

routes sample2 21

Файл переименован.

routes sample2 22

Теперь давайте завершим задание заполнения заявки. Нажмите "В работу" (обратите внимание, что в других процессах брать задание в работу может быть нужно до того, как приступать к редактированию карточки, это зависит от процесса и настраивается), нажмите "Завершить" и еще раз в форме завершения.

Согласно схеме процесса, нам, а точнее нашей роли "Руководитель инициатора", приходит задание на согласование заявки. Срок задания составляет 5 рабочих дней.

routes sample2 23

Возьмите задание в работу. Это задание этапа согласования и оно предоставляет множество возможностей. Вы можете его делегировать, можете запрашивать комментарии у различных сотрудников (например, уточнить что-то у инициатора), можете делать дочерние согласования. Это подробно описано в руководстве пользователя в разделе "Согласование документов".

Давайте не согласуем заявку. Нажмите "В работу", далее "Не согласовать", введите комментарий и далее еще раз нажмите "Не согласовать" для подтверждения.

routes sample2 24

Система немедленно отправляет задание инициатору на доработку.

routes sample2 25

Задача инициатора скорректировать заявку в связи с замечаниями. Давайте сделаем вид, что мы это сделали и начнем сразу новый цикл согласования. Нажмите "В работу" и затем "Начать новый цикл".

Система вновь отправляет задание первому из согласующих - роли "Руководитель инициатора". Обратите внимание, что срок задания уменьшился и составляет уже 4 дня! Все работает так, как мы и предполагали. Если дальше не согласовывать документ, то с каждым новым циклом срок будет уменьшаться, пока не составит 1 день.

routes sample2 26

Теперь давайте согласуем документ. Нажмите "В работу", затем "Согласовать" и еще раз "Согласовать" в форме завершения. Система сразу же отправляет следующее задание согласования на роль "Финансовый департамент" (и это опять мы - для удобства).

routes sample2 27

Если завершить и это задание, согласовав документ, мы попадем на уже знакомый нам этап исполнения заявки, только исполнителем будет другая роль, потому что категория заявки "Финансовая СЗ".

routes sample2 28

Дальнейший процесс мы подробно проходили в первой части этого примера. Обратите внимание, сколько мелких нюансов реализовано в этом процессе и при этом он остался чрезвычайно простым в настройке. Посмотреть, как устроен маршрут, вы можете в рабочем месте "Администратор" в папке "Маршруты". Там вы найдете все объекты, связанные с маршрутом.

9.5. Последовательное согласование протокола по списку участников, заданных непосредственно в карточке (пример)

Этот пример процесса интересен тем, что в нем организуется динамический цикл по этапам согласования. Разумеется, циклы могут быть организованы по любым этапам или их группам.

В нашем случае мы возьмем список приглашенных из карточки протокола и последовательно будем согласовывать протокол с каждым из согласующих. Согласующие будут отсортированы по алфавиту, вне зависимости от того, как они заданы в карточке. Какого-то глубокого смысла этот процесс не имеет, это просто пример, относитесь к нему соответствующе.

routes sample3 01

Давайте создадим карточку протокола. В правой панели нажмите тайл "Протокол" в группе "Создать".

routes sample3 02

Откроется новая карточка протокола. Заполните ее, указав нескольких сотрудников в поле "Участники". Создать нового сотрудника вы можете в правой панели в группе тайлов "Создать → Роли → Персональная роль (сотрудник)", если у вас есть административные права.

routes sample3 03

Теперь давайте запустим процесс. В левой панели нажмите кнопку "Запустить процесс". Кстати, тайл запуска процесса может называться как угодно для разных процессов, типов документов и даже сотрудников. Это все настройки маршрутов.

routes sample3 04

В моем случае после запуска карточка выглядит вот так.

routes sample3 05

Первое задание отправилось сотруднику "Арамазамзам Г.Р.", а не нам. Увидеть это задание мы можем, если нажмем кнопку "Показать задания автора". Обычно инициатор является автором большинства заданий процесса, хотя можно настроить и по-другому.

routes sample3 06

Если вы имеете возможность войти в систему от имени этого сотрудника, так и сделайте, чтобы от его имени согласовать протокол. Я же, обладая правами администратора, могу сделать себя заместителем этого сотрудника и выполнить это задание, не выходя из текущего рабочего места.

На вкладке "Администратор" в представлении "Пользователи" найдите этого сотрудника и двойным щелчком мыши откройте его карточку. Далее на вкладке "Мои замещения" под таблицей "Кто меня замещает" нажмите кнопку "Добавить" и укажите себя (текущего сотрудника) как постоянного заместителя во всех ролях и подразделениях.

routes sample3 07

Далее сохраните карточку сотрудника нажатием тайла "Сохранить" в левой панели или сочетанием [ctrl+s]. Обратите внимание, что заместитель должен появиться в поле "Сотрудники" группы "Состав роли" карточки сотрудника. Это может произойти с небольшой задержкой, т.к. за пересчет замещений отвечает служба Chronos, входящая в состав платформы, которой может быть нужно небольшое время.

routes sample3 08

Теперь вернемся к карточке протокола и в левой панели нажмем тайл "Обновить" или просто [F5]. Теперь мы можем исполнить задание. В форме задания написано, что мы его видим как заместитель исполнителя (справа от фамилии исполнителя).

routes sample3 09

Возьмем его в работу и далее согласуем. Мы уже много раз это делали в предыдущих примерах. Система сразу же отправляет задание следующему согласующему по списку, т.е. нам.

routes sample3 10

Действительно, цикл работает. Вкладка "Маршрут" содержит всего несколько этапов, которые организуют инициализацию и выполнение цикла. Полностью посмотреть их настройки вы можете в рабочем месте "Администратор" в папке "Маршруты".

routes sample3 11

9.6. Создание уже зарегистрированного документа (пример)

Этот пример иллюстрирует интересную возможность подсистемы маршрутов, позволяющую из вторичного процесса маршрута управлять маршрутом и данными другой карточки, и даже выполнять часть маршрута в контексте другой карточки.

В данном случае система по нажатию глобального тайла:

  • Создаст карточку входящего по шаблону.

  • Выполнит для нее регистрацию.

  • Откроет карточку в рабочем месте пользователя.

Регистрация - это стандартная возможность системы. Обычно это тайл в карточке, по нажатию на который система выделяет для карточки постоянный номер и меняет состояние карточки на "Зарегистрировано".

В подсистеме маршрутов есть этап "Регистрация", который выполняет те же действия в автоматическом режиме или отправляет задание исполнителю.

В правой панели нажмите тайл "Зарегистрировать входящий".

routes sample4 01

Откроется карточка входящего. Обратите внимание, что на вкладке "История заданий" указано, что регистрация уже выполнена.

routes sample4 02

Полностью посмотреть настройки этого маршрута вы можете в рабочем месте "Администратор" в папке "Маршруты".

9.7. Установка примеров

Библиотека с примерами рассчитана на установку в дефолтную конфигурацию, с которой поставляется система. Если в стандартные маршруты или конфигурацию были внесены изменения, то примеры могут работать не так, как ожидается.

Загрузите библиотеку примеров по ссылке RoutingSamples.zip.

Для ее установки нужно:

  • Установить библиотеку схемы "RoutingSamples" из папки "Scheme". Она включает в себя несколько новых состояний карточек.

  • Импортировать типы карточек из папки "Types" и представления из папки "Views".

  • Добавить в рабочее место "Пользователь" (или в любое другое) узел с представлением RsEvents.

  • Установить библиотеку карточек "RoutingSamples.cardlib" из папки "Cards". Она включает в себя все необходимые маршруты, кнопки, шаблоны и подразделения.

Также, для корректной работы примеров после их импорта необходимо проверить некоторые условия и выполнить дополнительные настройки:

  • Убедитесь, что сотрудник, от которого выполняются примеры - входит в какое-нибудь подразделение, и у этого подразделения задан руководитель. В сценариях прохождения примеров мы рассчитываем, что все роли выполняет один и тот же человек (для удобства и простоты), но вы разумеется, можете включить любых пользователей в процесс.

  • Убедитесь, что в справочнике сотрудников есть сотрудник "Admin" (с идентификатором "3db19fa0-228a-497f-873a-0250bf0a4ccb"), который автоматически создается при установке системы на новую БД. При импорте некоторых объектов, таких как шаблоны карточек - он указан как владелец шаблона.

  • Проверьте, что для типа карточки "Протокол" (правая панель → Настройки → Типовое решение) и для типа документа "Служебная записка" в настройках типового решения установлен флажок "Использовать маршруты".

  • При импорте библиотеки карточек для примеров, у вас создадутся несколько подразделений, которые используются в настройках маршрутов. Если вы не хотите их использовать, то:

    • В карточке шаблона этапов "st: СЗ согласование" в этапе "Согласование с руководителем и фин. департаментом" укажите вместо подразделения "Финансовый департамент" (т.к. у вас не существует подразделения с таким идентификатором) - любое подразделение или роль, существующие в вашей системе.

    • В карточке шаблона этапов "st: СЗ исполнение" укажите в этапах "Исполнение финансовой СЗ" и "Исполнение обычной СЗ" любых исполнителей вместо указанных в них ролей "Департамент обеспечения" и "ДИТ" (т.к. у вас не существует подразделения с таким идентификатором).

  • Добавьте в настройки типового решения тип карточки Мероприятие:

    routes46

    В настройках типа карточки выставьте настройки, как на рисунке ниже:

    routes45

9.8. Настройка маршрутов пользователем

Пользователь может менять сформированный маршрут документа в пределах, разрешенных настройками маршрутов. Ему может быть доступно:

  • Добавление новых этапов в маршрут.

  • Изменение существующих этапов.

  • Изменение порядка этапов.

Изменение маршрута выполняется на вкладке "Маршрут" карточки документа. Чтобы определить, какие возможности есть у пользователя, система проверяет следующие правила:

  • Наличие права "Редактирование маршрута", согласно правилам доступа - для текущего типа и состояния карточки. Обратите внимание, что для объектов в состоянии отличном от "Проект", необходимо сначала нажать тайл "Редактировать". Если права "Редактирование маршрута" у пользователя нет - никакие возможости изменения маршрута не доступны. Если есть, то появляются описанные далее возможности.

  • В настройках группы этапов может быть указано, что группа нередактируемая. Тогда пользователь не сможет добавить новых этапов в эту группу и не сможет поменять настройки или порядок существующих этапов.

  • Если в настройках группы этапов указано, что группа редактируемая, то пользователь может добавить в эту группу новые этапы, согласно настройкам в справочнике настроек типового решения (см. далее).

  • Если в настройках группы указано, что группа редактируемая, то возможность редактирования или изменения порядка этапов, заданных в шаблонах этапов, будет зависеть от настроек, заданных в шаблоне этапов.

9.8.1. Справочник настроек этапов маршрута

Этот справочник позволяет настроить - каким пользователям в какие группы этапов и что (какие этапы) можно добавлять. Например, логично разрешить в группу этапов "Согласование" добавлять только этапы согласования. Редактировать справочник может только администратор.

Справочник расположен в справочнике настроек типового решения (правая панель → Настройки → Типовое решение) на вкладке "Настройки этапов маршрута".

routes43

Каждая строка в справочнике задает одно правило. В правиле можно указать:

Типы документов - для каких типов документов работает правило.

Группы этапов - в какие группы этапов будет разрешено добавлять этапы. Пользователь увидит эти группы этапов в диалоге добавления этапа.

Типы этапов - какие типы этапов разрешено добавлять в указанные выше группы. Пользователь увидит список этих типов этапов в диалоге добавления этапа.

Роли - любые роли в системе, кроме контекстных. Это поле определяет, кому именно разрешено добавлять указанные выше типы этапов. Если пользователь входит хотя бы в одну из перечисленных тут ролей, данное правило будет для него работать.

Когда пользователь нажимает кнопку "Добавить" на вкладке "Маршрут" система проверяет, разрешено ли ему добавлять этапы вообще (согласно вышеописанным правилам), а затем покажет список доступных для добавления групп и типов этапов, рассчитанный согласно настройкам, заданным в данном справочнике.

routes44
Диалог добавления этапов использует два представления KrFilteredStageGroups, KrFilteredStageTypes для получения списка доступных пользователю групп и типов этапов. Вы можете поменять их для получения какой-то своей собственной логики выбора.

9.9. Настройка маршрутов администратором

Различные объекты подсистемы маршрутов доступны администратору системы в рабочем месте "Администратор" в папке "Маршруты".

9.9.1. Карточка "Группа этапов"

Группа этапов объединяет несколько связанных по смыслу шаблонов этапов в группу маршрута. Обычно группы представляет крупные части маршрута, например "Подготовка", "Согласование" или "Исполнение".

Создать карточку группы этапов мы можете через правую панель "Создать карточку → Маршруты → Группа этапов" или нажав на кнопку routes18 на панели пейджинга в представлении "Шаблоны этапов".

routes4

Основная информация.

  • Название - название карточки для отображения в списках.

  • Описание - подробный комментарий к группе.

  • Порядок - целое число, которое определяет положение данной группы в общем маршруте. Должно быть уникальным. Система при построении маршрута упорядочивает группы именно по этому числу.

  • Все этапы нередактируемые - если флажок установлен, то пользователь при работе с маршрутом на вкладке "Маршрут" не сможет менять этапы в этой группе.

  • Кнопка процесса - ссылка на тайл процесса, с которым связана группа. Если ссылка установлена, то группа не попадает в основной маршрут карточки. Она будет подставлена в маршрут, выполняемый по нажатию соответствующего тайла. С одним тайлом может быть связано сколько угодно групп.

Ограничения при пересчете.

  • Типы - перечисление типов документов или карточек, в маршрут которых может быть подставлена данная группа. Если не указаны, то для всех типов. Если группа связана с глобальным тайлом, то значение этого поля игнорируется.

  • Роли - группа будет подставлена в маршрут, если текущий пользователь (который нажимает тайл или запускает процесс) входит в любую из указанных ролей. Если роли не указаны, они не проверяются.

Шаблоны этапов - здесь перечислены все шаблоны этапов, включенные в данную группу. Список строится автоматически, двойным щелчком мыши можно перейти в соответствующий шаблон.

Построение маршрута. В данной группе находятся условия и сценарии, выполняемые в момент построения маршрута.

routes5

На вкладке Условие можно задать условие, которое определяет включение этой группы в маршрут.

SQL условие - позволяет задать условие подстановки группы в маршрут при помощи sql. Вычисляется при построении маршрута.

Запрос должен возвращать ноль или одну строку и строго одну колонку. Истинным значением считается запрос, возвращающий 1. Ложным значением считается запрос, вернувший 0 строк или строку со значением 0 или NULL. Запрос, возвращающий более одной строки и более одного столбца, является некорректным.

В запросе доступны следующие плейсхолдеры:

  • #user_id - идентификатор текущего пользователя

  • #user_name - имя текущего пользователя

  • #card_id - идентификатор карточки, для которой производится расчет

  • #card_type_id - идентификатор типа карточки, для которой производится расчет

  • #doc_type_id - идентификатор типа документа текущей карточки

  • #type_id - айди типа документа текущей карточки, если он не пуст, в противном случае айди типа карточки.

  • #doc_state - целое число, идентификатор состояния текущей карточки

  • #stage_group_id - идентификатор текущей группы

Условное выражение - позволят задать условие подстановки группы в маршрут по правилам написания логических выражений языка C#. Доступные в контексте поля и объекты описаны в разделе Особенности работы сценариев и рекомендации по их использованию. Чаще всего используется объект Card, через который можно проверить (а в обычных сценариях и поменять) данные текущей карточки.

Инициализация - это сценарий, выполняемый перед построением маршрута. Постобработка - это сценарий, выполняемый после того, как маршрут построен.

Выполнение маршрута. В этой группе можно задать условия и сценарии, которые выполняются при выполнении маршрута.

На вкладке Условие можно задать условие, которое определяет, выполнится ли эта группа, когда маршрут до нее дойдет.

  • SQL условие - условие можно задать в форме запроса SQL.

  • Условное выражение - в этом поле можно задать условие в синтаксисе C#.

Инициализация - это сценарий, выполняемый перед выполнением этапов группы. Постобработка - это сценарий, выполняемый после того, как этапы группы выполнены.

Порядок построения маршрута и выполнения сценариев и проверки условий описан в данном разделе. Подробно про написание условий и сценариев для объектов маршрута рассказано в данном разделе.

9.9.2. Карточка "Шаблон этапов"

Новая карточка шаблона этапов создается из правого меню Создать карточку → Маршруты → Шаблон этапов. В новой вкладке будет открыта карточка:

routes6

Описание полей карточки:

Вкладка Карточка:

На данной вкладке указываются основные настройки и условия для подстановки этапов из текущего шаблона в карточку документа.

  • Название - уникальное название карточки шаблона этапов.

  • Описание - описание карточки, указывается при необходимости.

  • Положение относительно этапов, добавленных вручную - указывается, в начало или в конец маршрута в карточке документа добавить этапы из данного шаблона.

    • "В начале группы" - этапы этого шаблона в маршруте документа будут всегда в начале своей группы. Добавленные пользователем вручную этапы будут всегда идти после них.

    • "В конце группы" - то этапы из этого шаблона в карточке документа фиксируются в конце своей группы и, даже если пользователь после пересчета вручную будет добавлять новые этапы, они добавятся не в конец списка (как это привычно), а будут расположены в списке перед этапами из шаблона.

  • Порядок - номер порядка для данного шаблона. Актуально, если есть несколько шаблонов с одинаковыми настройками, тогда этапы из этих шаблонов будут добавляться в указанном порядке, т.е.: сначала этапы из шаблона с порядком 0, потом из шаблона с порядком 1 и т.д.

Пример. Есть два шаблона, оба настроены так, что должны добавляться в карточку договора. И один этап добавил пользователь вручную.

  • Шаблон 1: положение - в конце группы, порядок = 0, можно перемещать = нет;

  • Шаблон 2: положение - в конце группы, порядок = 1, можно перемещать = нет.

Пересчитываем маршрут в карточке договора и в результирующем маршруте порядок этапов такой:

  • Этап, добавленный вручную.

  • Шаблон 1.

  • Шаблон 2.

Мы видим, что добавился сначала этап из шаблона с порядком 0, после него этап из шаблона с порядком 1. Оба они в конце маршрута относительно этапов, добавленных пользователем вручную.

Однако, если в Шаблоне 1 мы выставим флаг "Можно перемещать" и пересчитаем маршрут в карточке договора, увидим, что результирующий маршрут изменился:

  • Этап, добавленный вручную.

  • Шаблон 2.

  • Шаблон 1.

Это связано с тем, что указанный в шаблонах порядок используется системой для сортировки этапов только в случае, когда настройки в полях "Положение" и "Можно перемещать" - одинаковы. В примере выше в одном из шаблонов мы изменили настройку "Можно перемещать" и система отсортировала этапы в соответствии с заложенным алгоритмом:

  1. В начале группы и нельзя менять порядок

  2. В начале группы и можно менять порядок

  3. Этапы, добавленные пользователем вручную

  4. В конце группы и можно менять порядок

  5. В конце группы нельзя менять порядок

В пределах каждой подгруппы этапы сортируются по значению поля "Порядок".

Этапы нередактируемые - при выставленном флаге сотрудник не сможет редактировать параметры этапов, которые были добавлены в карточку документа автоматически на основании данного шаблона (даже если у сотрудника, в соответствии с настроенными правилами доступа, есть разрешение на редактирование маршрута согласования). Администратору также будет недоступно редактирование таких этапов в карточке документа.

Можно перемещать - при выставлении флага сотрудник сможет перемещать этапы, которые были добавлены в карточку документа автоматически из данного шаблона (при наличии прав доступа на редактирование маршрута).

Если этап, добавленный из шаблона доступен для редактирования/перемещения и его отредактировали/переместили, то при изменении администратором настроек или положения этого этапа в шаблоне, он не будет обновляться в карточке документа при пересчете маршрута или его части.

Группа - группа, в которую входит этап. Каждый этап должен входить в группу.

Типы - список типов карточек, для которых данный шаблон этапов включается в маршрут. Если поле не заполнено, то данный шаблон будет действовать для всех типов документов.

Список ролей - список ролей, которым будет доступен данный шаблон этапов. Т.е. только для указанных сотрудников при расчете маршрута или его части будут подставляться этапы из данного шаблона (при выполнении всех других условий шаблона). Если поле не заполнено, то данный шаблон будет действовать для всех пользователей.

+ В поле можно указать как конкретных сотрудников, так и роли или подразделения.

SQL-условие - условие, задаваемое через SQL-запрос. Вычисляется при построении маршрута.

Запрос должен возвращать ноль или одну строку и строго одну колонку. Истинным значением считается запрос, возвращающий 1. Ложным значением считается запрос, вернувший 0 строк или строку со значением 0 или NULL. Запрос, возвращающий более одной строки и более одного столбца, является некорректным.

В запросе доступны следующие плейсхолдеры:

  • #user_id - идентификатор текущего пользователя

  • #user_name - имя текущего пользователя

  • #card_id - идентификатор карточки, для которой производится расчет

  • #card_type_id - идентификатор типа карточки, для которой производится расчет

  • #doc_type_id - идентификатор типа документа текущей карточки

  • #type_id - айди типа документа текущей карточки, если он не пуст, в противном случае айди типа карточки.

  • #doc_state - целое число, идентификатор состояния текущей карточки

  • #stage_template_id - идентификатор текущего шаблона

  • #stage_group_id - идентификатор группы, в которую включен текущий этап

  • #stage_type_id - идентификатор типа этапа

Условное выражение. Пишется по правилам написания логических выражений языка C#. Доступные в контексте поля и объекты описаны в разделе Особенности работы сценариев и рекомендации по их использованию. Чаще всего используется объект Card, через который можно проверить (а в обычных сценариях и поменять) данные текущей карточки.

  • Инициализация - при построении маршрута система сначала выполняет эти сценарии для всех подходящих по типу документа и роли шаблонов, а уже затем начинает вычислять условия для включения этапов в маршрут. На данном этапе можно выполнять сложные проверки и, при необходимости, отменить пересчет и выдать сообщение об ошибке.

  • Постобработка - сценарий выполняется после вычисления условий всех шаблонов и построения маршрута. На данном этапе можно изменить сформированный маршрут, если это необходимо.

Порядок построения маршрута и выполнения сценариев и проверки условий описан в данном разделе. Подробно про написание условий и сценариев для объектов маршрута рассказано в данном разделе.

Вкладка Маршрут:

На вкладке настраиваются этапы, которые будут подставлены в маршрут документа при выполнении всех условий данного шаблона.

routes7

Настройки этапов отличаются в шаблоне этапов и в карточке документа. Пользователь, при редактировании этапов в построенном маршруте, видит и имеет возможность указать не все параметры этапа. Некоторые из них могут быть доступны только в "дизайн-тайм", т.е. когда администратор редактирует этапы в карточке шаблона.

Доступные типы этапов описаны в разделе Типы этапов.

Вкладка Результат компиляции.

На данной вкладке отображается информация (т.е. лог) по выполнению компиляции текущего шаблона и всех шаблонов и методов. Компиляцию можно выполнить, нажав на нужной вкладке кнопку "Выполнить компиляцию" или на кнопку "Проверить скрипты", расположенную в левом меню системы (по данной кнопке выполняется компиляция всех шаблонов и методов).

"Частичная" компиляция (т.е. компиляция на вкладке "Этот сценарий") используется для проверки сценариев из этого шаблона, а также из всех методов расширений. "Полная" сборка (вкладка "Все сценарии") компилирует все шаблоны и все методы.

Кнопки выполнения компиляции нужны только для проверки корректности написания сценариев, однако не обязательны, т.к. компиляция выполняется автоматически, когда она необходима.

При компиляции не выполняется проверка SQL запросов.

9.9.3. Общие настройки этапов

У всех этапов, независимо от типа, есть некоторые общие настройки (помимо названия).

routes47

Не показывать в маршруте - признак того, что в маршруте документа этап не будет отображаться, даже если попадает в маршрут. Посмотреть скрытые этапы можно с помощью плитки Другие → Показать скрытые этапы или с помощью сочетания клавиш [ctrl+alt+H].

routes12

Условие - тут можно либо в виде SQL запроса, либо в виде C# выражения (как на примере) задать условие выполнения данного этапа. Если это условие не выполняется в момент, когда до этапа доходит выполнение маршрута, то этап будет пропущен.

SQL условие. Истинным значением считается запрос, возвращающий 1. Ложным значением считается запрос, вернувший 0 строк или строку со значением 0 или NULL.

Запрос, возвращающий более одной строки и более одного столбца, является некорректным.

В запросе доступны следующие плейсхолдеры:

  • #user_id - идентификатор текущего пользователя

  • #user_name - имя текущего пользователя

  • #card_id - идентификатор карточки, для которой производится расчет

  • #card_type_id - идентификатор типа карточки, для которой производится расчет

  • #doc_type_id - идентификатор типа документа текущей карточки

  • #type_id - айди типа документа текущей карточки, если он не пуст, в противном случае айди типа карточки.

  • #doc_state - целое число, идентификатор состояния текущей карточки

  • #stage_template_id - идентификатор текущего шаблона

  • #stage_rowid - идентификатор строки этапа в маршруте

  • #stage_group_id - идентификатор группы, в которую включен текущий этап

  • #stage_type_id - идентификатор типа этапа

Условное выражение. Пишется по правилам написания логических выражений языка C#. Доступные в контексте поля и объекты описаны в следующем разделе. Чаще всего используется объект Card, через который можно проверить (а в обычных сценариях и поменять) данные текущей карточки.

Пример условия, проверяющего сумму договора.

	Card.DocumentCommonInfo.Amount > 100000

Инициализация. В этом поле задается сценарий, выполняемый перед выполнением этапа.

Постобработка. В этом поле задается сценарий, выполняемый после выполнения этапа.

Подробнее сценарии описаны в следующем разделе.

SQL исполнители. Для этапов, в которых есть список исполнителей (например, этап "Задача"), в этом поле можно написать sql-запрос, который будет выполнен для формирования списка исполнителей. Запрос выполнится непосредственно перед выполнением этапа. Также есть возможность смешивать вручную заданных исполнителей, подставив в нужное место исполнителей, рассчитанных через запрос.

Запрос должен возвращать выборку, состоящую из двух столбцов: ID роли и имя роли. В запросе доступны следующие плейсхолдеры:

  • #card_id - идентификатор карточки, для которой производится расчет

  • #card_type_id - идентификатор типа карточки, для которой производится расчет

  • #user_id - идентификатор текущего пользователя

  • #user_name - имя текущего пользователя

  • #stage_template_id - идентификатор текущего шаблона

  • #stage_template_name - название текущего шаблона

  • #stage_rowid - RowID этапа в таблице шаблона этапов, для которого вычисляются роли

Например, добавим этап, в котором укажем одного согласующего, а также SQL запрос для вычисления исполнителей - запрос, вычисляющий всех пользователей и активных заместителей в подразделении "Финансовый департамент":

routes13

Вот какой результат возвращает запрос.

routes15

Перед выполнением этапа система выполнит запрос и сформирует полный список исполнителей. По умолчанию все вычисляемые согласующие добавляются в конец, т.е. после указанных в этапе исполнителей.

routes14

Однако, при необходимости, можно указать положение вычисляемых согласующих в этапе. Для этого в список согласующих необходимо добавить служебную роль "Вычисляемые согласующие" в список исполнителей. Нажмите ссылку "Добавить роль Вычисляемые исполнители" под списком исполнителей. В список исполнителей добавится роль "Вычисляемые исполнители". Добавьте любых других исполнителей до и\или после этой роли. Например:

routes16

На место роли "Вычисляемые согласующие" будут подставлены исполнители, вычисленные в результате выполнения SQL запроса. Исполнители подставляются в том же порядке, в котором они возвращаются запросом.

9.9.4. Карточка "Вторичный процесс"

При помощи карточки "Вторичный процесс" можно описать новый процесс, который можно запускать в карточке независимо от основного, отображенного на вкладке "Маршрут", или глобально, т.е. вне контекста карточки. Такой маршрут может выполнять любые действия - управлять основным процессом (отозвать, выполнить переход и т.п.), манипулировать данными текущей карточки, запускать новые процессы, отправлять задания и так далее.

Вторичный процесс поддерживает несколько режимов: * Простой процесс - процесс, который можно запускать в расширениях или скриптах. * Кнопка - процесс, запускаемый по плитке в левой(локальный) или в правой(глобальный) панели. * Действие - процесс, запускаемый по какому-либо событию

Основные настройки и выбор режима:

routes19 1

Название - название карточки, которое будет отображаться в представлении и ссылках на вторичный процесс.

Описание - подробное описание нюансов этого вторичного процесса. Полезно для комментирования.

Режим - выбор режима вторичного процесса. В зависимости от режима отображаются специфичные настройки.

Глобальный - флаг, определяющий, выполняется ли данный процесс в контексте карточки. Если процесс глобальный, то в контексте отсутствует карточка. Глобальные процессы могут быть только синхронными.

Асинхронный - если маршрут, связанный с вторичным процессом, асинхронный, т.е. отправляет задания или выполняет какие-то другие асинхронные этапы, то необходимо ставить этот флажок. Синхронные процессы строятся и выполняются целиком в памяти, это быстрее и эффективнее, но не позволяет отправлять задания в рамках процесса.

Группы этапов вторичного процесса - список, показывающий все группы, относящиеся к данному вторичному процессу. Список является неизменяемым, вторичный процесс для группы устанавливается в настройках карточки группы.

routes19 2

Сообщение о недоступности кнопки для нажатия - сообщение, которое выводится пользователю, если проверка при запуске процесса выполнилась неуспешно. При запуске прцоесса проверяются различные роли (поля Роли, Контекстные роли) и сценарии из группы Дополнительные настройки выполнения (SQL условие и условное выражение C#). Например, Выполнить это действие может только инициатор процесса. Обратитесь к Васильеву В.В..

В группе Ограничения при пересчете расположены различные ограничения на запуск вторичного процесса или видимость кнопки.

Типы - для каких типов карточки или документа данный процесс можно запускать. Применимо только к контекстным вторичным процессам и игнорируется для глобальных.

Роли - текущий пользователь должен входить в одну из этих ролей, чтобы запустить процесс. Доступны только роли, имеющие постоянный состав: сотрудник, подразделение, группа, динамическая роль. Проверки контекстных ролей, например "Инициатор", выполняются при запуске процесса (см. поле Контекстные роли). Это сделано для того, чтобы гарантировать быстрое открытие карточки или клиента. Вычисление контекстных ролей может занимать какое-то время и замедлять открытие карточки. Выполнять их каждый раз при открытии неэффективно.

Состояния карточек - в каких состояниях карточек процесс доступен для запуска (видима кнопка). Применимо только к контекстным процессам и игнорируется для глобальных.

Контекстные роли - список контекстных ролей, например "Инициатор процесса", "Руководитель подразделения инициатора", которые будут вычислены на сервере при нажатии тайла и система проверит, что пользователь входит хотя бы в одну из них.

routes19 3
Режим "Простой процесс"

Разрешить запуск на клиенте - простой процесс может быть запущен в клиентском коде. Проверка ограничений будет выполнена

Проверять ограничения при пересчете - необходимо ли проверять ограничения, указанные в блоке "Ограничения при пересчете". Настройка актуальна, только если запуск с клиента запрещен.

routes19 4
Режим "Кнопка"

Проверить наличие новых заданий после выполнения - после нажатия на тайл и выполнения на сервере маршрута, связанного с тайлом, клиентское приложение проверит новые задания и выведет соответствующее уведомление.

routes21

Это очень удобно, если маршрут написан так, что отправляет текущему пользователю какое-то задание. Сразу после выполнения пользователь увидит, что ему пришло новое задание.

Текст плитки - текст на тайле, который увидит пользователь. Допускается использовать строки локализации и их комбинации.

Включить в группу - название группы, в которую будет помещена эта плитка. Укажите одинаковое название группы в нескольких тайлах и все они будут в одной группе. Поддерживается только один уровень вложенности. Можно использовать локализацию.

Значок - алиас иконки для этого тайла. Доступные иконки вы можете увидеть в файле Thin Icons.png в папке с документацией в архиве с релизом платформы.

Размер плитки - размер плитки.

Текст подтверждения - вопрос, который нужно задать пользователю. Подтверждение будет показано, только если установлен флажок Спрашивать подтверждение.

routes22

Сообщение после завершения - сообщение, которое будет показано пользователю после выполнения маршрута, связанного с тайлом. Любая полезная пользователю информация, включая локализацию.

Всплывающая подсказка - подсказка, которую увидит пользователь, если задержит мышь на тайле на полсекунды.

Группировать в "Действия" - тайл (вместе с группой, если она задана), будет отображаться в группе "Действия" контекстной панели. Применимо только для контекстных тайлов.

routes19 5
Режим "Действие"

Тип события - событие, по которому будет запущен маршрут. Доступны следующие события:

  • Создание карточки - запуск маршрута при создании карточки. Аналочно методу расширения CardNewExtension.AfterRequest, в контексте доступна только что созданая карточка Card.

  • Перед сохранением карточки - запуск маршрута перед сохранением карточки. Аналочно методу расширения CardStoreExtension.BeforeRequest, в контексте доступна сохраняемая карточка Card (в пакете карточки присутствуют только изменения). Данный тип события может быть полезен для проверок и дополнительной валидации данных.

  • Сохранение карточки - запуск маршрута при сохранении карточки. Аналочно методу расширения CardStoreExtension.BeforeCommitTransaction, при обращении к карточке Card полный пакет карточки будет загружен повторно. В данном событии можно запускать более сложные маршруты, в т.ч. отправляющие задания.

  • Перед завершением задания - запуск маршрута при завершении задания (выборе одного из варианта завершения, в т.ч. с выставленным флажком "Не удалять задание"). Аналогично методу расширения CardTaskStoreExtension.BeforeRequest. Задание доступно в поле CardTask.

  • Завершением задания - запуск маршрута при завершении задания (выборе одного из варианта завершения, в т.ч. с выставленным флажком "Не удалять задание"). Аналогично методу расширения CardTaskStoreExtension.BeforeCommitTransaction. Задание доступно в поле CardTask.

  • Перед созданием задания - запуск маршрута при создании задания. Аналогично методу расширения CardTaskStoreExtension.BeforeRequest. Задание доступно в поле CardTask.

  • Завершением задания - запуск маршрута при создании задания. Аналогично методу расширения CardTaskStoreExtension.BeforeCommitTransaction. Задание доступно в поле CardTask.

routes19 6

Далее следуют скрипты для определения "выполняемости" процесса, а также видимости кнопки (если вторичный процесс в режиме "Кнопка").

routes20

SQL условие - запрос, вычисляющийся при расчете видимости плитки или выполнения вторичного процесса. Запрос должен возвращать ноль или одну строку и строго один столбец. Истинным значением считается запрос, возвращающий 1. Ложным значением считается запрос, вернувший 0 строк или строку со значением 0 или NULL. Запрос, возвращающий более одной строки и более одного столбца, является некорректным.

Список доступных для всех видов процессов плейсхолдеров:

  • #user_id - идентификатор текущего пользователя

  • #user_name - имя текущего пользователя

  • #button_id - идентификатор карточки, описывающей нажатый тайл

Следующие плейсхолдеры доступны только в контекстных процессах:

  • #card_id - идентификатор карточки, для которой производится расчет

  • #card_type_id - идентификатор типа карточки, для которой производится расчет

  • #doc_type_id - идентификатор типа документа текущей карточки

  • #type_id - айди типа документа текущей карточки, если он не пуст, в противном случае айди типа карточки.

  • #doc_state - целое число, идентификатор состояния текущей карточки

Условное выражение - условное выражение в синтаксисе C#. Если истинно, то тайл будет виден или процесс запущен. Например, тайл, который виден, если сумма договор больше 100000.

Card.DocumentCommonInfo.Amount > 100000
Запрос и сценарий идимости вычисляются каждый раз, когда системе нужно проверить видимость тайла, например, при открытии карточки. Убедитесь что эти условия выполняются очень быстро и не перегружайте систему.

Обращаем ваше внимание, что сценарии предназначены именно для проверки видимости или возможности выполнения процесса. Если вы хотите по нажатию на тайл выполнить какой-то сценарий, правильнее сделать маршрут из одного этапа "Сценарий" и выполнять его по нажатию тайла.

9.9.5. Карточка "Метод расширения"

Карточку метода расширения вы можете использовать как библиотеку кода. В ней можно определять свои собственные свойства и методы, а затем использовать их из любых сценариев.

Новая карточка метода расширения создается из правого меню Создать карточку → Маршруты → Метод расширения. В новой вкладке будет открыта карточка:

image271

Описание полей карточки:

Вкладка Карточка:

  • Название - уникальное название карточки метода расширения.

  • Описание - описание карточки, указывается при необходимости.

  • Тело метода - поле для написания кода данного метода.

Система объединяет все карточки методов расширений в один класс, методы и свойства которых затем доступны из любых сценариев подсистемы маршрутов.

Ниже пример метода расширения, который определяет константу с телом письма и вспомогательный метод отправки уведомления указанного формата.

#using Tessa.Notices

public const string MessageFormat = @"
<html>
<body>
  Это письмо предназначено для {0}.
</body>
</html>
";

public void SendNotificationExample()
{
  IMailService service = Resolve<IMailService>(MailServiceNames.WithoutTransaction);

  var query = @"
    select distinct
      ""pr"".""Email""
    from ""PersonalRoles"" as ""pr""
    join ""RoleUsers"" as ""ru"" using(""ID"")
    join ""DocumentCommonInfo"" as ""dci"" on ""dci"".""AuthorID"" = ""ru"".""ID""
    where ""dci"".""ID"" = @cardID and ""pr"".""Email"" is not null;";

  Db.SetCommand(query, Db.Parameter("cardID", CardID));
  var emails = Db.ExecuteScalarList<string>();
  Show(emails.Count);
  foreach (var email in emails)
  {
    service.PostMessage(email, "Важное письмо", string.Format(MessageFormat, email), ValidationResult);
  }
}

Вызвать такой метод из любого сценария можно так.

...
SendNotificationExample();
...

Обратите внимание, что отправлять уведомления лучше с использованием стандартного этапа "Отправка уведомления" и карточки "Уведомление" (см соответствующий раздел документации).

Вкладка Результат компиляции

На данной вкладке отображается информация (т.е. лог) по выполнению компиляции текущего метода и всех шаблонов и методов. Компиляцию можно выполнить нажав на нужной вкладке кнопку "Выполнить компиляцию" или на кнопку "Проверить скрипты", расположенную в левом меню системы (по данной кнопке выполняется компиляция всех шаблонов и методов).

После компиляции система выводит информационное сообщение аналогично, как при компиляции из карточки шаблона этапов.

Кнопки выполнения компиляции нужны только для проверки корректности написания скриптов. Подсистема маршрутов автоматически компилирует сценарии, когда это требуется.

9.9.6. Состояние процесса, состояние этапа и настройки этапа

Состояние процесса - это набор параметров, предназначенных для использования в качестве универсального хранилища любых данных, нужных при работе процесса - сценариям, этапам, группам и т.д. Технически это hash, т.е. набор элементов вида "Ключ: Значение", где значением может быть скаляр, массив или вложенный хэш, что позволяет хранить там данные любой сложности и вложенности. Обращаться к этим данным могут любые этапы и сценарии. У каждого процесса маршрута, первичного или вторичного, своё отдельное состояние. Оно создается в момент первого обращения к нему и далее системой никогда не очищается. Хранится состояние процесса в сериализованном в json виде в поле ApprovalCommonInfo.Info.

Например:

{
	"Cycle::int":3,
	"CurrentPerformer::int":1,
	"TotalPerformers::int":1
}

Любой сценарий может обращаться к состоянию процесса, читать и писать туда значения в чрезвычайно простом синтаксисе.

{
	// Добавим параметр "HasFinancialGroud" и установим ему значение
	ProcessInfo.HasFinancialGround = false

	// Проверка значения
	if (ProcessInfo.HasFinancialGround == false) {
		...
	}
}

Состояние этапа - аналогично состоянию процесса, это hash, но относится он к конкретному этапу процесса. Создается он в момент добавления этапа в маршрут и далее никогда не очищается. При этом, разумеется, если этап в какой-то момент был удален из маршрута, а потом добавлен заново - у него будет новое состояние. Как и состояние процесса, состояние этапа доступно из сценариев данного этапа (а при необходимости и из любых других сценариев маршрута) и предназначено для хранения информации, специфичной для конкретного этапа и его сценариев. Также, через состояние этапа он может обмениваться полезной информацией со сценариями в этом этапе. Состояние этапа хранится в сериализованном виде в json формате в поле KrStages.Info.

Например, этап создания карточки записывает идентификатор только что созданной карточки в состояние этапа в поле с именем "cardID" и сценарий постобработки может обратиться к этой информации:

	//Выведем идентификатор созданной карточки в отладочное сообщение
	Show( (Guid)StageInfo.cardID );

Настройки этапа - это тоже hash, в котором хранятся все настройки этапа, которые доступны в пользовательском интерфейсе. Абсолютно все поля и параметры, которые там можно задать - хранятся в настройках этапа. Как и состояние, настройки этапа доступны для чтения и изменения любым сценариям. Типичное их использование - это в сценарии инициализации динамически рассчитать и задать какие-то параметры этапа, которые было невозможно сразу задать в пользовательском интерфейсе. Изменять можно абсолютно все параметры, которые вы видите в пользовательском интерфейсе этапа.

Вот пример сценария, который меняет текст задания перед его отправкой в этапе "Задача".

Stage.Settings.KrResolutionSettingsVirtual__Comment = "Не забудьте приложить файл.";

В базе данных настройки этапа тоже хранятся в сериализованном в json виде в поле KrStages.Settings.

Чтобы узнать, как называется тот или иной параметр, поменяйте его в интерфейсе этапа, закройте форму этапа и нажмите <Ctrl+g> для просмотра структуры изменённой карточки. На изображении ниже приведен пример того, что вы увидите, если измените состояние флажка "Отдельная задача каждому исполнителю" в этапе Задача. В настройках этот флажок доступен по имени "KrResolutionSettingsVirtual__MassCreation". routes11

Обратите внимание на тот факт, что некоторые из настроек доступны не в объекте Stage.Settings, а напрямую в текущем контексте. Например, чтобы изменить срок задания, можно написать просто TimeLimit = 3;. Подробности описаны в следующем разделе.

9.9.7. Особенности работы сценариев и рекомендации по их использованию

Сценарии в системе маршрутов могут быть следующие:

  • В тайле можно задать сценарий (условие) видимости и сценарий, который выполняется при нажатии на тайл.

Сценарии, выполняемые при построении маршрута:

  • В группе можно задать условное выражение, сценарии инициализации и постобработки.

  • В шаблоне этапов можно задать условное выражение, сценарии инициализации и постобработки.

Сценарии, выполняемые при прохождении маршрута:

  • В группе можно задать условное выражение, сценарии инициализации и постобработки.

  • В каждом отдельном этапе можно задать условное выражение, сценарии инициализации и постобработки.

Все сценарии выполняются на серверной стороне.

Порядок построения маршрута и выполнения сценариев и проверки условий описан в данном разделе.

Можно выделить следующие основные рекомендации и нюансы работы сценариев.

Сценарии, выполняемые при расчете маршрута:

  • Инициализация выполняется при построении маршрута для всех шаблонов перед проверками всех условий, Постобработка - после построения всего маршрута документа.

    Инициализация может использоваться, например, чтобы запретить запуск процесса, выведя при этом сообщение об ошибке, если какое-то поле в карточке не заполнено. При этом маршрут даже не будет построен. Или чтобы что-то заполнить так, чтобы другие этапы могли использовать эту информацию.

    Постобработка выполняется при построении маршрута, получает маршрут и может его как угодно изменять. Например, удалить повторяющихся согласующих в случае, если несколько шаблонов с одним и тем же согласующим сработали сразу. Или динамически вычислить и добавить этап в маршрут согласования. Или удалить лишние этапы.

  • При расчете условий сначала выполняется "Условное выражение", если оно успешно (или не задано), то после выполняется SQL-условие, и в случае, если и оно успешно (или не задано) - этапы из шаблона будут добавлены.

    Т.е. шаблон\группа "сработает" и добавит этапы в карточку документа только в случае успешного выполнения и C# условия, и SQL-условия или если данные поля (или поле) пустые.

  • Постобработка выполняется всегда, включая случаи, когда шаблон не подтвержден (т.е. если не выполнено C# или SQL условия). Это может использоваться для принятия каких то решений в зависимости от подтверждения самого шаблона: если подтвержден выполнить какое-то действие, если не подтвержден - другое.

Сценарии, выполняемые при проходе маршрута.

  • Сценарии инициализации в этапах обычно используются для какой-то настройки параметров этапа. Например, программно вычислить срок задания.

  • Сценарии постобработки в этапах удобно использовать для проверки результатов этапа. Некоторые этапы в состояние этапа записывают результаты своей работы, их можно как-то обработать. Можно проверить, что пользователь при завершении задания задал все нужные параметры в задании или карточке и выдать ошибку.

  • Порядок расчета условий тот же, что и в дизайн-тайм условиях.

Сценарии в тайлах:

  • Сценарий видимости должен работать как можно быстрее. В нем запрещено выполнять какие-либо сложные или длительные действия, т.к. это влияет на скорость и даже возможность открытия карточки.

  • Сценарии проверки при нажатии предназначен для более сложных проверок, которые неоптимально делать при загрузке карточки. Но тем не менее, не перегружайте его функциональностью. Если вам нужно выполнить что-то сложное при нажатии на тайл - свяжите с тайлом маршрут и выполните нужные вам действия в этапе "Сценарий" в этом маршруте.

В любой ситуации, если хотите отменить текущую операцию (построение маршрута, запуск процесса, завершение этапа), выполните сценарий примерно такого вида:

     AddError("Пожалуйста, заполните категорию!");
Также все приведённые ниже свойства и методы описаны в интерфейсе IKrScript в расширениях типового решения в файле Source/Extensions/Tessa.Extensions.Default.Server/Workflow/KrCompilers/UserAPI/IKrScript.cs и в документации по API: IKrScript.

Постобработка выполнения этапа выполняется как при нормальном завершении, так и при прерывании этапа. Чтобы отличать различные причины завершения этапа, можно использовать следующий код:

if (Stage.State == KrStageState.Inactive) {
    Show("Отозвано");
} else if (Stage.State == KrStageState.Skipped) {
    Show("Пропущено");
} else if (Stage.State == KrStageState.Completed) {
    Show("Завершено");
}
  • Отозвано может быть при отзыве/отмене

  • Пропущено при регистрации с активным этапом

  • Завершено при согласовании/несогласовании

9.9.8. Написание сценариев для объектов маршрута

В данном разделе представлена информация о свойствах и методах, которые могут использоваться при написании сценариев. Простые примеры сценариев есть в подсказках рядом с полями, где задается текст сценария.

В скриптах, в зависимости от назначения скрипта, содержится информация о контексте его выполнения.

Для проверки скриптов на ошибки необходимо нажать тайл "Проверить скрипты" в левой панели, сочетание клавиш ctrl + alt + B или нажать кнопку "Выполнить компиляцию" на вкладке "Результат компиляции"

  • В случае успешной компиляции:

    routes8
  • В случае наличия ошибок компиляции:

    routes9

    Обратите внимание, что дважды щелкнув по строке с информацией об ошибке, вы увидите сценарий и указание на конкретное место ошибки.

    routes10

Обратите внимание, что если при попытке открыть карточку или запустить процесс появляется сообщение об ошибке "Сборка не найдена. Проверьте вывод компилятора на наличие ошибок компиляции.", то для поиска точного местоположения ошибки необходимо перейти на вкладку "Результат компиляции" любой карточки, содержащей данную вкладку, а затем выбрать вкладку "Все сценарии" и нажать кнопку "Выполнить компиляцию". Будет произведена компиляция всех скриптов в системе и выведены ошибки.

Ниже информация о свойствах контекста, которые доступны во всех скриптах:

Информация о выполняемом этапе

Информация о процессе

  • ProcessID - идентификатор процесса. Используется только для асинхронных процессов.

  • ProcessTypeName - тип процесса. Может принимать значения KrProcess и KrSecondaryProcess.

  • WorkflowProcess - объектная модель процесса. Более подробная информация об объекте процесса.

  • Stages - список этапов в процессе. Алиас для WorkflowProcess.Stages.

  • CurrentStages - подсписок этапов в маршруте. В зависимости от контекста выполнения содержит разные выборки. Данный массив является неизменяемым, однако его элементы могут быть отредактированы.

    • Скрипт этапа - массив из одного элемента (текущий этап).

    • Скрипт шаблона этапов - массив из этапов текущего шаблона.

    • Скрипт группы этапов - массив из этапов текущей группы.

  • ProcessInfo - состояние процесса. Алиас для WorkflowProcess.Info.

  • Cycle - номер текущего цикла. Представляет типизированный интерфейс для получения/записи свойства в ProcessInfo, где хранится значение цикла. Важно отметить, что номер цикла хранится в состоянии основного процесса, однако обращаться через свойство Cycle можно и во вторичных процессах, однако каждый раз при этом происходит десериализация и сериализация состояния основного процесса. Поэтому обращение к Cycle вне основного процесса является дорогостоящей операцией и должно быть максимально сокращено.

  • InitiatorID - ID сотрудника, указанного инициатором в карточке.

  • InitiatorName - имя сотрудника, указанного инициатором в карточке.

  • InitiatorComment - комментарий к циклу согласования, указанный в карточке.

Информация о выполняемом шаблоне

  • TemplateID - ID карточки шаблона этапа.

  • TemplateName - название карточки шаблона этапа.

  • Order - позиция карточки шаблона этапа.

  • Position - положение относительно этапов, добавленных вручную. Может принимать значения:

    • GroupPosition.AtFirst - для шаблонов в начале маршрута,

    • GroupPosition.AtLast - для шаблонов в конце маршрута.

  • CanChangeOrder - флаг "Можно перемещать".

  • IsStagesReadonly - флаг "Этапы нередактируемые".

Информация о карточке

Карточка:

  • CardObject (класс Card) - объект карточки, содержащий идентификатор, секции и другую информацию. Для получения полей строковых секций удобно использовать свойство Card (см. ниже).

  • CardID (тип Guid, readonly) - идентификатор карточки.

  • CardTypeID (тип Guid, readonly) - идентификатор типа карточки.

  • CardTypeName (строковый тип string, readonly) - название типа карточки.

  • CardTypeCaption (строковый тип string, readonly) - название типа карточки (отображаемое).

  • Version (числовой тип int, readonly) - версия карточки.

Поля в карточке, файлы:

  • Card (dynamic entries) - представление строковых секций карточки посредством dynamic-полей. Через данное свойство удобно получать значения конкретных полей в строковых секциях карточки, например: Card.DocumentCommonInfo.Amount.

  • CardTables (dynamic tables) - представление табличных секций карточки в виде dynamic-полей. Через данное свойство удобно получать строки из коллекционных секций, а также значения полей в строках, например: Card.Recipients[0].UserID.

  • Files (ListStorage<CardFile>) - список файлов в карточке.

Задание:

  • CardTask - текущее завершаемое задание. Доступно, только если продвижение маршрута связано с завершением задания.

Сохранение, загрузка, валидация:

  • CardContext (производные от ICardExtensionContext) - контекст сохранения или загрузки карточки, в зависимости от того, при каких условиях происходит пересчет.

  • ValidationResult (IValidationResultBuilder) - результат валидации. В него можно записывать данные, которые будут отображены пользователю после пересчета. Если указать результат валидации с уровнем Error, то пересчет будет считаться неудачным.

  • Info (словарь Dictionary<string, object>) - дополнительная структура данных, которую можно использовать для хранения полезной информации.

Зависимости

  • Session - Сессия текущего пользователя. Используйте Session.User.ID, чтобы получить идентификатор текущего пользователя.

  • Db - Объект, используемый для выполнения SQL-запросов к текущей БД.

    • По умолчанию уже открыто соединение к основной БД системы, но посредством вызова using (DbScope.CreateNew("connectionAlias")) { …​ } можно изменить базу данных, доступную по свойству Db, может быть изменена.

    • Пример выполнения запроса: int result = Db.SetCommand("select @Result", Db.Parameter("Result", 42)).LogCommand().ExecuteScalar<int>().

    • Следует учесть, что Db.Parameter("Result", 0) ведет себя нелогично и определит параметр типа nvarchar со значением DbNull, т.к. будет использована некорректная перегрузка метода Db.Parameter(). В связи с этим добавьте преобразование типа значения к object: Db.Parameter("Result", (object)0).

  • DbScope - Объект, обеспечивающий доступ к базам данных.

    • Позволяет открывать соединение к другим БД: using (DbScope.CreateNew("connectionAlias")) { …​ }.

    • Также определяет тип СУБД, которая используется системой: DbScope.Dbms.

    • Вместо вызова DbScope.Db для простоты рекомендуется использоваться свойство Db, описанное выше.

  • UnityContainer - IoC-контейнер для получения любых необходимых зависимостей в рамках системы. Для более удобного использования есть метод Resolve<T>() о котором написано ниже.

  • CardMetadata - Содержит метаинформацию, необходимую для использования типов карточек совместно с пакетом карточек.

  • CardCache - Потокобезопасный кэш с карточками и дополнительными настройками.

  • KrTypesCache - Кэш по типам карточек и документов, содержащих информацию по типовому решению.

  • KrScope - Объект для работы с текущим контекстом расширений типового расширения и использования разделяемых объектов карточек.

    • Exists - признак того, что в данный момент существует KrScope.

    • CurrentLevelID - идентификатор текущего уровня вложенности.

    • GetLevels() - список идентификаторов всех уровней вложенности запроса. Размер массива равен количеству вложенных сохранений.

    • GetMainCard(Guid mainCardID) - получить основную карточку из Scope. Разрешено использовать только в BeforeCommitTransaction или позже. При первом обращении карточка будет загружена полностью, далее ее объект будет закэширован и после завершения обработки автоматически сохранен.

    • GetKrSatellite(Guid mainCardID) - получить основной сателлит Kr процесса. Рекомендуется использовать во всех расширениях на карточки, включенные в типовое решение вместо явной загрузки через ICardRepository.

    • GetSecondaryKrSatellite(Guid processID) - получить сателлит вторичного процесса по идентификатору вторичного процесса.

Контроль выполнения шаблона

  • Confirmed - свойство, принимающее true, если этап был подтвержден (оба условия выполнились. Имеет смысл только в постобработке скриптов построения маршрута.

  • KrScriptType - свойство, описывающее текущее выполняемое действие. Может принимать следущие значения:

    • KrScriptType.Before

    • KrScriptType.Condition

    • KrScriptType.After

    • KrScriptType.ButtonVisibility

    • KrScriptType.ButtonExecution

Методы, доступные в контексте
  • ListStorage<CardRow> CardRows(string sectionName) - получить типизированный список строк из коллекционной секции основной карточки. .Пример

    foreach(var row in CardRows("Recipients") {
         ...
    }
  • IsMainProcess() - получить признак того, что текущий процесс является основным KrProcess. .Пример

    if (IsMainProcess()) {
        // В основном процессе, маршрут отражен на вкладке
    } else {
        // Вторичный процесс.
    }
  • IsMainProcessStarted() - получить признак того, что основной KrProcess в настоящий момент активен.

  • RunNextStageInContext(Guid cardID, bool wholeCurrentGroup = false, IDictionary<string, object> processInfo = null) - выполнить следующий этап в контексте другой карточки. Данный метод имеет смысл только при выполнении маршрута. Если метод вызвать в скрипте инициализации, тогда текущий этап будет выполнен в другом контексте, иначе, если в постобработке, то следующий этап. Для карточки с идентификатором cardID будет запущен вторичный синхронный процесс, состоящий из текущего этапа или всех оставшихся этапов до конца текущей группы (wholeCurrentGroup == true). Для создаваемого синхронного процесса можно опционально передать ProcessInfo.

  • ContextChangePending() - возвращает признак того, что смена контекста с помощью метода RunNextStageInContext запланирована.

  • DoNotChangeContext() - отмена смены контекста.

  • Resolve<T>(string name = null) - получить зависимость из IoC-контейнера с опциональным указанием имени (если зависимость является именованной, например, ICardRepository).

    Пример
         var cardRepository = Resolve<ICardRepository>(CardRepositoryNames.Default);
  • AddStage(string name, StageTypeDescriptor descriptor, int position) - добавить этап к маршруту с именем name и положением position. По умолчанию position - в конец.

    Особенности метода:

    • Если этап не был добавлен скриптом при предыдущих пересчетах, он будет создан с новым RowID.

    • Если этап был добавлен ранее, то RowID будет перенесен, но все значения изменены на стандартные.

    • Если этап был добавлен ранее и изменен пользователем, то возвращается null.

    • Можно использовать только в скрипте построения шаблона этапов.

      Пример
          var stage = AddStage("ПримерЭтапа", StageTypeDescriptor.ApprovalDescriptor, 1);
      
          if(stage != null){
              stage.Comment = "Новый комментарий";
          } else {
              // При этом положение измененного пользователем этапа не специфицируется.
              // Для удержания этапа на том же месте необходимо использовать GetOrAddStage
              AddWarning("Этап изменен вручную");
          }
  • GetOrAddStage(string name, StageTypeDescriptor descriptor, int position) - добавить этап к маршруту с именем name, типом, описываемым через descriptor, и положением position. По умолчанию position - в конец.

    Особенности метода:

    • Если этап не был добавлен скриптом при предыдущих пересчетах, он будет создан с новым RowID.

    • Если этап был добавлен ранее, то RowID будет перенесен, но все значения изменены на стандартные.

    • Если этап был добавлен ранее и изменен пользователем, то возвращается этот этап.

    • Можно использовать только в скрипте построения шаблона этапов.

      Пример
          var stage = GetOrAddStage("ПримерЭтапа", StageTypeDescriptor.ApprovalDescriptor, 1);
      
          // Даже если этап установлен пользователем,
          // его положение относительно других этапов из шаблона будет 1
      
          if(!stage.RowChanged){
              stage.Comment = "Новый комментарий";
          } else {
              AddWarning("Этап изменен вручную");
          }
  • RemoveStage(string name) - удалить этап, добавленный через скрипт (доступно только в скрипте шаблоне этапов).

  • SetSinglePerformer(Guid id, string name, Stage intoStage, bool ignoreManualChanges = false) - установить исполнителя в этапе. Применимо только для типов этапов с одиночными исполнителями (доступно только в скрипте шаблоне этапов).

  • SetSinglePerformer(string id, string name, Stage intoStage, bool ignoreManualChanges = false) - перегрузка для SetSinglePerformer.

  • AddPerformer(Guid id, string name, Stage intoStage, int pos = int.MaxValue, bool ignoreManualChanges = false) - добавить исполнителя в этап intoStage на место position. По умолчанию в конец. Возвращает null, если этап изменен. Применимо только для типов этапов с множественными исполнителями (доступно только в скрипте шаблоне этапов).

    Пример
        var stage = AddStage("ПримерЭтапа", StageTypeDescriptors.ApprovalDescriptor);
    
        if(stage != null) {
            var approver = AddPerformer(perfID, perfName, stage);
        }
  • AddPerformer(string id, string name, Stage intoStage, int pos = int.MaxValue, bool ignoreManualChanges = false) - перегрузка для AddPerformer.

  • void ForEachStage(Action<CardRow> rowAction) - выполнить определенное действие над каждой строкой этапа в процессном сателлите.

    Пример
        ForEachStage(row => {
            ...
        });
  • void ForEachStageInMainProcess(Action<CardRow> rowAction) - выполнить определенное действие над каждой строкой этапа в контекстуальном сателлите.

    Пример
        ForEachStageInMainProcess(row => {
            ...
        });
  • SetStageState(CardRow stage, KrStageState stageStates) - сменить состояние этапа, заданного строкой секции карточки, а не объектной моделью. Полезно, когда нужно изменить состояние этапа из другого процесса.

    Пример
        ForEachStageInMainProcess(row => {
            SetStageState(row, KrStageState.Inactive);
        });
  • Методы для вывода пользовательской информации в ValidationResult.

    • AddError(string text)

    • AddWarning(string text)

    • AddInfo(string text)

  • Методы для вывода отладочной информации в ValidationResult. При передаче одиночных объектов подробная информация выводится сразу, при передаче перечисления IEnumerable<T> подробная информация выводится в деталях ValidationResult.

    • Show(object obj)

    • Show(string message, string details)

    • Show(Stage stage)

    • Show(IEnumerable<Stage> stages)

    • Show(Performer approver)

    • Show(IEnumerable<Performer> approvers)

  • AddTaskHistoryRecord( Guid typeID, string typeName, string typeCaption, Guid optionID, string result = null, Guid? performerID = null, string performerName = null, int? cycle = null, Action<CardTaskHistoryItem> modifyAction = null) - добавление записи в историю заданий.

Подробнее об объектах для маршрута

Тип GroupPosition

Тип данных GroupPosition хранит информацию о значении поля "положение относительно этапов, добавленных вручную". В типе определено два свойства - ID и Name. Создавать новые объекты типа нельзя. Существует три предопределенных объекта:

  • Unspecified = ID = null, Name = null

  • AtFirst = ID = 0, Name = "AtFirst"

  • AtLast = ID = 1, Name = "AtLast"

Тип WorkflowProcess

Класс содержит в себе полную информацию о текущем маршруте. Определение класса и полная информация о нем содержится в файле типового решения Source/Extensions/Tessa.Extensions.Default.Server/Workflow/ObjectModel/WorkflowProcess.cs

  • AuthorID - идентификатор инициатора процесса.

  • AuthorName - имя инициатора процесса.

  • AuthorComment - комментарий к циклу согласования.

  • State - состояние документа. Представлено классом Tessa.Extensions.Default.Shared.Workflow.KrProcess.KrState, все стандартные состояния указаны в классе статическими полями. При добавлении новых в перечисление KrDocState с помощью редактора схемы для удобной работы в исходном коде с состоянием рекомендуется вынести новые состояния в отдельный статический класс в Shared-расширениях.

    Пример:
        public static class CustomDocStates
        {
            // Строка со значением ID = 1000 Name = "CustomState" добавлена в перечисление KrDocState
            // Использовать идентификаторы ниже 1000 крайне не рекомендуется во избежание конфликта с состояниями типового решения
            public static readonly KrState CustomState = new KrState(1000);
        }
    Теперь для изменения состояния карточки в скрипте достаточно:
        #using Tessa.Extensions.Shared.CustomHelpers
        WorkflowProcess.State = CustomDocStates.CustomState;
  • Stages - список этапов в маршруте. Более подробная информация об объекте этапа.

  • Info - состояние процесса. Персистентное хранилище ключ-значение, позволяющее хранить произвольные данные, полезные при выполнении процесса и любых скриптов в рамках процесса. Алиасом поля в объекте этапа является свойство ProcessInfo в контексте скрипта. .Часто состояние процесса удобно использовать как общий буфер между этапами или даже группами. В Info можно записывать результат завершения какого-либо этапа, чтобы потом использовать этот результат в условии следующей группы

    Например:
        // Постскрипт этапа
        ProcessInfo.StageResult = "Успешно";
    
        // ...
        // Условие группы
        ProcessInfo.StageResult == "Успешно" && ...

Тип Stage

Здесь перечислены основные свойства модели этапа. Определение класса и полная информация о нем содержится в файле типового решения Source/Extensions/Tessa.Extensions.Default.Server/Workflow/ObjectModel/Stage.cs

  • ID - идентификатор этапа. Для шаблонных этапов это RowID этапа в шаблоне, а для этапов, добавленных вручную в карточке документа, это RowID строки в документе. Таким образом, при пересчетах и подстановках идентификатор строки будет сохраняться, что позволит использовать один и тот же идентификатор в скриптах.

  • StageTypeID - идентификатор типа этапа. Каждый тип этапа описывается дескриптором, все дескрипторы стандартных типов этапов располагаются в Tessa.Extensions.Default.Shared.Workflow.KrProcess.StageTypeDescriptors.

    Пример
        Stage.StageTypeID == StageTypeDescriptors.ApprovalDescriptor.ID
  • TemplateID - ID карточки шаблона этапа KrStageTemplate.

  • StageGroupID - ID карточки группы этапов KrStageGroup, к которой принадлежит текущий этап.

  • Name - название этапа.

  • TimeLimit - срок выполнения этапа, указываемый в UI. Настройка доступна только для тех типов этапов, в дескрипторе которых UseTimeLimit выставлено в true

  • Performer - одиночный исполнитель этапа. Используется для тех типов этапов, в дескрипторе которых PerformerUsageMode выставлен в PerformerUsageMode.Single. Более подробная информация об объекте исполнителя.

  • Performers - список исполнителей этапа. Используется для тех типов этапов, в дескрипторе которых PerformerUsageMode выставлен в PerformerUsageMode.Multiple. Более подробная информация об объекте исполнителя.

  • Settings - настройки этапа, задаваемые через UI настройки. Набор настроек определяется структурой секций карточки настроек, связанной с типом этапа.

    Пример работы с настройками в Settings:
        // Название строковых полей формируется по шаблону "ИмяСекции__ИмяПоля"
        var comment = Stage.KrApprovalSettingsVirtual__Comment;
        comment = comment.Replace("пожалуйста", "немедленно");
        Stage.KrApprovalSettingsVirtual__Comment = comment;
    
        // Название строковых секций образуется с использованием суффикса __Synthetic
        var firstRow = Stage.KrUniversalTaskOptionsSettingsVirtual__Synthetic[0];
  • Info - состояние этапа. Персистентное хранилище ключ-значение, позволяющее хранить произвольные данные, полезные при выполнении этапа и его скриптов. Алиасом поля в объекте этапа является свойство StageInfo в контексте скрипта.

    Для примера, будем хранить в Info количество выполнений этапа. В скрипте инициализации запишем:
        if (StageInfo.ExecutionCount == null) {
            StageInfo.ExecutionCount = 0;
        }
        StageInfo.ExecutionCount = StageInfo.ExecutionCount + 1;

    Затем, в постскрипте выведем это количество:

        if (StageInfo.ExecutionCount != null) {
            Show(StageInfo.ExecutionCount.ToString());
        }
  • OrderChanged - признак того, что порядок менялся пользователем. Не зависит от изменения порядка в коде.

  • RowChanged - признак того, что этап менялся пользователем. Не зависит от изменений в коде.

Тип Performer

  • RowID (тип Guid, readonly) - RowID согласующего в таблице согласующих KrApprovers. Если согласующий попал в маршрут из шаблона, то RowID это ID для шаблонного согласующего. Если согласующий создан вручную, то RowID - это RowID для маршрута карточки.

  • ID - ID роли согласующего.

  • Name - имя роли согласующего.

  • IsSql - признак того, что исполнитель подставлен через SQL запрос. Актуально только для множественных исполнителей.

9.10. Типы этапов

В этом разделе описаны все доступные "из коробки" типы этапов маршрута. Так как подсистема маршрутов расширяемая, то в вашей конфигурации могут быть добавлены новые типы этапов.

9.10.1. Согласование

Этап согласования предназначен для отправки одного или нескольких заданий согласования.

routes23

Название этапа – название текущего этапа согласования.

Срок (рабочие дни) - срок для заданий согласования в рабочих днях. Срок можно задать и дробный, например "0,5" - половина рабочего дня (4 часа).

Исполнители – согласующие текущего этапа. Можно указать как конкретных сотрудников, так и роли.

Для каждого согласующего можно указать дополнительных согласующих, которым будет отправлено задание на дополнительное согласование. Для указания дополнительных согласующих необходимо нажать левой кнопкой мыши на имя нужного сотрудника или роль, появится дополнительное поле для ввода:

routes24
  • Исполнители для выбранного согласующего - список сотрудников или ролей, кому будет отправлено задание дополнительного согласования. Данные задания отправляются одновременно с родительским заданием согласования. Решения дополнительных согласующих заносятся в историю заданий и лист согласования, однако не влияют на итоговый результат процесса согласования.

  • Первый исполнитель - ответственный - в случае, если флаг выставлен, то первый из указанных в списке Исполнителей будет считаться ответственным.

Данный флаг имеет смысл, если для данного документа настроено автоматическое завершение просроченных заданий согласования: в качестве итогового решения по заданию автоматически будет принято решение ответственного дополнительного согласующего.

Обратите внимание, что согласующий, для которого указаны дополнительные согласующие, отмечается в списке специальными символами (+) перед названием роли.

Комментарий - комментарий к текущему этапу согласования.

Вкладка "Основные настройки":

Параллельный этап – флаг выставляется в случае, если текущий этап согласования должен проходить параллельно (актуально, если в поле Исполнители указано более одного согласующего). Вернуть при несогласовании – вернуть договор на доработку Инициатору при не согласовании хотя бы одним из согласующих.

Вкладка "Дополнительно":

routes25

Вернуть при согласовании – вернуть договор на доработку Инициатору при согласовании всеми текущими согласующими.

Отключить автоматическое согласование - отключить для данного этапа автоматическое завершение задания согласования (см. Автоматическое согласование).

  • Настройки прав доступа для согласующих этапа

    • Редактировать карточку – дать права доступа на редактирование карточки договора согласующим этапа;

    • Редактировать любые файлы – дать права доступа на редактирование приложенных файлов для согласующих этапа.

Следующие две настройки управляют логикой работы этапа в подсистеме маршрутов.

Изменять состояние при старте - если флажок установлен (по умолчанию), то при запуске этапа состояние карточки устанавливается в "На согласовании". Снимите флажок, если вам не нужно такое поведение.

Изменять состояние при завершении - если флажок установлен, то при успешном выходе из этапа (все согласующие согласовали) состояние карточки устанавливается в "Согласовано". При несогласовании в последовательном режиме - этап устанавливает состояние карточки "Не согласовано" сразу же а в параллельном режиме выполнение - когда все согласующие завершили свои задания. Снимите флажок, если вам не нужно такое состояние.

Этап согласования в маршруте ведет себя следующим образом. Если все согласующие согласовали документ, то этап завершается и управление передаётся следующему этапу по маршруту. Если хотя бы один согласующий не согласовал, то этап завершается и выполняется переход на начало текущей группы. Предполагается, что там находится этап "Доработка", который отправит задание инициатору на доработку документа.

Этап согласования завершается, когда завершится последнее задание этапа.

9.10.2. Подписание

Этап подписания полностью аналогичен согласованию, за исключением:

  • В заданиях кнопки называются "Подписать" и "Отказать" вместо "Согласовать" и "Не согласовать";

  • Состояние карточки при входе в этап устанавливается "На подписании";

9.10.3. Доработка

Этап, обеспечивающий доработку документа после несогласования. Отправляет задание на доработку указанному исполнителю. По завершению задания передает управление следующему этапу в маршруте.

routes26

Срок (рабочие дни) - срок задания в рабочих днях, допускаются дробные значения.

Исполнитель - исполнитель задания. Обычно это роль "Инициатор согласования", но можно указывать любую роль в системе.

Комментарий - комментарий к этапу.

Изменять состояние - если флажок установлен (по умолчанию), то при входе в этап состояние карточки меняется на "На доработке". Снимите флажок, если вам не нужно такое поведение.

Увеличить цикл - если флажок установлен (по умолчанию), то при входе в этап текущий цикл согласования увеличится на 1. Текущий цикл доступен контекста из любого сценария: Cycle. Снимите флажок, если вам это не нужно.

Не пропускать этап - по умолчанию этап доработки пропускает себя (т.е. передает управление дальше, не выполняя никаких действий), если управление на него приходит не из текущей группы. Это нужно, чтобы пропустить этап при запуске процесса. При этом, предполагается, что возврат из текущей группы - это возврат при несогласовании, поэтому в этом случае этап выполняется и отправляет задание на доработку. Установите флажок, если хотите управлять пропуском этапа самостоятельно из сценариев.

9.10.4. Задача

Этап позволяет отправить задачу типового процесса обработки задач. Выполнение маршрута будет продолжено, когда завершатся все задания верхнего уровня.

Подробно возможности задач подробно описаны в соответствующем разделе руководства пользователя.
routes27

Исполнители - любые роли в системе, можно указывать несколько. Если не установлен флажок "Отдельная задача каждому исполнителю", то система объединит всех исполнителей в одну роль, на которую отправит задание. Исполнять его будет тот, кто первым возьмет задание в работу.

Отдельная задача каждому исполнителю - если флажок установлен, то каждый исполнитель получает отдельную задачу.

Первый исполнитель - ответственный - если флажок установлен, то первый исполнитель получит обычную задачу, а остальные - дочерние задачи.

Длительность (рабочие дни) - срок задания в рабочих днях. Допускаются дробные значения.

Дата выполнения - астрономическая дата выполнения задания. Можно указать либо это поле, либо длительность.

Вернуть после завершения - если флажок установлен, то после завершения исполнителем задача будет отправлена автору. Он сможет проверить результаты выполнения и при необходимости вернуть ее исполнителю или отправить другому сотруднику или сотрудникам. Если флажок установлен, то станет доступно поле "Вернуть на роль", позволяющее вернуть задачу не автору, а любой другой роли.

Комментарий - текст задания.

Вид - вид задания.

От имени - позволяет отправить задание от имени любого сотрудника. В отличие от отправки задачи по тайлу "Создать задачу", здесь можно выбрать абсолютно любого сотрудника, т.к. маршруты настраиваются администратором.

9.10.5. Настраиваемое задание

Этап "Настраиваемое задание" позволяет отправить одному или нескольким исполнителям задание с заданными в настройках этапа вариантами завершения и обработать результат. Этап асинхронный и для завершения ждет завершения всех заданий исполнителей. После завершения задания этап завершается и передает управление далее по маршруту.

routes28

Вот так выглядит взятое в работу настраиваемое задание.

routes30

Срок (рабочие дни) - срок задания в рабочих днях. Допускаются дробные значения.

Исполнители - исполнители задания. Можно указывать любые роли.

Автор - сотрудник, который будет автором отправленных заданий. Можно указать конкретного сотрудника или контекстную роль. В случае с контекстной ролью система ее вычислит и автором будет первый сотрудник из входящих в контекстную роль.

Текст задания - текст задания.

Варианты завершения - в этом разделе можно создать варианты завершения, которые будут доступны пользователю как кнопки завершения задания.

routes29

При добавлении варианта завершения система автоматически генерирует ему уникальный идентификатор. Пользователь может задать:

Вариант завершения - название варианта завершения (кнопки в задании). Можно использовать локализацию.

Показывать поле Комментарий - с вариантом завершения связано текстовое поле "Комментарий", которое может заполнить пользователь. Обязательность данного поля система не проверяет, ее можно гарантировать в сценарии пост-обработки.

	// если комментарий пустой, ругаемся
	if ( String.IsNullOrWhiteSpace ( (string)StageInfo.Tasks[0].Comment ) ) {
		AddError("Пожалуйста, укажите комментарий!");
	}
routes31

Дополнительный вариант завершения - если флажок установлен, то вариант завершения в задании будет доступен в выпадающем списке "Еще".

При завершении задания этап записывает в состояние этапа в коллекцию Tasks набор значений, описывающих все нюансы завершения задания. Коллекция Tasks это обычный массив значений. Каждый элемент его - вложенный хэш с информацией по каждому отдельному заданию.

//Обратиться к конкретному элементу массива можно по его индексу, например
StageInfo.Tasks[i].OptionName
//Получить количество элементов можно при помощи
StageInfo.Tasks.Count()
//Если задание одно, в массиве будет всегда один элемент. К его данным можно обращаться так
StageInfo.Tasks[0]...

Вот пример набора параметров, которые записывает система.

{
	"Tasks": [{
			"RowID": "976f5b71-4130-46fe-8826-90513014bb24",
			"RoleID": "2778f2a8-e77b-4c15-9f23-2c56d1946099",
			"RoleName": "Инициатор согласования",
			"RoleTypeID": "b672e00c-0241-0485-9b07-4764bc96c9d3",
			"AuthorID": "3db19fa0-228a-497f-873a-0250bf0a4ccb",
			"AuthorName": "Admin",
			"AuthorPosition": null,
			"Action": 3,
			"TypeID": "9c6d9824-41d7-41e6-99f1-e19ea9e576c5",
			"TypeName": "KrUniversalTask",
			"TypeCaption": "$CardTypes_TypesNames_KrUniversalTask",
			"UserID": "3db19fa0-228a-497f-873a-0250bf0a4ccb",
			"UserName": "Admin",
			"OptionID": "bc390ea9-530b-4467-b352-e6842db2e6c5",
			"OptionName": "Выполнено",
			"Result": null,
			"Planned": "2018-07-14T11:04:47",
			"PlannedQuants": 79,
			"InProgress": "2018-07-11T11:05:40",
			"Digest": "Пожалуйста, подтвердите, что ваша СЗ исполнена.  В этом случае нажмите \"Выполнено\". Если необходимо еще что-то сделать, пожалуйста, нажмите \"Не принято\" и введите ваш комментарий.",
			"ParentRowID": null,
			"HistoryItemParentRowID": null,
			"ProcessID": null,
			"ProcessName": null,
			"ProcessKind": null,
			"Postponed": null,
			"PostponedTo": null,
			"PostponeComment": null,
			"Comment": null,
			"CompletedByID": "3db19fa0-228a-497f-873a-0250bf0a4ccb",
			"CompletedByName": "Admin",
			"Completed": "2018-07-14T11:04:47.393Z"
		}, {
			"RowID": "1737a91c-f53f-4630-b3d7-ca8c87c461d2",
			"RoleID": "fe037e05-2c9e-4a51-8b01-15e11f1ae86a",
			"RoleName": "Департамент обеспечения",
			"RoleTypeID": "abe57cb7-e1cb-06f6-b7ca-ad1668bebd72",
			"AuthorID": "3db19fa0-228a-497f-873a-0250bf0a4ccb",
			"AuthorName": "Admin",
			"AuthorPosition": null,
			"Action": 3,
			"TypeID": "9c6d9824-41d7-41e6-99f1-e19ea9e576c5",
			"TypeName": "KrUniversalTask",
			"TypeCaption": "$CardTypes_TypesNames_KrUniversalTask",
			"UserID": "3db19fa0-228a-497f-873a-0250bf0a4ccb",
			"UserName": "Admin",
			"OptionID": "e4d4db89-4320-4fcb-aa1f-9d36e33ca614",
			"OptionName": "Не принято",
			"Result": "Пожалуйста, проверьте еще раз.",
			"Planned": "2018-07-14T11:04:47.393Z",
			"PlannedQuants::int": 79,
			"InProgress::dtm": "2018-07-11T11:07:56.963Z",
			"Digest": "Пожалуйста, подтвердите, что ваша СЗ исполнена.  В этом случае нажмите \"Выполнено\". Если необходимо еще что-то сделать, пожалуйста, нажмите \"Не принято\" и введите ваш комментарий.",
			"ParentRowID": null,
			"HistoryItemParentRowID": null,
			"ProcessID": null,
			"ProcessName": null,
			"ProcessKind": null,
			"Postponed": null,
			"PostponedTo": null,
			"PostponeComment": null,
			"Comment": "Пожалуйста, проверьте еще раз.",
			"CompletedByID": "3db19fa0-228a-497f-873a-0250bf0a4ccb",
			"CompletedByName": "Admin",
			"Completed": "2018-07-14T11:04:47.393Z"
		}
	]
}

Основные параметры:

  • Comment - комментарий при завершении;

  • OptionID - идентификатор варианта завершения, выбранного пользователем;

  • OptionName - название варианта завершения, выбранного пользователем;

  • CompletedByID - идентификатор сотрудника, завершившего задание;

  • CompletedByName - отображаемое имя сотрудника, завершившего задание;

  • RowID - идентификатор задания;

  • RoleID - идентификатор роли, на которую назначено задание;

  • RoleName - название роли, на которую назначено задание;

Как описано выше, обращаться к ним можно из сценария пост-обработки в синтаксисе StageInfo.Tasks[0].OptionName. Далее, в зависимости от выбранного пользователем варианта завершения можно записать какие-то параметры в ProcessInfo и в зависимости от них выстроить дальнейший маршрут, пропустить или повторить этапы.

9.10.6. Регистрация

Этап "Регистрация" позволяет отправить задание на регистрацию карточки. При регистрации карточке выделяется постоянный номер и изменяется состояние на "Зарегистрирована", согласно настройкам типового решения.

routes32

Регистрация выполняется после завершения задания.

Задание отправляется, только если этап регистрации используется в основном маршруте документа. При использовании во вторичном маршруте (например, выполняемом по тайлу) - этап сразу же выполняет регистрацию, не отправляя задание, и затем передает управление следующему этапу маршрута.

routes33

Срок (рабочие дни) - срок задания в рабочих днях. Можно использовать дробные значения.

Исполнитель - исполнитель задания. Любая роль в системе.

9.10.7. Отмена регистрации

Этап "Отмена регистрации" выполняет отмену регистрации документа, т.е. возвращает проектный номер и состояние "Проект". Окромя названия и сценариев, настроек не имеет.

Этап синхронный, при получении управления выполняет дерегистрацию и сразу передает управление дальше.

9.10.8. Ознакомление

Этап "Ознакомление" позволяет отправить карточку на ознакомление указанным сотрудникам. Они получат почтовое уведомление и доступ на чтение карточки. Также отправленные на ознакомление документы доступны пользователю в рабочем месте "Пользователь" в представлении "Мне на ознакомление". При открытии ими карточки система зафиксирует факт ознакомления в журнале ознакомления. Функциональность ознакомления полностью аналогична ознакомлению типового решения.

routes34

Исполнители - список ролей на которые будет отправлено ознакомление. Система объединит состав ролей, сформировав общий список сотрудников и затем каждому из них отравит на ознакомление документ.

Отправитель - сотрудник, от имени которого будет отправлено ознакомление. Можно указать сотрудника или контекстную роль. Если указана контекстная роль, система ее вычислит и возьмет первого сотрудника, входящего в эту роль.

Комментарий - комментарий к ознакомлению, обычный текст. При его формировании можно использовать функциональность плейсхолдеров, по аналогии с формированием отчетов. Подробно о плейсхолдерах и шаблонах файлов вы можете прочитать в соответствующем разделе руководства администратора.

Алиасы плейсхолдеров - если в формировании текста комментария используются плейсхолдеры, здесь можно указать для них сокращенные алиасы и использовать их для формирования текста комментария, так же, как и в отчетах.

Уведомление - выбор карточки уведомления, которая будет использована для отправки письма с уведомлением пользователя. Система сформирует письмо согласно шаблону в карточке уведомления и разошлет пользователям.

В тексте выбранной карточки уведомления можно использовать некоторые дополнительные псевдо-плейсхолдеры:

  • {{sender}} - заменяется на имя отправителя;

  • {{comment}} - заменяется на сформированный комментарий;

  • <comment_block>…​</comment_block> - блок с комментарием. Удаляется в случае, когда {{comment}} пустой. Например, можно написать как показано в примере, и в случае пустого комментария весь текст "Инициатор отправил…​" будет удален из почтового уведомления.

    Пожалуйста, внимательно прочтите документ.
    <comment_block>Инициатор отправил следующий комментарий: {{comment}}</comment_block>

Не отправлять заместителям - если флажок установлен, то из состава ролей будут исключены сотрудники, входящие туда как заместители.

Этап выполняется синхронно, после запуска сразу отправляет уведомления и передает управление следующему этапу в маршруте.

9.10.9. Уведомление

Этап "Уведомление" позволяет сформировать и отправить уведомление сотрудникам по электронной почте (email). При формировании уведомления используется карточка уведомления, на которую ссылается этап. Подробнее про уведомления в разделе руководства администратора.

routes35

Исполнители - список ролей, на которые будет отправлено уведомление. Система объединит состав ролей, сформировав общий список сотрудников, исключит тех, у кого не указана почта в справочнике и затем каждому из них отравит сформированное уведомление.

Уведомление - выбор карточки уведомления, которая будет использована для отправки письма с уведомлением пользователя. Система сформирует письмо согласно шаблону в карточке уведомления.

Не отправлять заместителям - если флажок установлен, то из состава ролей будут исключены сотрудники, входящие туда как заместители.

Этап выполняется синхронно, после запуска сразу формирует исходящие письма и передает управление следующему этапу в маршруте.

9.10.10. Создание карточки

Этап "Создание карточки" позволяет создать карточку по шаблону из маршрута. По созданной карточке можно сразу же запустить маршрут и\или открыть ее в рабочем месте пользователя.

routes36

Шаблон - ссылка на шаблон, по которой будет создана карточка. Обратите внимание, что в большинстве режимов создания (см. поле "Режим") пользователю не требуется доступ на этот шаблон.

Режим - режим создания карточки:

  • Открыть новую карточку - карточка будет создана и открыта (но не сохранена!) непосредственно в клиентском рабочем месте пользователя, как если бы он ее сам создал по шаблону. В этом режиме пользователю требуется доступ на указанный шаблон. Открытая карточка будет новой, не сохраненной - пользователю нужно будет самостоятельно сохранить карточку. До момента сохранения информации об этой карточке в базе данных нет.

  • Сохранить и открыть карточку - карточка будет создана и сохранена на сервере, а затем уже открыта в рабочем месте пользователя. Пользователю в этом режиме не нужен доступ на шаблон, по которому создается карточка. Но при этом ему нужен доступ на чтение созданной карточки. Если такого доступа нет, то карточка создастся, но не откроется у пользователя на клиенте. При этом карточка останется существовать в системе.

  • Запустить процесс - карточка будет создана и сохранена на сервере, а потом по ней будет сформирован маршрут и запущен процесс по маршруту. Процесс при этом сразу же выполнится до первого асинхронного этапа, например, отправки задания.

  • Запустить процесс и открыть карточку - аналогичен "Запустить процесс", но карточка будет открыта в рабочем месте пользователя после запуска процесса. Пользователю при этом нужны права на чтение карточки, иначе она не откроется, но продолжит существовать в системе.

После создания карточки этап записывает идентификатор созданной карточки в состояние этапа.

{
	"cardID": "e4d4db89-4320-4fcb-aa1f-9d36e33ca614"
}

Сценарий пост-обработки может получить этот идентификатор ( (Guid)StageInfo.cardID )и что-нибудь сделать с этим знанием, например:

  • Изменить созданную карточку, выполнив запрос к БД. К моменту выполнения сценария данные карточки уже записаны в базу данных, но транзакция еще открыта.

  • Изменить созданную карточку, выполнив следующий этап маршрута в ее контексте. Для этого нужно добавить в маршрут сразу после этапа создания карточки этап сценария. Затем в сценарии постобработки этапа создания карточки выполнить RunNextStageInContext( (Guid)StageInfo.cardID ); (см. пример с созданием уже зарегистрированной карточки). Следующие этапы маршрута выполнятся в контексте вновь созданной карточки и в тексте сценария можно будет просто написать, например, Card.DocumentCommonInfo.Amount = 10 для изменения суммы договора.

В режиме "Открыть новую карточку" можно модифицировать карточку перед открытием следующим образом:

    var card = GetNewCard();
    card.Sections["DocumentCommonInfo"].Fields["Subject"] = "Новая тема документа";
    // Или
    NewCard.DocumentCommonInfo.Subject = "Новая тема документа";
Обратите внимание, card - пустой пакет карточки, предназначенный только для записи новых значений.

9.10.11. Смена состояния

Этап "Смена состояния" позволяет изменить состояние текущей карточки. Этап синхронный и передает управление дальше сразу после изменения состояния.

routes37

Состояние - выбор из справочника состояний. Вы можете добавить свое собственное состояние в таблицу KrDocState при помощи библиотек схемы.

9.10.12. Пересчет маршрута

Этап "Пересчет маршрута" - выполняет пересчет состава текущей группы маршрута и обновляет ту его часть, которая будет выполняться после этапа "Пересчет маршрута". При этом, если были изменения состава этапов ДО того места, где находится этап "Пересчет маршрута", то система трактует это как ошибки и никаких изменений в итоговом маршруте карточки производиться не будет. Пересчет группы выполняется по обычным правилам пересчета маршрута с выполнением сценариев дизайн-тайма, за исключением того, что система пересчитывает только текущую группу.

routes38

Этап не имеет настроек.

9.10.13. Сценарий

Этап "Сценарий" позволяет выполнить какие-то действия в сценариях инициализации или постобработки и только лишь.

routes39

Этап не имеет настроек.

9.10.14. Управление процессом

Этап "Управление процессом" позволяет управлять маршрутом, выполняя различные переходы, отзыв, запуск процесса и так далее.

routes40

В поле Режим можно задать различные режимы работы этапа. Если установлен флажок Выполнять в основном процессе, то этап будет управлять основным процессом карточки, а не текущим. Этот флажок позволяет, например, по нажатию тайла, выполнить отзыв основного процесса. Маршрут, связанный с тайлом, будет вторичным отдельным маршрутом. Если флажок Выполнять в основном процессе не установлен, то этап будет пытаться управлять текущим вторичным процессом.

Режимы работы:

Отправить сигнал - это специальный режим, позволяющий отправить некоторые заранее заданные специальные команды процессу. Этот режим может использоваться только с установленным флажком "Выполнять в основном процессе". Такими командами могут быть:

  • KrStartProcessSignal - формирует маршрут и запускает процесс по документу. Если процесс уже запущен, выдает ошибку.

  • KrStartProcessUnlessStartedGlobalSignal - формирует маршрут и запускает процесс по документу. Если процесс уже запущен, просто ничего не делает.

Отменить процесс - может выполняться в основном и вторичном процессе. Отзывает текущий активный этап маршрута в основном процессе. Все этапы маршрута, включая отозванный, переходят в состояние "Не запущен". Процесс маршрута завершается и должен быть запущен заново.

Если происходит управление основным процессом из вторичного (например, мы отзываем основной процесс по нажатию тайла), в основном процессе может быть текущий активный этап, который отправил задания пользователю. В этом случае система всегда отзывает этот этап, который в свою очередь - обычно отзывает отправленные пользователям задания. Отозваны могут быть любые этапы, входящие в поставку платформы. При этом отзыв заданий выполняет собственно, сам этап, когда подсистема маршрутов запрашивает отзыв. Кастомные этапы подсистемы маршрутов могут вести себя по другому - так, как написано в соответствующем этапе.

Пропустить процесс - может выполняться в основном и вторичном процессе. Отзывает текущий активный этап маршрута в основном процессе. Отозванный этап и все этапы после него переходят в состояние "Пропущен". Процесс маршрута завершается и должен быть запущен заново.

Переход на этап - выполняет переход на конкретный этап маршрута.

routes41

В поле Строка с этапом нужно выбрать конкретный этап. Этап должен присутствовать в рассчитанной части маршрута, переход может выполняться вперед или назад.

Если переход выполняется вперед, то все пропущенные этапы переходят в состояние "Пропущен". Если переход выполняется назад, то все пропущенные этапы переходят в состояние "Не запущен". Если указанного этапа нет, то этап управления процессом не выполняет никаких действий.

При переходе в другую группу маршрута - выполняется пересчет этой группы по общим правилам с выполнением сценариев группы "При расчете маршрута".

Переход на группу - выполняет переход на конкретную группу маршрута. Группа должна присутствовать в рассчитанном маршруте в момент перехода.

routes42

В поле Группа этапов нужно выбрать группу, на которую выполняется переход.

При переходе выполняется пересчет этой группы по общим правилам с выполнением сценариев группы "При расчете маршрута". Далее начинается выполнение этапов этой группы.

Если переход выполняется вперед, то все пропущенные этапы переходят в состояние "Пропущен". Если переход выполняется назад, то все пропущенные этапы переходят в состояние "Не запущен". Если указанной группы нет, то этап управления процессом не выполняет никаких действий.

Переход на следующую группу - выполняет переход на следующую группу в маршруте.

При переходе выполняется пересчет этой группы по общим правилам с выполнением сценариев группы "При расчете маршрута". Далее начинается выполнение этапов этой группы. Если группы нет (маршрут заканчивается), то завершается процесс маршрута.

Если переход выполняется вперед, то все пропущенные этапы переходят в состояние "Пропущен". Если переход выполняется назад, то все пропущенные этапы переходят в состояние "Не запущен".

Переход на предыдущую группу - выполняет переход на предыдущую группу в маршруте.

При переходе выполняется пересчет этой группы по общим правилам с выполнением сценариев группы "При расчете маршрута". Далее начинается выполнение этапов этой группы. Если предыдущей группы нет (текущая группа первая в маршруте), то этап не выполняет никаких действий.

Если переход выполняется вперед, то все пропущенные этапы переходят в состояние "Пропущен". Если переход выполняется назад, то все пропущенные этапы переходят в состояние "Не запущен".

Переход в начало текущей группы - выполняет переход на начало текущей группы.

При переходе выполняется пересчет этой группы по общим правилам с выполнением сценариев группы "При расчете маршрута". Далее начинается выполнение этапов этой группы.

9.10.15. Ветвление

Этап ветвления предназначен для параллельного запуска нескольких вторичных процессов. При этом вторичные процессы запускаются как отдельные процессы со своим контекстом и ProcessInfo. Тем не менее все вторичные процессы, запущенные через ветвление (далее вложенные), сохраняются в сателлите родительского процесса (далее основной, не путать с первичным процессом).

routes48

Вторичные процессы указываются в списке "Вторичные процессы", при этом возможно указывать один вторичный процесс несколько раз. После запуска этапа "Ветвление" все указанные вторичные процессы будут расчитаны и запущены.

routes49
Обратите внимание, что внутри этапа "Ветвление" также может запускаться вложенное "Ветвление".
routes50

В сценарии "инициализация" этапа "Ветвление" можно модифицировать "ProcessInfo" для каждого из запускаемых процессов. Это может быть полезно, например, для передачи параметров в запускаемый процесс.

Пример
    IDictionary<string, object> nestInfo = Stage.InfoStorage
        .TryGet<Dictionary<string, object>>(KrConstants.Keys.ForkNestedProcessInfo)
        .TryGet<Dictionary<string, object>>(RowID строки в коллекции вторичные процессы);

    nestInfo["key"] = "value";

    // Далее в скриптах запускаемого вложенного процесса в ProcessInfo.key будет располагаться значение "value".
Будте внимательны, "RowID строки в коллекции вторичные процессы" - это идентификатор строки в секции KrForkSecondaryProcessesSettingsVirtual_Synthetic, а не идентификатор карточки вторичного процесса.

После завершения каждой из веток вызывается сценарий "После завершения ветки". В данном сценарии можно обработать ProcessInfo завершаемого процесса, а также прервать оставшиеся ветки ветвления

    // Завершить выполнение ветвления и перейти к следующему этапу
    NestedProcessInfo.SkipForkAndContinueRoute = true;
    // Оставить ли активными остальные этапы. Используется только с флагом выше
    NestedProcessInfo.KeepBranchesAlive = true;
    // Вывод ProcessInfo завершаемого процесса
    Show(NestedProcessInfo.ProcessInfo);
    // Вывод ProcessInfo текущего процесса.
    Show(ProcessInfoStorage);

Все вложенные процессы могут иметь доступ к родительскому ProcessInfo с помощью MainProcessInfo. Таким образом можно реализовать взаимодействие между вложенными процессами и этапами ветвления.

В постобработке этапа можно получить информацию обо всех ветках следующим образом:

    // в nestInfo обновленные ProcessInfo после завершения процесса.
    // После выполнения постобработки коллекция будет очищена.
    IDictionary<string, object> nestInfo = Stage.InfoStorage
        .TryGet<Dictionary<string, object>>(KrConstants.Keys.ForkNestedProcessInfo)
        .TryGet<Dictionary<string, object>>(RowID строки в коллекции вторичные процессы);

    // ...

    // Техническая информация об ветках доступна в BranchInfo
    var branchInfos = new ListStorage<BranchInfo>((List<object>)context.Stage.InfoStorage[PendingProcesses], BranchInfoFactory);
    var binfo = branchInfos[0];
    // binfo.RowID - идентификатор RowID в коллекции вторичных этапов в настройках.
    // binfo.ProcessID - идентификатор вложенного процесса в рамках WorkflowAPI.
    // binfo.SecondaryProcessID - идентификатор картчоки вторичного процесса.
    // binfo.Completed - признак того, что ветка завершена
Обратите внимание, при прерывании ветки ее ProcessInfo не попадает в этап "Ветвление".

9.10.16. Управление ветвлением

Этап управления ветвлением необходим для динамического воздействия на активный этап ветвления. Активный этап ветвления - этап с типом "Ветвление" и в состоянии "Активен". С помощью упрвления ветвлением можно воздействовать только на "Ветвление", которое запустило текущий процесс (в котором находится этап управления ветвлением) или на этап "Ветвление" в первичном процессе.

routes51

Этап поддерживает два режима:

Добавить ветку - добавить одну или несколько веток к уже активному этапу ветвления. При необходимости, можно указать ProcessInfo также, как и в этапе "Ветвление".

Завершение ветки - завершить одну или несколько веток. Если в этапе ветвления есть несколько вложенных процессов по одному и тому же вторичному процессу, тогда будут пропущены все эти процессы.

Выполнять в основном процессе - флажок, который необходимо использовать в том случае, если целевой этап "Ветвление" находится в первичном процессе. Если флажок снят, этап влияет на родительское ветвление. Если флажок установлен, тогда этап управления процессом должен находится в вторичном процессе, который запускается вне первичного. Это может быть нажатие кнопку процесса, событие или запуск в коде расширений с помощью IKrProcessLauncher (кроме запуска из сценариев). Если же флаг не выставлен, тогда этап управления должен находится в вложенном процессе.

Если из нескольких вложенных процессов по одному и тому же вторичному процессу необходимо отозвать только некоторые, тогда нужно указать идентификаторы вложенного процесса. Эти идентификаторы хранятся в сателлитах процессов. Пример получения одной ветки согласования из первичного процесса:

// Получение строк этапов для первичного процесса
var rows = ContextualSatellite.Sections[KrConstants.KrStages.Name].Rows;
// Нахождение строки этапа вложенного процесса
var nestedProcessRow = rows.First(
	p => p["NestedProcessID"] != null
	&& (Guid)p[StageTypeID"] == StageTypeDescriptors.ApprovalDescriptor.ID);
// Идентификатор вложенного процесса
var nestedProcessID = (Guid)nestedProcessRow["NestedProcessID"";

// Настройки текущего этапа управления процессом
var section = Stage
	.SettingsStorage
	.TryGet<List<object>>(KrConstants.KrForkNestedProcessesSettingsVirtual.Synthetic);

// Дополняем настройки идентификатором вложенного процесса
// Данные настройки являются скрытыми, из интерфейса недоступны
var dict = new Dictionary<string, object>();
dict["RowID"] = Guid.NewGuid();
dict["ID"] = CardID;
dict["Order"] = 0;
dict["NestedProcessID"] = nestedProcessID;
section.Add(dict);

При необходимости явно выставлять "Не запущен" вместо "Пропущен" для отменяемой ветки, можно воспользоваться следующим сценарием в инициализации этапа:

Stage.Settings.KrForkManagementSettingsVirtual__DirectionAfterInterrupt = (int)DirectionAfterInterrupt.Backward;

9.10.17. Типизированное задание

Этап типизированного задания позволяет отправлять исполнителям задание указанного в настройках этапа типа.

routes52

Задания рассылаются параллельно всем исполнителям. Опционально можно указать дайжест для задания.

После завершения каждого задания в этапе вызывается сценарий "После завершения задания". В нем доступен стандартный контекст сценария этапа, а также дополнительные свойства и методы:

  • TypedTaskContext.Task- пакет завершаемого задания. Вариант завершения находится в Task.OptionID;

  • TypedTaskContext.CompleteStage- флаг, используемый для указания обработчику этапа на необходимость завершения этапа. Если выставить в true, то этап будет завершен, активные задания отозваны и управление перейдет к следующему этапу;

  • TypedTaskContext.SendTask(Performer исполнитель, Guid? тип задания, DateTime? дата завершения, int? срок в рабочих днях, string дайжест задания) - функция для отправки задания в рамках этапа. Обязательным этапом является только исполнитель, остальные значения берутся из настроек этапа, если не указано иное;

  • TypedTaskContext.RevokeTasks(Guid taskID или IEnumerable<Guid> taskIDs) - отозвать задания в текущем процессе по указанным идентификаторам.

Пример сценария для этапа, отправляющего несколько заданий согласования, по варианту завершения "Запросить комментарий" отправляется новое задание комментирования, при согласовании отзывается отправленное комментирование, а при несогласовании завершается весь этап. Обратите внимание, код приведен как пример, полный набор всех возможных случаев и вариантов завершения он не покрывает.

// Получаем завершаемое задание
var task = TypedTaskContext.Task;
var optionID = task.OptionID;
// Если это запрос комментария
if (optionID == DefaultCompletionOptions.RequestComments) {
    // Получаем из задания информацию для запроса комментария
    var commentator = task.Card.Sections["KrCommentators"].Rows[0];
    var comment = task.Card.Sections["KrTask"].Fields["Comment"] as string;
    var performer = new Performer((Guid)commentator["CommentatorID"], (string)commentator["CommentatorName"]);

    // Отправляем новое задание на комментирование
	var newTask = TypedTaskContext.SendTask(performer, DefaultTaskTypes.KrRequestCommentTypeID);
    newTask.Card.Sections[KrConstants.KrRequestComment.Name].Fields[KrConstants.KrRequestComment.AuthorRoleID] = task.UserID;
    newTask.Card.Sections[KrConstants.KrRequestComment.Name].Fields[KrConstants.KrRequestComment.AuthorRoleName] = task.UserName;
    newTask.ParentRowID = task.RowID;
    // Запоминаем идентификатор этого задания
    Stage.Info.CommentID = newTask.RowID;
} else if (optionID == DefaultCompletionOptions.Approve || optionID == DefaultCompletionOptions.Disapprove) {
    // При завершении согласования отзываем комментирование
	var commentID = (Guid)Stage.Info.CommentID;
	TypedTaskContext.RevokeTask(commentID);
}
if (optionID == DefaultCompletionOptions.Disapprove) {
    // Завершаем весь этап
    TypedTaskContext.CompleteStage = true;
}

9.10.18. Создание файла по шаблону

Этап предназначен для создания файла по шаблону.

routes53

В ссылочном поле указывается шаблон файла, в поле "Имя" можно переопределить имя файла (в т.ч. с использованием плейсхолдеров).

Более подробная информация о шаблонах файлов находится в разделе Шаблоны файлов и плейсхолдеры

10. Потоковый ввод документов

Модуль потокового ввода документов предназначен для обработки результата сканирования потокового сканера (или любого другого источника электронных документов).

Модуль не входит в типовую поставку и приобретается отдельно.

Посмотреть информацию о доступных модулях, включённых в лицензию можно в приложении Tessa Admin, раздел "Информация":

image367

Данный модуль может выполнять:

  • Выделение карточке уникального штрих-кода и его печать

  • Распознавание отсканированного штрих-кода и прикрепление скана документа к карточке

Для работы модуля необходимо:

  • Включить плагин ContinuousDocumentLoadPlugin сервиса Chronos, выставив в соответствующем xml файле disabled="false". Все конфигурационные файлы плагинов сервиса Chronos хранятся в папке Chronos\Plugins\Tessa\configuration. Более подробно про плагины см. в разделе Настройка плагинов Chronos.

  • Включить потоковое сканирование в карточке настроек "Потоковый ввод документов". Подробное описание настроек см. ниже.

  • Проверить наличие файла Tessa.Chronos.DocumentsLoad.Windows.dll в папке Chronos\Plugins\Tessa.

Плагин работает только для сервиса Chronos, установленного на ОС Windows. Работа модуля при установке на сервер Linux не поддерживается, однако, возможно установить серверную часть модуля (плагин Chronos) на Windows отдельно от других модулей сервера приложений, которые могут функционировать на Linux.

В конфигурационном файле Chronos\app.json можно указать формат названия подпапок для обработанных документов. По умолчанию указан формат:

"DocLoad.OutputFolderFormat": "yyyy-MM-dd_HH-mm-ss"

Это означает, что при каждом запуске плагина будет создаваться новая подпапка, содержащая в названии дату и время с секундами, куда будут перемещены все обработанные за текущую итерацию плагина документы. Если, например, указать формат "yyyy-MM-dd", то все обработанные за текущий день документы при каждом запуске плагина будут перемещаться в одну и ту же папку.

Карточка настроек "Потоковый ввод документов" (правое меню в Tessa Client → Настройки → Потоковый ввод документов) содержит следующие настройки:

image368

Параметр

Описание

Потоковый ввод документов включен

Отвечает за включение/отключение модуля. Если этот флаг снят, то перестает отображаться кнопка печати штрих-кода в карточке документа, не работает плагин распознавания документов Chronos и выделение штрих-кода документу.

Путь к папке обработки документов

Путь к папке, в которой хранятся документы для распознания. Поддерживаются сетевые папки. Плагин получает для обработки только документы, расположенные в указанной папке, без учета подпапок.

Путь к папке для успешно обработанных документов

Путь к папке, в которой хранятся успешно обработанные документы. В данной папке создается подпапка определенного формата (настройка DocLoad.OutputFolderFormat, описана выше). Не является обязательным к заполнению. Если не заполнен, то документ удаляется, вместо переноса в папку назначения. Поддерживаются сетевые папки.

Путь к папке для обработанных документов с ошибками

Путь к папке, в котором хранятся документы, обработанные с ошибками. В данном каталоге создается подпапка определенного формата (настройка DocLoad.OutputFolderFormat, описана выше). Не является обязательным к заполнению. Если не заполнен, то документ удаляется, вместо переноса в папку назначения. Поддерживаются сетевые папки.

Название документа

Название документа, который прикрепляется к карточке. Поддерживаются плейсхолдеры и константы локализации.

Искать по всей странице (длительный поиск, выше точность)

Работает только для PDF документов. Использует алгоритм, принудительно генерирующий PDF формата А4, что увеличивает нагрузку на сервер. Рекомендуется использовать, если содержимое страниц не соответствует формату А4.

Исключить страницу со штрих-кодом

Исключает страницу с штрих-кодом из итогового документа.

Выделять из последовательности

Последовательность, из которой выделяется номер для штрих-кода.

Формат полного номера

Формат штрих-кода, выделяемого системой.

Секция

Секция карточки, в которой хранится штрих-код.

Поле

Поле карточки, в которой хранится штрих-код.

Тип штрих-кода для печати

Тип штрих-кода, используемый для печати штрих-кода.

Типы штрих-кодов для распознавания

Список типов штрих-кодов, используемые для распознавания в плагине Chronos.

Ширина штрих-кода

Ширина штрих-кода при печати.

Высота штрих-кода

Высота штрих-кода при печати.

Отображать штрих-код внизу страницы с зашифрованными данными

Добавляет текстовое представление штрих-кода внизу изображения.

Печатать заголовок с дополнительной информацией

Добавляет дайджест карточки в печатаемый документ. Изменяет поведение параметров, указанных ниже: если флаг стоит, то отсчет смещения производится от центра, иначе от левого верхнего угла.

Смещение штрих-кода по ширине

Добавляет смещение штрих-коду по ширине.

Смещение штрих-кода по высоте

Добавляет смещение штрих-коду по высоте.

Для отображения кнопки печати штрих-кода в левом меню карточки документа необходимо, чтобы указанные в настройках секция и поле существовали в данной карточке (поля/секции для карточки добавляются в TessaAdmin).

Для печати штрих-кода необходимо:

  • Открыть карточку документа, для которого необходимо напечатать штрих-код.

  • Заполнить поле штрих-кода или оставить его пустым для автоматического выделения номера.

  • Нажать на кнопку печати в левом меню системы или сочетание клавиш [Alt+P].

  • Выбрать принтер для печати.

После того, как принтер был хотя бы раз выбран до закрытия приложения, печать штрих-кода будет выполняться на этом принтере без выбора, сразу по нажатию на кнопку "Печать штрих-кода" [Alt+P].

Чтобы выполнить печать на другом принтере, нажмите на кнопку в левом меню "Печать штрих-кода → Выбрать принтер и напечатать", или нажмите сочетание клавиш [Shift+Alt+P]. После выбора другого принтера именно он будет использоваться по умолчанию по кнопке "Печать штрих-кода".

11. Настройки календаря

11.1. Общие понятия

Для отражения момента времени в календаре используется специальное понятие кванта времени. Существует два типа квантов времени - рабочий и не рабочий.

  • Рабочий квант - длится 15 минут. На такие кванты разбит весь рабочий день.

  • Нерабочий квант - длится всё время с момента конца предыдущего рабочего кванта и до момента начала следующего рабочего кванта.

Таким образом - настройка календаря сводится к настройке последовательностей рабочих и не рабочих квантов. Для удобства управления этим процессом существует специальная карточка настроек календаря.

11.2. Карточка настроек календаря

Карточка настроек календаря содержит в себе:

  • Таблица исключений.

  • Период действия календаря.

  • Интервалы рабочего дня и обеденного перерыва.

  • Кнопки, вызывающие пересчёт календаря и проверку целостности рассчитанного календаря.

image155

Календарь оперирует датами во временной зоне объекта, для которого выполняются расчёты. Например, для расчёта сроков по календарю некоторого сотрудника считается, что все даты записаны в часовом поясе этого сотрудника (см. Настройки временных зон).

11.2.1. Исключения

В этой табличке заносятся исключения из стандартных правил расчёта календаря. Сюда необходимо внести выходные, которые приходятся на стандартные рабочие дни (понедельник - пятница) и рабочие дни, которые приходятся на стандартные выходные (суббота - воскресенье).

Добавление исключения выглядит следующим образом:

image156

11.2.2. Период действия календаря

В этом блоке заполняется период, для которого рассчитывается календарь. Календарь будет рассчитан с 00:00:00 даты начала и по 23:59:59 даты конца.

11.2.3. Рабочий день и обеденный перерыв

В этих блоках указывается время начала/конца рабочего дня и время начала/конца обеденного перерыва.

11.2.4. Расчёт календаря и проверка ошибок

В нижней части карточки календаря находятся две кнопки:

  • Пересчитать календарь – вызывает перерасчёт календаря с учётом всех данных указанных в карточке.

  • Проверить целостность – вызывает проверку календаря на наличие ошибок.

При любых изменениях календаря – необходимо выполнять его перерасчёт. Изменения не вступят в силу до тех пор, пока не будет вызван перерасчёт.

12. Настройки временных зон

12.1. Общие понятия

Для организации возможности функционирования системы в разных часовых поясах существуют настройки временных зон. Предположим, что у нас есть исполнитель в Новосибирске (UTC+7) и отправим ему задание из Москвы. Т.е. разница с Москвой +4 часа - когда в Москве полдень, в Новосибирске 16:00.

  • Пусть в Москве у нас сейчас 12:00 10 января и мы отправляем задание длительностью 4 часа.

  • Система получает временную зону исполнителя, определяет текущее время во временной зоне исполнителя (16.00 10-ое января) и обращается к календарю.

  • Зная текущее время исполнителя, можно корректно определить время для завершения задания, и оно будет 11:00 11-го января (2 рабочих часа 10-го января и 2 рабочих часа 11-го января)

  • После всех вычислений останется только записать в задании дату завершения 4.00 11-го января по UTC.

time zones diagram

12.2. Особенности работы

  • Календарь не привязан к какой-то конкретной временной зоне. Значения для начала и конца рабочего времени, а также для обеда, хранятся без смещений. Т.е. при рабочем дне с 9.00 до 18.00 и обедом с 13.00 до 14.00, в календаре лежат кванты 9.00 - 9.15, 9.15 - 9.30 и т.д..

  • Все роли в системе, кроме контекстных, содержат информацию о временной зоне. Т.е. для исполнителя явным образом всегда можно определить временную зону.

  • При создании задания, информация о временной зоне берётся из роли, на которую назначено задание и записывается в задание. Аналогично для записей в истории заданий - информация о в ременной зоне берётся из задания, к которому относится запись в истории.

Если пользователь физически находится в той же зоне, что и задание, которое он видит (смещение временной зоны его компьютера совпадает со смещением в задании), то задание отображается привычным образом. Если же смещение временной зоны компьютера пользователя не совпадает со смещением в задании, то пользователь увидит рядом с оставшимся временем приписку с временной зоной, к которой относится задание.

time zones 14

Если задание просрочено, то срок его исполнения, который отображается после информации о просрочке, по-прежнему отображается в локальном времени компьютера пользователя. Несмотря на то, что для просрочки указана приписка с временной зоной.

time zones 15
В лёгком клиенте нет возможности определить локальную временную зону пользователя, поэтому, описанный выше алгоритм опирается не на него, а на ту информацию о временной зоне, которая указана в карточке сотрудника.

12.3. Карточка настройки временных зон

Для хранения информации о временных зонах и их смещениях, а также для хранения дополнительных настроек, связанных с временными зонами, существует карточка-справочник "Временные зоны". В списке временных зон есть зона "По умолчанию", которая, на только что установленной системе, указана для всех ролей, которые требуют указания временной зоны. Также, эта зона используется в тех случаях, если по тем или иным причинам определить зону не удалось. Указанные в этой карточке временные зоны используются как источник данных для выбора, при указании временной зоны в ролях. Но если для всех ролей и сотрудников предполагается, что они находятся в одной временной зоне, то можно просто запретить редактирование временных зон и использовать зону "По умолчанию", установив в ней необходимое смещение.

Открыть карточку настройки временных зон можно из правого меню - Настройки → Временные зоны. Карточка доступна только администраторам системы.

Карточка настройки временных зон содержит в себе:

  • Настройку, запрещающую/разрешающую редактирование временных зон в ролях.

  • Справочник временных зон - таблица со списком доступных временных зон.

Так же в левом меню этой карточки расположены служебные тайлы для работы с временными зонами.

time zones 01

12.3.1. Запрет редактирования временных зон в ролях

Если не установлен флаг "Разрешить менять зоны в ролях", то поля для ввода временных зон будут недоступны для редактирования во всех ролях.

time zones 02

12.3.2. Временная зона по умолчанию

Зона с идентификатором "0" в списке временных зон является временной зоной "По умолчанию". Её нельзя удалить или поменять ей "Идентификатор зоны" и "Отображаемое значение". Можно лишь изменить "Код зоны" и "Смещение". Эта зона будет использована в тех случаях, если временную зону определить не удалось. Например, когда не заполнено поле в роли или генератор метаролей не предоставил информацию о временной зоне.

time zones 03

Также, при установке "чистой" системы из сборки, эта зона прописана для всех ролей, которые присутствуют в системе. Смещение зоны "По умолчанию" можно задать при установке через скрипты "Setup.bat", "setup.sh" и т.д.. Или же можно поменять смещение в временной зоне "По умолчанию" - уже после установки системы, зайдя в картчоку настройки временных зон.

time zones 16

12.3.3. Добавление и редактирование временных зон

Двойным нажатием левой кнопки мыши на любую из строк в таблице временных зон, можно поменять её параметры.

time zones 08

Доступны для изменения следующие параметры:

  • "Идентификатор зоны" - уникальный идентификатор, по которому сопоставляются со справочником временные зоны, указанные в ролях, заданиях и записях истории заданий.

  • "Код зоны" - алиас, который описывает временную зону.

  • "Отображаемое значение" - универсальное отображаемое имя.

  • "Смещение" - время, на которое временная зона отличается от UTC.

  • "Отрицательное направление сдвига" - признак того, что "Смещение" относительно UTC направлено в отрицательную сторону.

При указании в роли временной зоны, в неё так же записывается и смещение из справочника. Если после указания в роли - временная зона перестанет существовать в справочнике, роль продолжит функционировать с указанным смещением.
При изменении в справочнике смещения зоны - во всех ролях, где указана данная временная зона, информация о смещении обновится автоматически. Если изменён идентификатор зоны, то в ролях автоматического обновления смещений не будет. Принудительно обновить смещения во всех ролях можно с помощью тайла "Обновить смещения", расположенной в левом меню карточки настроек временных зон.

Так же можно добавлять новые временные зоны, если нажать на кнопку "Добавить" под таблицей временных зон. Важно учитывать то, что добавить временную зону с повторяющимся "Идентификатором зоны" нельзя.

12.3.4. Служебные тайлы

В левом выпадающем меню карточки настроек временных зон находятся специальные служебные тайлы.

time zones 04
  • "Заполнить временные зоны" - очищает карточку временных зон и наполняет из справочника операционной системе на сервере.

  • "Установить зону "По умолчанию"" - устанавливает для всех ролей временную зону "По умолчанию", указанную в справочнике.

  • "Обновить связи" - проверяет и исправляет, если необходимо, временные зоны, проставленные за счёт иерархии наследования временных зон между подразделениями, сотрудниками и статическими ролями.

  • "Обновить смещения" - проверяет и исправляет смещения в ролях, согласно справочнику из карточки временных зон.

12.4. Временные зоны в ролях

В карточках ролей имеется поле для указания временной зоны. В большинстве ролей это поле позволяет выбрать временную зону из справочника, если в карточке настроек временных зон указанно, что можно редактировать временные зоны в ролях. В карточках метаролей и ролей задания редактирование временной зоны невозможно, т.к. зона в них определяется при создании или пересчёте роли.

time zones 05
При изменении временной зоны в роли, на которую назначалось задание, временная зона в задании остаётся неизменной.
Временная зона может наследоваться от статических ролей к дочерним статическим ролям, от подразделений к дочерним подразделениям и от подразделений к сотрудникам в их составе. Для указания необходимости наследования временной зоны от родителя, есть специальный флаг в карточке статических ролей, департаментов и сотрудников.

12.4.1. Сотрудник

В карточке сотрудника можно указать временную зону или проставить флажок, который включает наследование временной зоны от подразделения. При установке этого флажка, сотрудник будет получать временную зону от своего подразделения или использовать временную зону "По умолчанию", если не состоит ни в одном из подразделений.

time zones 09

12.4.2. Подразделение

В карточке подразделения можно указать временную зону или проставить флажок, который включает наследование временной зоны от родительского подразделения. При установке этой галочки, подразделение будет получать временную зону от своего родителя или использовать временную зону "По умолчанию", если родителя нет.

time zones 10

12.4.3. Статическая роль

В карточке статической роли можно указать временную зону или проставить флажок, который включает наследование временной зоны от родительской статической роли. При установке этой галочки, роль будет получать временную зону от своего родителя или использовать временную зону "По умолчанию", если родителя нет.

time zones 11
Сотрудники, состоящие в составе статической роли, не наследуют временную зону от неё.

12.4.4. Динамическая роль

В динамических ролях не может быть наследования и поэтому временную зону в них можно только указать вручную.

time zones 12

12.4.5. Метароль

В карточке метароли есть поле с временной зоной, но указать его вручную нельзя. Кроме того, также, как и в динамической роли, наследование временной зоны - не предполагается. Временной зоной в метаролях управляет их генератор. Для указания временной зоны - необходимо, чтобы генератор метаролей вернул нужную временную зону в результатах запроса. Например, как в генераторе для "Агрегатных ролей".

time zones 07
Колонка с идентификатором временной зоны должна идти пятой и может иметь любой алиас. Если колони с идентификатором временной зоны не будет, то считается, что метароль имеет временную зону "По умолчанию".

12.4.6. Контекстная роль

В карточке контекстной роли нельзя указать временную зону. Дело в том, что состав контекстной роли рассчитывается непосредственно в момент отправки и записывается в роль задания. Подробнее об этом можно почитать в разделе Роль задания

12.4.7. Роль задания

Роль задания создаётся, когда задание отправлялось на роль с заранее неизвестным составом. Например в тех случаях, когда исполнителем задания указана контекстная роль, или же состав исполниелей вычисляется как-то ещё, как в случае с отправкой на группу сотрудников. Роль задания имеет временную зону, но её невозможно изменить из карточки, т.к. временная зона определяется в момент создания роли. Для определения временной зоны роли задания берётся временная зона первого сотрудника из состава роли, отсортированного по уникальному идентификатору сотрудника.

time zones 13

12.5. Наследование временных зон

В статических ролях, подразделениях и сотрудниках можно установить необходимость наследования временной зоны из родителя. Для этого есть специальный флаг "Наследовать временную зону".

time zones 06

При установке этого флага сбрасывается указанная в роли временная зона, а после сохранения карточки роли - устанавливается такой же как у родителя.

  • При наследовании в подразделениях - наследуется временная зона родительского подразделения. Если нет родителя - подтянется зона "По умолчанию".

  • При наследовании в роли сотрудника - наследуется временная зона подразделения, в которое входит сотрудник.

  • При наследовании в статических ролях - наследуется временная зона родительской статической роли. Если нет родителя - подтянется зона "По умолчанию".

Если сотрудник наследует временную зону от подразделения, и он состоит в нескольких подразделениях, то будет унаследована временная зона первого подразделения из списка его подразделений, отсортированных по уникальному идентификатору подразделения.
Статические роли наследуют временные зоны только между собой. Сотрудники, входящие в состав статической роли, не наследуют от них временную зону.

13. Настройка лицензий

Карточка настроек лицензий содержит в себе следующие настройки:

  • Конкурентные лицензии для клиента – общее количество/количество занятых конкурентных лицензий для Tessa Client. Конкурентные лицензии задействуются, когда какой либо пользователь заходит в Tessa Client (пользователь, для которого не выписана персональная лицензия), и освобождаются, когда из приложения выходит. При отсутствии свободных конкурентных лицензий новый сотрудник не сможет запустить Tessa Client (если ему не выдана персональная лицензия);

  • Конкурентная лицензия для web-клиента - аналогично конкурентным лицензиям для клиента, только ведется подсчет занятых лицензий web-клиента;

  • Персональные лицензии для клиента - общее количество/количество занятых персональных лицензий в Tessa Client. Если в систему входит пользователь, указанный в настройках лицензии как имеющий персональную лицензию, то он может сколько угодно раз запускать приложение TessaClient из разных мест. Указанные пользователи всегда смогут зайти в систему, даже если все конкурентные лицензии заняты. Количество сотрудников, кому будут выданы персональные лицензии, не может превышать допустимое количество;

  • Персональные лицензии для web-клиента - общее количество/количество занятых персональных лицензий web-клиента.

  • Мобильное согласование - сотрудники, кому будут высылаться расширенные уведомления с возможностью согласовать/не согласовать документ или завершить задачу (настройка работы мобильного согласования описана в Руководстве по установке Tessa).

image157

Добавить сотрудников в список можно путем перечисления фамилий, или же путем выбора роли, нажав на кнопку "Добавить сотрудников по ролям". В открывшемся окне указать одну или несколько ролей. Для выбора доступны Метароли, Департаменты, Статические и Динамические роли:

image186 1

Все сотрудники выбранных ролей будут добавлены в список, система выдаст сообщение о количестве добавленных сотрудников и общем количестве сотрудников, для кого будет включено Мобильное согласование:

image186 2
Количество сотрудников не должно превышать общее число доступных лицензий, указанных в данном разделе (информация обновляется при сохранении карточки): image186 3
После изменения настроек необходимо перезапустить веб-сервис web и сервис Chronos.

14. Управление сессиями

Список всех открытых сессий можно посмотреть из рабочего места Администратор, представление Активные сессии:

image158

В списке отображена информация о всех подключенных пользователях с указанием типа лицензии, типа входа пользователя и запущенного приложения (Tessa Client, Tessa Admin, Web-клиент). У администратора есть возможность закрыть сессию, выбрав в представлении строку и нажав на левой панели системы кнопку "Закрыть сессию".

15. Настройки сервера

Открыть карточку настроек сервера можно с помощью правого меню: Настройки → Настройки сервера.

Карточка настроек сервера содержит в себе основные настройки, настройки хранилища файлов а также настройки безопасности:

image158 1

Основные настройки

  • Email для мобильного согласования - адрес электронной почты, куда будет отправляться ответ по ссылке в уведомлении (согласовать, не согласовать, завершить), для последующей обработки плагином Chronos.

  • Таймаут выполнения представлений, секунд (0- неограниченно) - таймаут открытия представлений;

  • Базовый адрес web-клиента - необходимо указать базовый адрес web-клиента (лёгкого клиента) для формирования корректных ссылок на карточки при отправке уведомлений пользователям. В почтовых уведомлениях будет присутствовать как ссылка на открытие карточки в Tessa Client, так и ссылка для открытия карточки в легком клиенте. Обычно это адрес вида: https://СЕРВЕР/tessa/web

  • Расширения файлов, для которых отключён предпросмотр - список расширений файлов (указываются через пробел), для которых в карточках будет отключён предпросмотр.

  • Расширения файлов со встроенным предпросмотром в desktop-клиенте с преобразованием в PDF - список расширений файлов (указываются через пробел), предпросмотр для которых выполняется через преобразование в PDF в desktop-клиенте, т.е. аналогично предпросмотру в web-клиенте. Например, укажите: doc docx xls xlsx ppt pptx odt. Таким образом, на компьютере пользователей не требуется установленное приложение для предпросмотра (такое, как MS Word).

    Первый предпросмотр для каждой версии файла с такими расширениями приводит к конвертации в PDF, которая может занять длительное время для больших файлов (при этом должен быть запущен Chronos и настроен LibreOffice).

    Если файл только что добавлен или его содержимое изменено (файл подсвечивается жёлтым цветом), то предпросмотр с конвертацией отключается для таких файлов, т.е. используется обычный предпросмотр как раньше до того момента, как карточка с файлами будет сохранена.

    По умолчанию список расширений пуст, т.е. предпросмотр выполняется приложениями на компьютере пользователя. Переопределить поведение можно в расширениях.

  • Начальный размер большого файла, Мб (пусто, если нет больших файлов) - файлы, содержимое которых занимает указанный размер или больше, будут считаться большими файлами, и для них будет выполняться особая обработка на клиенте, в т.ч. запрет на копирование во временную папку, и связанные с этим невозможность выполнить предпросмотр, подписать файл или отредактировать файл в приложении.

  • Максимальный размер файла для загрузки в систему, Мб (пусто, если нет ограничений) - установка ограничения на размер добавляемых пользователями файлов.

  • Кодировка CSV - кодировка для CSV файлов, которые формируются при выгрузке представлений. Кодировка должна называться в соответствии с именами, разрешёнными в .net, например: windows-1251, utf-8, utf-16.

  • Символ-разделитель CSV - указывается символ, который будет использоваться в качестве разделителя при выгрузке представлений в CSV. Допустимым разделителем является запятая или точка с запятой.

  • Роли, которым доступен web-клиент - список ролей, кому доступен wеb-клиент.

  • Запретить загрузку файлов с мобильных устройств - при выставлении флага у пользователей пропадет возможность скачивать приложенные к карточкам документов файлы в легком клиенте, запущенном на мобильном устройстве.

Настройте хранилище файлов

  • ID - идентификатор хранилища;

  • Название - название хранилища;

  • Местоположение - расположение хранилища:

    • если установлен флаг "База данных", то указывается имя строки подключения из конфигурационного файла (значение default определяет, что будут использоваться настройки соединения по умолчанию);

    • если флаг "База данных" не установлен, то необходимо указать полный путь к файловой папке;

  • Расширения файлов - при необходимости можно указать расширения файлов, которые будут храниться в данном хранилище;

  • База данных - флаг устанавливается, если хранилище соответствует базе данных, а не файловой папке;

    СУБД PostgreSQL не поддерживает хранение файлов в базе.
  • Обратная совместимость - флаг устанавливается в случае, если хранилище на файловой системе уже существовало в версии платформы 1.20 или раньше:

    • если флаг установлен, то подпапки с файлами всех карточек расположены в базовой папке (см. поле "Местоположение");

    • если флаг не установлен (по умолчанию), то подпапки с карточками распределяются по иерархии подпапок, что позволяет хранить файлы для миллионов карточек без снижения производительности.

Не рекомендуется устанавливать флаг "Обратная совместимость" для новых установок системы.

Поля блока Опциональные настройки (Текущий размер и Максимальный размер) носят информативный характер, системой не заполняются и не проверяются. Данные поля нужны для ручного контроля со стороны администратора.

Настройки безопасности

На данной вкладке расположены настройки безопасности, связанные с сессиями и паролями пользователей.

image358
  • Раздел "Настройки входа"

    • Неудачных попыток входа до блокировки пользователя - ограничение общего количества неуспешных попыток выполнения входа. Возможность войти в систему для такого пользователя блокируется до тех пор, пока блокировку не снимет Администратор.

      Снять блокировку (или вручную выставить) можно в карточке сотрудника:

      image360
    • Неудачных попыток входа подряд (в серии) до временной блокировки - ограничение количества неудачных попыток входа для быстрой серии. При количестве неудачных попыток, указанных в данном поле и промежутком между попытками, указанном в соответстветвующем поле, возможность войти в систему для такого пользователя блокируется временно.

    • Время между попытками входа, чтобы считать их в одной серии попыток - указывается время (по умолчанию 5 мнут) между попытками входа для выявления серии. Если время между попытками входа меньше указанного, то попытки входа считаются серией.

    • Время блокировки пользователя после нескольких неудачных попыток входа подряд, часы - количество часов, на которое для пользователя блокируется возможность входа в систему в случае, если пользователем была произведена серия попыток входа с неверным паролем.

    • Время неактивности, по истечении которого сессия закрывается, часы - время неактивности, по истечении которого сессия становится недоступной для использования. При попытке выполнить действие по такой сессии система предупредит пользователя, что ему следует перезапустить приложение.

  • Раздел "Настройки задания паролей для типа входа "Пользователь Tessa"

    • Минимально разрешенная длина пароля - минимальное допустимое количество символов в пароле. Пароль, содержащий символов меньше, чем указано в данном поле, невозможно будет сохранить.

    • Специальные символы, цифры и разные регистры символов - включить требование к сложности пароля. Система не позволит задать пароль, не содержащий символы разных регистров, цифры и специальные символы (знаки препинания, математические операторы и др.)

    • Количество неповторяющихся паролей - указывается количество последних паролей, которые не должны повторяться. Актуально при необходимости периодической смены паролей пользователями.

    • Срок действия пароля, дни (пусто, если бессрочно) - количество дней, по истечении которых доступ пользователю в систему будет заблокирован, если он не сменит пароль. Дата последней смены пароля хранится в карточке сотрудника, в блоке "Безопасность".

    • Срок начала отправки уведомлений перед истечением срока пароля, дни - пользователям будут отправляться уведомления о необходимости смены пароля за то количество дней, которое указано в данном поле. Если пароль пользователем не будет сменен до срока окончания действия пароля, то вход в систему для такого пользователя будет заблокирован. Снять блокировку может Администратор в карточке сотрудника.

Настройки на данной вкладке необходимо изменять в случае, если это требует политика безопасности организации. В остальных случаях настройки можно оставить по умолчанию.

16. Работа с удаленными карточками

При удалении карточки она переносится в корзину, если для типа карточки в настройках установлен флаг "Удалять в корзину". При этом данные карточки сериализуются в специальный пакет, который прикладывается к специальной карточке типа "Удаленная карточка" и к ней же прикрепляются все файлы оригинальной карточки. Все строки данных этой карточки из базы данных удаляются. Карточка хранится в корзине 30 дней, а затем удаляется специальным плагином Chronos. Период хранения карточки можно настроить в файле "Chronos\app.json", параметр Maintenance.RemoveDeletedCardsOlderThanDays (см. Настройка плагинов Chronos).

Просмотреть список всех удаленных в системе карточек можно из представления Удаленные карточки, расположенного в разделе Прочее на вкладке Администратор:

image161 4

Открыв карточку, открывается информация по удаленной карточке:

image161 5

На вкладке "Карточка" указана основная информация по удаленной карточке (номер, тип, идентификатор, а также приложенные файлы). На вкладке "Задания" - список сотрудников/ролей, на которых были назначены какие-либо задания по данной удаленной карточке. На вкладке "Системная информация" можно посмотреть структуру карточки.

Вносить какие-либо изменения в удаленную карточку невозможно.

По удаленной карточке доступны следующие действия:

  • Просмотр исходной карточки - для просмотра самой карточки можно нажать сочетание клавиш Ctrl + Enter или кнопку в левом меню системы - Просмотр:

    image161 6

    В новой вкладке на чтение будет открыта карточка. Для возврата к удаленной карточке можно также нажать сочетание клавиш Ctrl + Enter.

  • Восстановить - восстановить карточку можно с помощью сочетания клавиш Ctrl + Z или нажав на кнопку Восстановить в левом меню системы. Карточка будет восстановлена в системе и доступна для пользователей.

  • Исправить - в случае, если структура данного типа карточки была изменена, карточку необходимо исправить для корректного отображения в системе.

  • Удалить - для окончательного удаления карточки нажать сочетание клавиш Ctrl + D или кнопку Удалить в левом меню системы.

    После окончательного удаления карточки восстановить её будет невозможно. В случае, если карточке был выделен номер, он освободится в нумераторе.

17. История действий

Просмотр истории действий в Tessa доступен только для администраторов системы (т.е. уровень доступа сотрудника - "Администратор", см. Заведение нового пользователя/администратора в системе).

По умолчанию история действий фиксируется по всем типам карточек и всем изменениям в объектах приложения Tessa Admin. Отключить данную настройку для какого либо типа карточки можно в Tessa Admin, найдя нужную карточку и сняв флаг "Фиксировать действия" (более подробно описано в разделе Создание нового типа карточки).

17.1. Общая информация по истории действий

В истории действий фиксируются события, описанные ниже. Для каждой записи в истории фиксируется:

  • Объект - объект, в котором были выполнены действия. Если изменения были в карточке, то двойным кликом по ссылке можно открыть указанную карточку;

  • Тип - тип карточки или объекта, где было выполнено действие;

  • Идентификатор сессии - id сессии, в которой было выполнено действие;

  • Действие - событие, которое было выполнено;

  • Сотрудник - сотрудник выполнивший действие;

  • Дата/время события;

  • Описание изменений - подробное описание изменений.

Список возможных событий (описание событий сгруппировано по типу):

Все карточки
  • Восстановление карточки из корзины - восстановление удаленной карточки.

  • Изменение карточки - запись о внесении каких-либо изменений в любую карточку.

  • Импорт карточки - импорт любой карточки в систему (через Tessa Admin или Tessa Client).

  • Открытие карточки - открытие какой-либо карточки (а также при обновлении уже открытой карточки).

  • Открытие файла - открытия приложенного к какой-либо карточке файла (в том числе просмотр файла с помощью области предпросмотра).

  • Создание карточки - создание новой карточки любого типа.

  • Удаление карточки - запись об удалении карточки с указанием способа удаления (с или без возможности восстановления).

  • Удаление карточки из корзины - удаление карточки из представления "Удаленные карточки" или в случае удаления карточки сразу без возможности восстановления (доступно только для Администраторов).

  • Экспорт - экспорт карточки.

Сотрудник (карточка сотрудника)
  • Вход в систему - вход сотрудника в систему. Объект - карточка сотрудника.

  • Выход из системы - выход сотрудника из системы.

  • Закрытие сессии администратором - закрытие сессии администратором.

  • Неудачный вход в систему - запись о неудачной попытке входа в систему. В данной записи также есть информация об IP и имени компьютера, с которого была произведена попытка входа, а также причины неудачного входа. Записи об неудачном входе всегда от имени служебной учетной записи System.

Последовательность
  • Выделение зарезервированного номера - выделение номера из последовательности (например, при создании/сохранении новой карточки, или при ручном выделении нового номера в карточке документа).

  • Выделение незарезервированного номера - выделение незарезервированного номера (при импорте карточки).

  • Выделение очередного номера - выделение номера карточки без резервирования (с помощью дополнительных расширений).

  • Дерезервирование номера - удаление резерва номера в последовательности (например, когда новая карточка с выделенным (зарезервированным) номером была закрыта без сохранения).

  • Освобождение номера - освобождение из последовательности ранее выделенного номера (например, при ручном освобождении номера из карточки документа или при окончательном удалении документа в случае, если для документа стоит настройка по очищению номера при удалении карточки).

  • Резервирование номера - информация о резервировании номера в последовательности (номер резервируется до сохранения карточки документа).

Настройки сервера (действия в Tessa Admin)
  • Изменение библиотеки (схема) - создание новой или переименование библиотеки в схеме данных.

  • Изменение библиотеки локализации - создание новой библиотеки, переименование библиотеки или любые изменения в строках библиотеки (включая удаление строк).

  • Изменение миграции (схема) - создание, переименование или изменение миграции в схеме данных.

  • Изменение представления - переименование или внесение изменений в представление, включая редактирование прав доступа.

  • Изменение процедуры (схема) - создание, переименование или изменение процедуры в схеме данных.

  • Изменение рабочего места - переименование или внесение изменений в рабочее место, включая редактирование прав доступа.

  • Изменение таблицы (схема) - создание, переименование или изменение таблицы в схеме данных.

  • Изменение типа карточки - переименование или внесение изменений в тип карточки.

  • Изменение функции (схема) - создание, переименование или изменение функции в схеме данных.

  • Импорт представления - импорт представления (через Tessa Admin или с помощью утилиты tadmin).

  • Импорт рабочего места - импорт рабочего места (через Tessa Admin или с помощью утилиты tadmin).

  • Создание представления - создание нового представления.

  • Создание рабочего места - создание нового рабочего места.

  • Создание типа карточки - создание нового типа карточки.

  • Удаление библиотеки (схема) - удаление библиотеки из схемы.

  • Удаление библиотеки локализации - удаление библиотеки локализации.

  • Удаление миграции (схема) - удаление миграции из схемы.

  • Удаление представления - удаление представления.

  • Удаление процедуры (схема) - удаление процедуры из схемы.

  • Удаление рабочего места - удаление рабочего места.

  • Удаление таблицы (схема) - удаление таблицы из схемы.

  • Удаление типа карточки - удаление типа карточки.

  • Удаление функции (схема) - удаление функции из схемы.

Прочее
  • Ошибка - запись о создании новой карточки ошибки (список карточек можно посмотреть на вкладке Администратор → Прочее → Ошибки). Фиксируются следующие виды ошибок: ошибки при скачивании приложений в Tessa Applications, ошибки расчёта ролей, ошибки конвертации файлов (для предпросмотра в лёгком клиенте), ошибки бизнес-процессов Workflow Engine. Также тут могут фиксироваться какие-то дополнительные ошибки в проектных расширениях.

17.2. Просмотр журнала

Просмотреть журнал (т.е. полный список записей о всех событиях) можно на вкладке "Администратор", представление Прочее → История действий:

image197

По умолчанию записи отсортированы по дате/времени события. В данном представлении можно выполнить поиск по параметрам (нажав на кнопку с изображением лупы), например - просмотр информации о входе в систему любых сотрудников за конкретную дату:

image198

Или, например, указав в параметр "Сотрудник" конкретного пользователя можно просмотреть историю всех его действий. Если требуется просмотреть историю действий по конкретно карточке, то удобней пользоваться не общим журналом событий, а открыть историю действий в самой карточке.

Дважды кликнув на нужной строке в представлении, откроется карточка записи в истории.

На изображении ниже показана подробная информация по изменению карточки Входящего документа. Мы видим, в какой карточке были внесены изменения (ID, тип и имя карточки), в каких полях было изменено значение, а также запись о том, что был приложен файл:

image199

Дважды кликнув на значении в поле "Объект" в новой вкладке будет открыта та карточка, в которой были произведены описанные изменения.

С клиента на сервер любой запрос приходит в форме реквеста различных типов. Реквест в бинарном виде сохраняется в карточке события. На вкладке "Системная информация" можно посмотреть этот реквест в десериализованном виде:

image202

17.3. Просмотр истории действий по карточке

Из любой карточки в системе (карточка документа, карточка роли, карточка какого-либо справочника, карточка настроек и т.д.) можно просмотреть список всех событий по ней. Открыв нужную карточку, на левой панели системы выбираем Системные → История действий:

image200

В новой вкладке будет открыта история действий по данной карточке:

image201

С помощью поисковых параметров (нажав на изображение лупы) в данном списке можно выполнить поиск нужных записей.

Для просмотра подробной информации по событию необходимо дважды кликнуть по нужной строке, в новой вкладке будет открыта карточка записи в истории. Описание карточки "Запись в истории" см. в предыдущем разделе.

17.4. Очистка журнала

Очистка журнала истории действий выполняется плагином сервиса Chronos. Период очистки журнала задается в параметре Maintenance.RemoveActionHistoryOlderThanDays в конфигурационном файле, который расположен в папке сервиса: Chronos\app.json (более подробно в разделе Настройка плагинов Chronos). По умолчанию очищаются все записи истории, давность которых превышает 180 дней.

Период запуска плагина определяется в конфигурационном файле DailyExtensionsScheduler.xml, который расположен в папке сервиса: Chronos\Plugins\Tessa\configuration. По умолчанию запуск ежедновно в 12:00 am.

18. Настройка плагинов Chronos

Для плагинов сервиса Chronos есть возможность настроить расписание запуска, а также некоторые дополнительные параметры. Конфигурационные файлы плагинов расположены в папке сервиса: Chronos\Plugins\Tessa\configuration.

Любой из плагинов можно отключить, выставив в параметре disabled значение "true".

Период запуска плагина указывается в параметре trigger. Описание формата для указания периода запуска плагина можно посмотреть по ссылке.

  • AdSyncPlugin.xml - основной плагин синхронизации сотрудников/подразделений/статических ролей с Active Directory / LDAP (см. Синхронизация с Active Directory / LDAP).

    По умолчанию - запуск каждые 30 секунд.

  • AdSyncRecurrentPlugin.xml - плагин автоматической периодической синхронизации сотрудников/подразделений/статических ролей с Active Directory / LDAP (см. Синхронизация с Active Directory / LDAP).

    По умолчанию - запуск ежедневно в полночь.

  • ContinuousDocumentLoadPlugin.xml - основной плагин потокового ввода документов (см. Потоковый ввод документов).

    По умолчанию - запуск каждые 30 секунд.

  • DeputiesRecalc.xml - пересчет списка заместителей для всех типов ролей (см. Добавление заместителей и Карточка "Мои замещения").

    По умолчанию - запуск каждые 5 минут.

  • FileConverter.xml - плагин для конвертации tiff файлов, а также офисных файлов в формат pdf. Используется для предпросмотра в web клиенте (см. Руководство по установке Web клиента Tessa).

  • PasswordNotifications.xml - плагин, отправляющий пользователю напомимнание о скорой необходимости смены пароля, если в настройках безопасности ограничен срок паролей.

    По умолчанию - запуск ежедневно в 05:00 am.

  • RoleScheduler.xml - пересчет всех динамических ролей и генерация метаролей (см Роли). Плагин запускается один раз (при старте сервиса) и работает непрерывно.

  • TasksNotifications.xml - плагин для отправки еженощных уведомлений на почту со списком карточек, по которым у сотрудника есть какие-либо задания (см. Руководство по установке СЭД Tessa).

    По умолчанию - запуск ежедневно в 05:00 am.

  • TokenNotifications.xml - плагин для отправки уведомления на почту администратору системы о необходимости сменить ключ токена безопасности (см. Генерация нового токена безопасности веб-сервиса системы в Руководстве по установке СЭД Tessa).

    По умолчанию - запуск 1-го числа каждого месяца в 7:00 am.

  • WorkflowEngineAsyncPlugin - плагин обрабатывает асинхронные задачи в бизнес-процессе. По умолчанию все задачи в процессе синхронные, т.е. действия выполняются в рамках веб-сервиса в момент, когда нажата плитка или завершено очередное задание. Но на некоторых узлах можно указать, что обработка асинхронная, тогда в веб-сервисе добавляется активная операция, а плагин Chronos её "подхватывает" и обрабатывает, что полезно для очень длительных действий.

    По умолчанию - запуск каждые 60 секунд.

  • WorkflowScheduler - плагин запускается один раз и периодически обрабатывает события таймеров, которые настроены в бизнес-процессах.

Помимо указанных плагинов есть дополнительные настроечные файлы в этой же папке, в которых указан период выполнения тех или иных операций:

  • OftenExtensionsScheduler.xml - по умолчанию запуск каждые 30 секунд. Настройка используется для плагина отправки почты и плагина получения писем мобильного согласования.

  • NormalExtensionsScheduler.xml - по умолчанию запуск каждые 15 минут. Настройка используется для плагина автосогласования (более подробно см. Автоматическое согласование) и плагина возврата заданий из отложенного состояния.

  • DailyExtensionsScheduler.xml - по умолчанию запуск ежедневно в 12:00 am. Настройка для плагинов:

    • RemoveActionHistoryPlugin - удаление старых записей в истории действий

    • RemoveDeletedCardsPlugin - удаление старых карточек из корзины

    • RemoveErrorCardsPlugin - удаление старых карточек ошибок

    • RemoveOperationsPlugin - удаление повисших активных операций

    • RemoveCompiledViews - удаление старых скомпилированных представлений для PostgreSQL

      Количество дней, по превышении которых удаляются те или иные данные, указываются в соответствующих параметрах конфигурационного файла сервиса Chronos\app.json в блоке Settings:

      		"Maintenance.RemoveActionHistoryOlderThanDays": 180,
      		"Maintenance.RemoveDeletedCardsOlderThanDays": 30,
      		"Maintenance.RemoveErrorCardsOlderThanDays": 180,
      		"Maintenance.RemoveOperationsOlderThanDays": 7,
      		"Maintenance.RemoveCompiledViewsOlderThanDays": 1,

19. Создание/Редактирование тем оформления и настройка фоновых изображений

19.1. Фоновые изображения

Пользователи Tessa Client могут выбирать фоновые изображения из списка преднастроенных, или же загрузив изображение из файловой системы:

image290

Администраторам системы доступно добавление новых фонов, которые будут доступны всем пользователям для выбора в Tessa Client в меню правой панели - Фон. Для добавления новых изображений необходимо внутри папки Tessa Client создать новую папку и поместить туда желаемые файлы изображений. Далее, в конфигурационном файле TessaClient32.exe.config, который расположен тут же, в папке Tessa Client, указать имя папки с изображениями (по умолчанию это папка с именем wallpapers):

<add key="WallpaperFolder" value="wallpapers"/>

Изображения из указанной папки (без учета подпапок) будут подгружены в Tessa Client. Если вы хотите указать несколько папок, то можно указать несколько путей, разделенных точкой с запятой.

Для того, чтобы установить всем пользователям изображение в качестве фона по умолчанию (т.е. при первом запуске Tessa Client у пользователя будет указанный в конфигурационном файле фон, однако, при желании пользователь сможет его сменить), то укажите имя данного файла в параметре DefaultWallpaper, например:

<add key="DefaultWallpaper" value="wallpapers\image.jpg"/>
Чтобы папка с изображениями и обновленный конфигурационный файл загрузились всем пользователям необходимо заново опубликовать приложение.

19.2. Общая информация по темам оформления

В Tessa Client есть три преднастроенные темы оформления: Холодная, Теплая, Светлая. Каждую из них можно настроить или создать новую свою тему. Все настройки тем хранятся в конфигурационных файлах ИмяТемы.json в папке Tessa Client\themes.

Папка theme настраивается в TessaClient.exe.config, параметр ThemeFolder, может содержать одну или несколько папок, разделённых точкой с запятой. Папки с содержимым должны быть вложенными в папку TessaClient, тогда они опубликуются вместе с приложением и будут доступны сотрудникам.

В файле темы содержатся следующие настройки:

  • Name - имя темы.

  • Caption - название темы, которое будет отображаться в Tessa Client. Можно указать строку локализации.

  • TessaWallpapers - список фоновых изображений, относящихся к данной теме.

  • DefaultWallpaper - фоновое изображение по умолчанию, которое будет отображаться при выборе пользователем данной темы.

  • .include - ключ для подключения других json файлов. В параметре указывается файл с относительным путём, или же можно указать несколько относительных путей, как json-массив. Данный параметр не обязателен.

    При объединении include-ов сначала используются "самые вложенные" json-файлы, и в самом конце применяется содержимое текущего файла. Это означает, что в свою тему можно "включить", например. содержимое темы Light.json, а затем в файле переопределить некоторые цвета, название темы и др.

    По умолчанию все стандартные темы задают include-ом файл shared.json, в котором есть пример нескольких ресурсов темы: это цвета и числа. Так можно сразу во всех стандартных темах переопределить некоторые цвета (например, цвет области с заданием).

Чтобы добавить новую тему, надо сделать json по аналогии с одной из существующих тем (например, возьмите Light.json), и переопределить в теме только те цвета, которые надо переопределять (не указывайте все-все цвета, как это сделано в холодной теме).

Холодная тема Cold.json является самой полной, содержит все цвета. Идентичная ей тема является "темой по умолчанию" - если есть какая-то тема, в которой часть цветов не задана, то эти цвета берутся из холодной темы. Но если поменять холодную тему в папке, то цвета по умолчанию всё равно будут браться такими, какими они были указаны в платформе (до изменений).

По аналогии можно добавлять свои цвета, которые использовать в расширениях Tessa.Extensions.Defualt.Client. Они должны быть определены в файлах props*.json внутри папки themes (или других папок с темами). Пример файла props.json уже добавлен в themes. Использовать так: либо в xaml через {tuim:ThemeResource ИмяРесурса} (где tuim соответствует пространству имён Tessa.UI.Markup). Либо в C# через ThemeManager.Current.Theme.Get<SolidColorBrush>("ИмяРесурса") (для типа SolidColorBrush, также возможны LinearGradientBrush, Color, double, bool и др. типы, разрешающие преобразование из json-значения).

Чтобы новые темы загрузились всем пользователям необходимо заново опубликовать приложение.

Описание цветов, которые можно задать в теме, разделены по блокам и описаны далее. Для того, чтобы убедиться, что вы меняете цвет в нужном параметре можно, например, выставить красный цвет #FFFF0000 и посмотреть в приложении, где он применился.

Для выбора нужных цветов можно использовать удобные конверторы цветов, например, https://colorscheme.ru/color-converter.html.

19.3. Настройка тем

19.3.1. Диалоговые окна

  • TessaWindow - цвета для диалоговых окон (например, окно справки, параметров фильтрации и т.д.).

    • WindowChromeBackground - Фоновый цвет рамки для окна.

    • WindowChromeBorderBrush - Фоновый цвет обводки рамки для окна.

    • WindowChromeInactiveBackground - Фоновый цвет рамки для окна, когда оно неактивно.

    • WindowChromeInactiveBorderBrush - Фоновый цвет обводки рамки для окна, когда оно неактивно.

Например, красный цвет обводки рамки:

image291

19.3.2. Иконки в сообщениях

  • TessaMessageBox - цвета для иконок в сообщениях.

    • MessageBoxImageErrorBrush - Цвет заливки для иконки с ошибкой в окне сообщения.

    • MessageBoxImageInformationBrush - Цвет заливки для иконки с информацией в окне сообщения.

    • MessageBoxImageQuestionBrush - Цвет заливки для иконки с вопросом в окне сообщения.

    • MessageBoxImageWarningBrush - Цвет заливки для иконки с предупреждением в окне сообщения.

Например, красный цвет иконки в сообщении с вопросом:

image292

19.3.3. Таблица в представлении

  • GridView - цвета для отображения данных в представлении (таблицы).

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • GridViewForeground - Цвет текста GridView. (1)

    • GridViewDisabledForeground - Цвет текста GridView, когда он недоступен. Используется не во всех таблицах.

    • GridViewBackground - Фоновый цвет GridView. (2)

    • GridViewBorderBrush - Цвет обводки колонок и ячеек GridView.(3)

    • GridViewHighlightBrush - Цвет выделения колонок и ячеек GridView. (4)

    • GridViewHeaderBackground - Фоновый цвет заголовков GridView. (5)

    • GridViewHeaderGripperBrush - Цвет разделителя между заголовками колонок GridView. (6)

image306

Например, красный цвет обводки колонок и ячеек:

image293

19.3.4. Вкладки карточки

  • TabControl - цвета вкладок в карточке.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • TabControlBorderBrush - Цвет обводки TabControl. (1)

    • TabControlBackground - Фоновый цвет TabControl. (2)

    • TabControlCardBackground - Фоновый цвет TabControl в карточке. (3)

    • TabControlSelectedBackground - Фоновый цвет выбранной вкладки TabControl. (4)

    • TabControlHighlightBackground - Фоновый цвет вкладки TabControl, на которую наведена мышь. (5)

image294

19.3.5. Область вкладок

  • DocumentTabControl - цвета для области вкладок.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • DocumentTabControlBorderBrush - Цвет рамки для области вкладок. (1)

    • DocumentTabControlForeground - Цвет текста и изображений для заголовков вкладок. (2)

    • DocumentTabControlBackground - Фоновый цвет заголовков для вкладок. (3)

    • DocumentTabControlSeparatorLeft - Цвет разделителя между заголовками колонок для вкладок. (4)

    • DocumentTabControlSeparatorRight - Цвет разделителя между заголовками колонок для вкладок. (5)

    • DocumentTabControlHighlightBrush - Полупрозрачный фон, который накладывается на обычный фон для той вкладки, которая сейчас выбрана. (6)

image295

19.3.6. Карточка

  • Cards - цвета в карточке.

    • CardControlCaption - Кисть, используемая блоком для отрисовки заголовков его элементов управления.

      Например, красный цвет:

      image296
    • CardDialogBackground - Кисть, используемая в качестве фона для просмотра диалоговых окон с формой карточки (например, в окне с подробностями по строке в истории заданий карточки; в диалоге импорта и создания по шаблону из библиотеки; в окне редактирования номера из контролов нумератора; в окне ввода логина/пароля и т.п.).

      Например, светло-красный цвет фона:

      image297
    • CardDisabledBackground - Фоновый цвет редактируемых элементов управления, отображаемый при значении свойства IsEnabled = false.

      Например, светло-красный цвет фона для полей, не доступных для редактирования:

      image298
    • CardEditorBackground - Кисть, используемая в качестве фона для просмотра диалоговых окон с редактором дополнительных настроек. Используется в TessaAdmin для некоторых диалогов в редакторе типов карточек, например, фон для окна маппинга в ссылочных контролах.

    • CardVisualizerBackground - Кисть, используемая в качестве фона для окна визуализации бизнес-процессов карточки.

    • CardPreviewBackground - Кисть, используемая в качестве фона для окна предварительного просмотра карточки в TessaAdmin.

    • CardRowBackground - Кисть, используемая в качестве фона для окна просмотра строки коллекционной или древовидной секции.

      Например, светло-красный цвет фона в окне добавления новой строки в таблицу:

      image299
    • CardStatusBarForeground - Цвет, используемый для вывода текста в статусной строке в карточке.

      Например, красный цвет текста:

      image300
    • CardStatusBarForegroundHover - Цвет, используемый для вывода текста в статусной строке в карточке в ситуации, когда мышь находится над статусной строкой.

    • CardStatusBarBackground - Цвет, используемый для вывода фона в статусной строке в карточке.

    • CardStatusBarBackgroundHover - Цвет, используемый для вывода фона в статусной строке в карточке в ситуации, когда мышь находится над статусной строкой.

    • CardBlockCaptionBackgroundNormal - Цвет, используемый для фона заголовка блока в обычном состоянии.

      Например, светло-красный цвет фона заголовка блока:

      image301
    • CardBlockCaptionBackgroundHover - Цвет, используемый для фона заголовка блока в ситуации, когда мышь находится над заголовком блока.

    • CardBlockCaptionBackgroundPressed - Цвет, используемый для фона заголовка блока в ситуации, когда производится нажатие на данный заголовок блока.

    • CardBlockCaptionBorderBrushNormal - Цвет, используемый для отрисовки границы заголовка блока в обычном состоянии.

    • CardBlockCaptionBorderBrushHover - Цвет, используемый для отрисовки границы заголовка блока в ситуации, когда мышь находится над заголовком блока.

    • CardBlockCaptionBorderBrushPressed - Цвет, используемый для отрисовки границы заголовка блока в ситуации, когда производится нажатие на данный заголовок блока.

19.3.7. Задание

  • Tasks - цвета для области задания.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • TaskBackground - Цвет, используемый как фоновый цвет заданий. (1)

    • TaskBorderBrush - Цвет рамки блока с заданием. (2)

    • TaskForeground - Цвет текста для вывода общей информации по заданию. (3)

    • TaskSeparatorForeground - Кисть, используемая для вывода полоски-разделителя в информации по заданию. (4)

    • TaskLinkForeground - Кисть, используемая для вывода ссылки на задание. (5)

    • TaskTypeForeground - Кисть, используемая для вывода типа задания. (6)

    • TaskTypeAccessoryForeground - Кисть, используемая для вывода вспомогательного текста в задании. (7)

      image302
    • TaskTypeToggleForeground - Цвет, используемый для вывода текста для переключателя заданий ("полосы" под областью с заданием).

      Например, красный цвет текста:

      image303
    • TaskTypeToggleForegroundHover - Цвет, используемый для вывода текста для переключателя заданий ("полосы" под областью с заданием) в ситуации, когда мышь находится над переключателем.

    • TaskTypeToggleForegroundPressed - Цвет, используемый для вывода текста для переключателя заданий ("полосы" под областью с заданием) в ситуации, когда переключатель был нажат, и кнопка мыши ещё не отпущена.

    • TaskTypeToggleBackground - Цвет, используемый для вывода фона для переключателя заданий ("полосы" под областью с заданием).

    • TaskTypeToggleBackgroundHover - Цвет, используемый для вывода фона для переключателя заданий ("полосы" под областью с заданием) в ситуации, когда мышь находится над переключателем.

    • TaskTypeToggleBackgroundPressed - Цвет, используемый для вывода фона для переключателя заданий ("полосы" под областью с заданием) в ситуации, когда переключатель был нажат, и кнопка мыши ещё не отпущена.

    • TaskButtonForeground - Кисть, используемая для вывода текста в кнопках в заданиях.

      Например, красный цвет текста:

      image304
    • TaskButtonBackground - Цвет, используемый для вывода фона в кнопках в заданиях, когда мышь не находится в области с заданием.

    • TaskButtonBackgroundHover - Цвет, используемый для вывода фона для кнопок в заданиях в ситуации, когда мышь находится над кнопкой.

    • TaskButtonBackgroundPressed - Цвет, используемый для вывода фона для кнопок в заданиях в ситуации, когда кнопка задания нажата, и кнопка мыши ещё не отпущена.

    • TaskButtonBackgroundWorkspaceHover - Цвет, используемый для вывода фона в кнопках в заданиях, когда мышь находится в области с заданием, но не над кнопкой.

    • TaskTagBackground - Цвет, используемый для вывода фона в иконке-теге в заданиях, когда мышь не находится над иконкой.

      Например, красный цвет фона:

      image305
    • TaskTagBackgroundHover - Цвет, используемый для вывода фона в иконке-теге в заданиях, когда мышь находится над иконкой.

    • TaskTagBackgroundPressed - Цвет, используемый для вывода фона в иконке-теге в заданиях, когда нажата кнопка мыши на иконке.

19.3.8. Секция файлов

  • Files - цвета для секции файлов.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • FileListBackground - Кисть, используемая в качестве фона списка файлов, когда в секции есть загруженные файлы (по умолчанию - белое полотно). (1)

    • FileVersionsBackground - Кисть, используемая в качестве фона для окна просмотра версий файла.

    • FileGroupBackground - Цвет, используемый для заливки разделителей-групп в файлах и кнопки загрузки файлов. (2)

    • FileGroupBackgroundHover - Цвет, используемый для заливки при наведении мыши на разделители-группы в файлах и кнопки загрузки файлов.

    • FileGroupBackgroundPressed - Цвет, используемый для заливки разделителей-групп в файлах и кнопки загрузки файлов при нажатии мыши.

    • FileBackground - Цвет, используемый для фона в файлах. (3)

    • FileBusyBackground - Цвет, используемый для фона в файлах при индикации загрузки. Цвет используется совместно со стандартным <see cref="FileBackground"/>.

    • FileModifiedBackground - Кисть, используемая для фона изменённых файлов.

    • FileNotReadyBackground - Цвет, используемый для фона файлов, не загруженных на сервер.

    • FileErrorBackground - Цвет, используемый для фона файлов с ошибками.

    • FileCurrentTaskTagBackground - Кисть, используемая для фона тегов у файлов, принадлежащий текущему заданию. (4)

    • FileSignatureNotChecked - Кисть, используемая для вывода иконок для файлов и диалога подписей, если файл или подпись ещё не проверены. (5)

    • FileSignatureChecked - Кисть, используемая для вывода иконок для файлов и диалога подписей, если файл или подпись успешно проверены.

    • FileSignatureFailed - Кисть, используемая для вывода иконок для файлов и диалога подписей, если файл или подпись проверены с ошибками.

      image307
    • FilePlaceholderBackground - Кисть, используемая для вывода фона в плейсхолдере файлового контрола. Плейсхолдер отображается при отсутствии файлов.

    • FilePlaceholderForeground - Кисть, используемая для вывода текста в плейсхолдере файлового контрола. Плейсхолдер отображается при отсутствии файлов.

      Например, красный цвет текста:

      image308

19.3.9. Боковые панели

  • Tiles - цвета для боковых панелей.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • TileForeground - Кисть, используемая для отрисовки цвета содержимого в боковых панелях. (1)

    • TileBackground - Кисть, используемая для отрисовки цвета фона в боковых панелях. (2)

    • TileHoverBackground - Кисть, используемая для отрисовки цвета фона для кнопки в боковых панелях. (3)

    • TileDividerBrush - Кисть, используемая для отрисовки разделителя в боковых панелях. (4)

    • TileSliderForeground - Кисть, используемая для отрисовки цвета линий в нераскрытой боковой панели. (5)

    • TileSliderBackground - Кисть, используемая для отрисовки цвета фона в нераскрытой боковой панели. (6)

image309

19.3.10. Представление

  • Views - цвета для области пейджинга, фильтрации, показа кол-ва строк в области представления.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • ViewFilterMenuBackground - Цвет, используемый для отрисовки всплывающих кнопок в области фильтра представления. Цвет должен быть непрозрачным. (1)

    • ViewFilterMenuForeground - Кисть, используемая для отрисовки линий и текста во всплывающих кнопках в области фильтра представления. (2)

    • ViewFilterAreaBackground - Кисть, используемая для отрисовки фона в области фильтра представления. (3)

    • ViewFilterAreaBorderBrush - Кисть, используемая для отрисовки цвета рамки в области фильтра представления. (4)

    • ViewFilterParameterForeground - Кисть, используемая для отрисовки текста с именем параметра фильтрации в области фильтра представления. (5)

    • ViewFilterOperatorForeground - Кисть, используемая для отрисовки текста с названием оператора фильтрации в области фильтра представления. (6)

    • ViewFilterValueForeground - Кисть, используемая для отрисовки текста со значением параметра фильтрации в области фильтра представления. (7)

      image310
    • ViewToolbarBackground - Кисть, используемая для отрисовки фона в панели тулбара представлений (панель с пейджингом). (8)

    • ViewToolbarBorderBrush - Кисть, используемая для отрисовки цвета обводки в панели тулбара представлений (панель с пейджингом). (9)

    • ViewToolbarButtonBrush - Кисть, используемая для отрисовки цвета кнопок в панели тулбара представлений (панель с пейджингом). (10)

    • ViewToolbarButtonDisabledBrush - Кисть, используемая для отрисовки цвета недоступных кнопок в панели тулбара представлений (панель с пейджингом). (11)

    • ViewToolbarQuickSearchForeground - Кисть, используемая для отрисовки цвета текста в области быстрого ввода в панели тулбара представлений (панель с пейджингом). (12)

    • ViewToolbarQuickSearchWatermark - Кисть, используемая для отрисовки цвета текста надписи-подсказки для быстрого ввода в панели тулбара представлений (панель с пейджингом).

    • ViewToolbarQuickSearchBackground - Кисть, используемая для отрисовки фона области быстрого ввода в панели тулбара представлений (панель с пейджингом). (13)

    • ViewToolbarPagingForeground - Кисть, используемая для отрисовки изменяемого номера страницы в панели пейджинга. (14)

    • ViewToolbarPagingWatermark - Кисть, используемая для отрисовки общего количества страниц в панели пейджинга. (15)

    • ViewToolbarPagingBackground - Кисть, используемая для отрисовки фона в панели пейджинга. (16)

    • ViewToolbarPagingBorderBrush - Кисть, используемая для отрисовки цвета обводки в панели пейджинга. (17)

      image311
    • ViewDialogSelectButtonBackground - Кисть, используемая для отрисовки цвета фона кнопки выборки из представления в панели тулбара представлений.

      Кнопка с изображением галочки отображается при заполнении коллекционных полей путем выбора из представления:

      image314
    • ViewRowCountForeground - Кисть, используемая для отрисовки цвета текста в области с количеством строк под представлением. (18)

    • ViewRowCountHoverForeground - Кисть, используемая для отрисовки цвета текста в области с количеством строк под представлением при наведении мыши на область.

    • ViewRowCountBackground - Кисть, используемая для отрисовки цвета фона в области с количеством строк под представлением. (19)

    • ViewRowCountHoverBackground - Кисть, используемая для отрисовки цвета фона в области с количеством строк под представлением при наведении мыши на область.

      image312

19.3.11. Дерево представлений

  • WorkplaceTree - цвета для области дерева представлений.

    После описания некоторых параметров в скобочках указан номер, которым обозначен данный участок на изображении ниже.

    • WorkplaceTreeForeground - Кисть, используемая для отрисовки содержимого в дереве рабочего места. (1)

    • WorkplaceTreeExpanderForeground - Кисть, используемая для отрисовки значков +/- в дереве рабочего места. (2)

    • WorkplaceTreeIconForeground - Кисть, используемая для отрисовки содержимого, связанного с иконками, в дереве рабочего места. (3)

    • WorkplaceTreeSubsetForeground - Кисть, используемая для отрисовки названий сабсетов в дереве рабочего места. (4)

    • WorkplaceTreeBackground - Кисть, используемая для отрисовки фона в дереве рабочего места. (5)

    • WorkplaceTreeVerticalOffsetBrush - Цвет, используемый для отрисовки полоски в верхней части дерева рабочего места. (6)

    • WorkplaceTreeMenuBackground - Цвет, используемый для отрисовки меню, связанных с рабочими местами, например, контекстное меню добавления сабсета. Цвет должен быть непрозрачным. (7)

    • WorkplaceTreeMenuForeground - Кисть, используемая для отрисовки текста в меню, связанных с рабочими местами, например, контекстное меню добавления сабсета. (8)

    • WorkplaceTreeExtraBackground - Цвет, используемый для наложения фона при раскрытии узлов дерева рабочего места. Цвет должен быть непрозрачным. (9)

    • WorkplaceTreeHightlightBrush - Цвет, используемый для отображения выделения для узла дерева, в т.ч. при наведении мыши.

    • WorkplaceTreeSelectedBrush - Цвет, используемый для отображения выбранного узла дерева. (10)

      image313

20. Описание пользовательского интерфейса и функций рабочего места Tessa Admin

Функции, доступные пользователю на рабочем месте TessaAdmin, разделены на пять разделов:

  • Рабочие места;

  • Представления;

  • Схема;

  • Локализация;

  • Карточки.

Разделы расположены на панели навигации в левой части окна.

image2

21. Раздел "Схема"

Раздел предназначен для просмотра и редактирования схемы данных.

Перед внесением каких-либо изменений в схему сделайте резервную копию базы данных, а также убедитесь, что пользователи сейчас не работают с системой.

Схема данных представлена в виде дерева.

В отдельных ветвях содержатся пользовательские Таблицы, Процедуры, Функции, Миграции и Библиотеки.

image3

Каждая из этих ветвей содержит объекты соответствующего типа (таблицы/ процедуры/ функции/ миграции/ библиотеки), разделенные на группы (группа задается в свойстве "Группа" самого объекта).

Изначально объект не входит ни в одну группу.

image4

Действия, доступные через контекстное меню (вызывается щелчком правой кнопкой мыши по элементу дерева):

Действие Команда в контекстном меню

Добавить колонку в выделенную таблицу

Добавить физическую колонку

Добавить ссылочную колонку

Добавить комплексную колонку

Добавить первичный ключ

Добавить первичный ключ

Добавить уникальный ключ

Добавить уникальный ключ

Добавить индекс

Добавить индекс

Добавить таблицу

Добавить таблицу

Добавить миграцию

Добавить миграцию

Добавить хранимую процедуру

Добавить хранимую процедуру

Добавить функцию

Добавить функцию

Удалить выделенный объект

Удалить

Сохранить изменения в схеме данных

Сочетание клавиш Ctrl+S

Поиск какого-либо объекта можно выполнить, введя часть названия в поисковое поле:

image4 1

21.1. Импорт схемы данных/библиотеки из файла

Для того, чтобы импортировать ("накатить") новую схему данных из файлов, нажмите кнопку Импорт - Файл схемы…​

image179

Появится диалог выбора основного файла структуры БД. Такой файл имеет расширение *.tsd и обычно называется tessa.tsd. Выбираем файл, откроется окно с информацией по связанным со схемой библиотекам:

image179 1

Нажав на Х слева от названия библиотеки её можно исключить из импортируемой схемы. Для подключения дополнительной библиотеки надо нажать на соответствующую кнопку и в файловой системе выбрать файл библиотеки, имеющий расширение *.tsp.

После нажатия на кнопку ОК система определит, есть ли в новой схеме БД и текущей отличия и покажет диалог со списком отличий.

image180

Нажмите кнопку "Сохранить". Система начнет применять изменения одно за другим. Применяемое изменение подсвечивается желтым. Успешно примененное изменение подсвечивается зеленым цветом. Дождитесь выполнения всех шагов и нажмите кнопку "Закрыть".

image181
Если при обновлении произошла ошибка, то применение изменений останавливается, и ошибочный шаг подсвечивается красным. Двойной клик по этому шагу покажет диалог с детальным описанием ошибки.

Если требуется к текущей схеме данных импортировать библиотеку, нажмите кнопку Импорт - Файл библиотеки…​ Появится диалог выбора файла библиотеки *.tsp. Выберите нужный файл и далее система выдаст список изменений, которые будут внесены в схему данных, для подтверждения сохранения нажать "Сохранить".

21.2. Сохранение схемы данных

После внесения каких-либо изменений для сохранения схемы непосредственно в базу данных необходимо нажать на Сохранить всё:

image4 2

В появившемся диалоговом окне будет отображен список изменений, для сохранения нажмите "Сохранить":

image4 3

В случае, если изменений в схеме данных не будет найдено, в диалоговом окне будет выведено соответствующее сообщение:

image4 4

21.3. Создание таблиц

Для создания таблицы вызовите контекстное меню (щелкнув правой кнопкой мыши по узлу Таблицы) и выберите пункт "Добавить таблицу":

image5

Найдите новую таблицу. Она создалась с именем Table в разделе (без группы):

image6

Задайте параметры таблицы:

  • Название – название таблицы (название таблицы используется при создании карточек и представлений, поэтому нежелательно его будет изменять в дальнейшем);

  • Группа – группа таблицы нужна для удобства работы со схемой данных (таблица будет отображаться в другой группе сразу после изменения поля);

  • Описание – описание таблицы;

  • Библиотека - библиотека, в которой будет храниться данная таблица, по умолчанию - Default;

  • Используется для типа - тип объекта, с которым ассоциированы данные в создаваемой таблице. Указывается в зависимости от типа объекта системы, для которого предназначена таблица

    • Не указан – тип не определён;

    • Карточки;

    • Задания;

    • Файлы;

  • Тип секции – тип данных, хранимых в таблице

    • Перечисление;

    • Строковая – одиночные записи. На один объект (карточка, задание и т.п.) одна запись в таблице;

    • Коллекционная – коллекционные записи. На один объект может приходиться несколько записей в таблице;

    • Иерархическая – иерархические записи. Тоже самое, что и коллекционные, но с поддержкой иерархии записей;

  • Виртуальная – является ли таблица виртуальной.

Для упрощения процесса обновления на новые версии платформы крайне желательно все объекты схемы данных (такие как таблицы, колонки и т.п.), добавляемые и изменяемые в рамках проектного решения, сохранять в отдельной библиотеке. Подробнее библиотеки рассмотрены в разделе Создание библиотек.

Добавьте в таблицу необходимые колонки, ключи и индексы. Для этого вызовите контекстное меню (кликнув по таблице правой кнопкой мыши) и выберите нужный пункт, либо используйте горячие клавиши (см. выше).

После того, как настройка таблицы будет завершена, необходимо её сохранить. Для сохранения нажмите "Ctrl+S", затем в появившемся диалоговом окне со списком изменений нажмите "Сохранить":

image7

21.3.1. Пример создания таблицы для хранения значений перечисления

Данная таблица нужна для хранения списка записей, из которых потом в поле карточки пользователь сможет выбрать какую-либо одну.

Шаг 1: Создайте таблицу с Используется для типа - Не указан и Тип секции - Перечисление:

image8

Шаг 2: Добавьте в таблицу колонку с первичным ключом (ID), колонку с названием элементов перечисления и другие необходимые поля:

image9

Шаг 3: Добавьте в таблицу первичный ключ (в данном примере ключевое поле – ID):

image11

Чтобы задать ключевое поле, в разделе Индексируемые колонки из выпадающего списка выберите нужное поле и далее нажмите на кнопку +.

Шаг 4: Сохраните созданную таблицу с помощью сочетания клавиш "Ctrl+S":

image7

Шаг 5: Заполните значения перечисления в разделе "Записи":

image13

Добавление записи: заполните поочерёдно пустые поля (необходимо выделить поле левой кнопкой мыши и ввести значение) и нажмите "Enter".

Удаление записи: выделите строку (щелчком левой кнопки мыши по полю записи) и нажмите "Delete".

Шаг 6: Сохраните добавленные записи с помощью сочетания клавиш "Ctrl+S":

image14

21.3.2. Пример создания поля со ссылкой на поле другой таблицы

Данный тип поля позволит хранить в таблице ссылку на другую таблицу (справочник, перечисление, список объектов, и др.).

Добавьте новую комплексную колонку в таблицу, задайте для нее Тип - Reference(Typified).

Из выпадающего списка выберите таблицу ("Ссылка на таблицу"), на которую должно ссылаться поле.

image15

Сохраните изменения с помощью сочетания клавиш "Ctrl+S".

21.3.3. Пример создания автоинкрементной колонки

Данная настройка позволяет создавать автоинкрементные колонки, значения для которых определяются СУБД автоматически. Для них возможно задать начальное значение и шаг, с которым выделяются следующие значения. Если в настройках колонки эти значения не заданы, то используются значения по умолчанию (1 для начального значения и 1 для шага). Отрицательные значения шага позволяют сделать убывающий список.

image15 5

Для создания автоинкрементной колонки для таблицы должны быть выполнены следующие условия:

  • Колонка должна иметь целочисленный тип;

  • Тип колонки должен быть Not Null;

  • У колонки не должно быть задано значение по умолчанию;

  • Таблица не должна иметь "Записей" в схеме данных;

Для СУБД MSSQL для одной таблицы может быть создана только одна автоинкрементная колонка.

При указании настройки "Автоинкрементная колонка" или изменении ее настроек для созданной колонки с таблицей, в которой есть данные, следует учитывать, что поведение будет различно для разных СУБД:

  • MSSQL: все данные колонки затрутся и заполнятся новыми, в соответствии с настройками автоинкремента;

  • Postgres: данные колонки сохранятся, однако взятие следующего значения будет производиться с начала (начальное значение);

В случае, если данная колонка использовалась как первичный ключ или по ней настроен уникальный индекс, изменение/установка автоинкремента для колонки может привести к ошибкам при добавлении значений в данную строку.

21.4. Создание библиотек

Библиотеки могут использоваться для разработки изолированных решений и далее подключаться к основной схеме данных.

Для упрощения процесса обновления на новые версии платформы крайне желательно все объекты схемы данных (такие как таблицы, колонки и т.п.), добавляемые и изменяемые в рамках проектного решения, сохранять в отдельной библиотеке.

Библиотека хранится отдельно от основной схемы и описывает:

  • Новые таблицы (с колонками, ключами, индексами и записями);

  • Новые колонки в таблицах основной схемы;

  • Новые индексы в таблицах основной схемы;

  • Новые ограничения (constraints) в таблицах основной схемы;

  • Новые предопределенные строки в таблицах-перечислениях основной схемы;

  • Новые миграции;

  • Новые функции;

  • Новые процедуры.

Создать новую библиотеку можно с помощью контекстного меню на узле Библиотеки:

image15 1

Для новой библиотеки указываем уникальное название и описание (при необходимости).

image15 2

Далее мы можем выполнить перенос каких-либо объектов в данную библиотеку: таблицы, колонки, записи, функции и т.д.:

image15 3

После внесения изменений схему данных необходимо сохранить.

Все объекты, добавляемые и изменяемые в библиотеке, сохраняются в отдельную подпапку с именем библиотеки внутри папки "Partitions". Это позволяет изолированно обновлять или переносить библиотеку между разными версиями платформы и проектными решениями.

Посмотреть все объекты схемы, относящиеся к какой-либо библиотеке можно с помощью специального фильтра, расположенного в верхней части окна. После выбора в выпадающем списке библиотеки в дереве будут отображены только те объекты, которые относятся к данной библиотеке:

image15 4

22. Раздел "Представления"

Раздел предназначен для создания, импорта, экспорта, редактирования, отладки и просмотра представлений.

Список представлений находится в левой части раздела и содержит фильтр для поиска по названию:

image16

Над списком представлений располагается панель инструментов. Она содержит кнопки для выполнения действий со списком:

image17 - обновить все представления (считать данные из базы);

image18 - создать новое представление;

image19 - удалить выбранное представление;

image20 - сохранить выбранное представление;

image21 - сохранить всё;

image22 - импорт представлений;

image23 - экспорт представлений.

Режимы отображения выбранного представления также расположены на панели инструментов:

image24 - редактирование представления;

image25 - отладка представления;

image26 - просмотр представления;

image27 - настройка прав доступа.

22.1. Создание и редактирование представления

Для создания представления нажмите кнопку image18 на панели инструментов.

Новое представление появится внизу списка:

image29

Выделите его и перейдите в режим редактирования:

image24

Задайте параметры представления:

Название поля Описание

Алиас

Название представления, которое будет отображаться в списке представлений, а также будет использоваться в настройке карточек (в связи с этим Alias не желательно менять в дальнейшем).

Имя

Имя, которое будет задаваться по умолчанию на рабочих местах пользователей.

Группа

Группа (папка) в которой в дереве будет отображаться данное представление.

Метаданные

Код, отвечающий за отображение результатов запроса и за возможности представления.

Запрос

Код для формирования запроса, который будет получать данные для представления из базы.

Описание

Описание представления.

image30

Сохраните представление, нажав кнопку image20 "Сохранить", а затем проверьте в режиме просмотра: image26.

Чтобы представлением могли пользоваться обычные сотрудники (не входящие в группу администраторов), необходимо также настроить доступ на вкладке image27.

Поля "Запрос" и "Метаданные" поддерживают сочетание клавиш "Ctrl+Space", вызывающее контекстное меню, из которого можно выбрать и вставить в текст шаблоны стандартных грамматических конструкций.
Более подробно о написании представлений можно прочесть в руководстве разработчика.

22.2. Экспорт представлений

Чтобы сохранить представления на диск нужно воспользоваться кнопкой image23.

В открывшемся диалоге выберите папку, в которую надо сохранить файлы представлений, нажав на кнопку image33.

Затем отметьте галочкой представления, которые требуется экспортировать (для поиска нужных представлений в списке можно воспользоваться фильтром в верхней части окна):

image34

После нажатия кнопки "Выполнить" представления будут сохранены в указанную папку.

При выборе опции "Очистить папку от файлов" перед экспортом представлений все файлы целевой папки будут удалены. Таким образом, после экспорта папка будет содержать только выбранные к экспорту представления.

22.3. Импорт представлений

Чтобы загрузить в систему представления нужно воспользоваться кнопкой image22.

В открывшемся диалоге выберите папку, в которой находятся файлы загружаемых представлений, нажав на кнопку image33.

Затем отметьте галочкой представления, которые требуется загрузить:

image36

После нажатия кнопки "Выполнить" представления будут загружены в систему.

При выборе опции "Удалить перед импортом все представления из базы данных" перед импортом все представления в системе будут удалены. Таким образом, после импорта в системе будут содержаться только выбранные к импорту представления.
При выборе опции "Заменить разрешения в базе данных" у обновляемых представлений будут очищены указанные в представлении роли и указаны роли, содержащиеся в импортируемом представлении.

22.4. Настройка доступа к представлениям

На вкладке "Роли" представления можно указать роли, которые будут иметь доступ к данному представлению. Можно указывать любые роли, кроме контекстных. Если сотрудник не имеет доступа к представлению - он не увидит его в рабочем месте и не сможет с ним работать, где бы оно не использовалось - например, при выборе значения при помощи автодополнения.

image182

Представление - это источник данных. Оно может использоваться в рабочих местах, в режиме отбора, в расширениях, в прямом обращении к веб-сервисам в пределах сессии определённого сотрудника.

Список ролей в представлении ограничивает доступ к представлению везде. Ограничение доступа означает, что клиентское приложение не знает ничего о этом представлении, ни о его метаинформации, ни о том факте, что оно вообще существует и при попытке запросить данные этого представления с сервера получит ошибку. Так работает серверная безопасность.

Если все сотрудники могут выбирать данные из этого представления, то в списке ролей должна быть роль "Все сотрудники". То, где и как пользователи выбирают данные, способ получения этих данных, уже не имеет отношения к безопасности. Раз пользователь выбирает данные, то он имеет к ним доступ, может их посмотреть и скопировать. Единственный способ ограничить набор данных, который видит пользователь, имеющий доступ к представлению - это фильтровать выборку с использованием параметра CurrentUserID непосредственно на сервере.

23. Раздел "Карточки"

В данном разделе можно создавать, редактировать и просматривать типы карточек, типы карточек заданий и типы карточек файлов:

image37

Действия, доступные для корневых элементов списка карточек (например, через контекстное меню, которое можно вызвать правой кнопкой мыши):

Действие Сочетание клавиш Команда в контекстном меню

Создание типа карточки

Ctrl+Shift+C

Добавить тип карточки

Создание типа файла

Ctrl+Shift+F

Добавить тип файла

Создание типа задания

Ctrl+Shift+T

Добавить тип задания

Обновить список

F5

Обновить

Действия, доступные для карточек:

Действие Сочетание клавиш Команда в контекстном меню

Добавить форму (только для заданий)

Ctrl+Shift+M

Добавить форму

Добавить настройки завершения

(только для заданий)

Ctrl+Shift+O

Добавить настройки завершения

Добавить валидатор

Добавить валидатор

Добавить расширение

Добавить расширение

Скопировать тип

Alt+C

Создать копию типа

Удалить

Del

Удалить

23.1. Создание нового типа карточки

Чтобы создать новый тип карточки воспользуйтесь пунктом контекстного меню "Создать тип карточки" или сочетанием клавиш "Ctrl+Shift+C".

Новая или измененная карточка выделяется в списке жирным шрифтом. Типы карточек/файлов/задач сгруппированы аналогично таблицам.

Выделите созданную карточку:

image38

Задайте нужные настройки.

Название Описание

Имя

Название типа карточки, которое будет отображаться в списке

Заголовок

Название типа карточки, которое будет отображаться пользователю

Группа

Группа, к которой принадлежит карточка

Формат дайджеста

Определяет строку форматирования для дайджеста карточки, т.е. для названия, используемого в заголовке вкладки, истории действий и т.д. Для использования полей карточки доступна стандартная система плейсхолдеров (см. Использование плейсхолдеров). Наведя курсор на поле можно посмотреть всплывающую подсказку с примером. Если поле не заполнено - вычисление дайджеста выполняется стандартным образом (например, это номер карточки, если она включена в типовое решение и в ней присутствует секция с номером)

Идентификатор типа

Идентификатор типа карточки. С помощью кнопок, расположенных справа от поля можно скопировать идентификатор типа или скопировать идентификатор типа и имя для использования в расширениях

Административный

Карточки этого типа доступны только администраторам

Скрытый

Скрывать/показывать карточки этого типа

Разрешить задания

Возможность выдавать задания по карточке

Фиксировать действия

Признак того, что любые действия с карточкой фиксируются в истории действий

Удалять в корзину

Удалять с использованием возможности восстановления

Единственный экземпляр

Карточка этого типа существует в единственном экземпляре

Загружать при инициализации

Признак того, что карточка, существующая в единственном экземпляре, будет загружена и добавлена в кэш на клиенте в процессе загрузки приложения Tessa Client

Перейдите к выбору секций типа карточки:

image39

Справа отобразится список таблиц. Вам необходимо выбрать в этом списке поля, которые будут выводиться в форму (поля с данными карточки, и поля со ссылками на строки других таблиц).

image40

Перейдите к настройке Вкладок типа карточки:

image41

Справа отобразится интерфейс для редактирования формы карточки.

Форма карточки разделена на вкладки, в которых расположены блоки, в которых, в свою очередь, расположены элементы интерфейса (контролы: поля карточки, таблицы и т.п.).

Форма карточки всегда имеет как минимум одну вкладку и создаётся с ней.

image42

Чтобы добавить ещё одну вкладку, необходимо нажать на вкладку с иконкой "+". Так же можно вставить ранее скопированную вкладку см. раздел: Копирование элементов карточки.

Чтобы добавить на вкладку блок нажмите кнопку добавления элемента:

image43

Выделите добавленный блок, чтобы отобразить редактор свойств и списка полей блока.

image44

Свойства блока:

Название Описание

Заголовок

Название блока, которое будет отображаться на форме

Алиас

Системное имя

Количество колонок

Максимальное количество полей на одной строке

Вертикальный интервал между контролами

Вертикальный интервал между полями блока

Горизонтальный интервал между контролами

Горизонтальный интервал между полями блока

Не оптимизировать колонки

Признак того, что при указании единственной колонки в настройках блок выводится без оптимизации.

Скрывать блок

Скрывать блок целиком

Свёрнут по умолчанию

Блок при открытии карточки по умолчанию будет свёрнут

Не сворачивать с верхним блоком

Признак того, следует ли сворачивать текущий блок при сворачивании блока, расположенного над ним. Актуально, если у блока скрыт заголовок. Если у блока заголовок не скрыт, то не зависимо от этого флага блок не будет сворачиваться при сворачивании верхнего блока.

Скрывать заголовок

Скрывать заголовок блока на форме

Добавьте в карточку необходимые поля.

Для этого необходимо в редакторе блока выбрать тип поля и нажать кнопку добавления элемента.

После добавления поля выберите его в списке и в появившейся справа области задайте необходимые параметры (примеры настройки полей разного типа смотрите ниже).

Чтобы проверить правильность настройки формы, нажмите кнопку "Показать".

После того, как все поля будут добавлены, нажмите кнопку "Сохранить все" над списком типов карточек, чтобы сохранить созданный тип.

Так же можно копировать и вставлять блоки и контролы см. раздел: Копирование элементов карточки.

23.1.1. Создание текстового поля

Выберите созданное поле и задайте требующиеся настройки:

image45
image46
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Поля карточки

Нажмите , чтобы выбрать поля в таблице БД, значение которых требуется отображать в поле карточки.

Формат поля

Пока не реализовано

Всплывающая подсказка

Всплывающая подсказка для поля

Поле не заполнено

Текст всплывающей подсказки при незаполненном обязательном поле

Минимум строк

Минимальное количество занимаемых строк

Максимум строк

Максимальное количество строк, на которое можно расширить поле

Максимальная длина

Максимальное количество символов (укажите значение, соответствующее типу выбранного поля БД)

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Тип

Тип текстового редактора. Позволяет включить текстовый редактор с подсветкой синтаксиса

Настройки типа

Показывает окно с дополнительными настройками выбранного типа редактора

Отметить как обязательное

Отметить поле как обязательное для заполнение

Перенос по словам

Разрешить перенос по словам

Скрывать поле

Сделать поле скрытым

Только для чтения

Поле недоступно для редактирования

Скрытое поле

Скрыть поле

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

23.1.2. Создание в карточке ссылочного поля

Ссылочные поля служат для хранения ссылки на поле таблицы БД.

Данный тип необходим, если в карточке должна быть возможность выбрать сотрудника/ карточку/ значение перечисления и т.п. Выберите тип "Ссылка" и нажмите кнопку добавления элемента.

image48
image49
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Поля карточки

Нажмите , чтобы выбрать поле в таблице БД, которое содержит ссылку на поле другой таблицы

Формат поля

Формат выводимого значения. Используется стандартные правила форматирования строк с применением специальных указателей для размещения колонок комплексной колонки. Например: "{0}, - {1}". Номера в указателях указываются в порядке следования физических колонок.

Всплывающая подсказка

Текст всплывающей подсказки поля

Поле не заполнено

Текст всплывающей подсказки при незаполненном обязательном поле

Поле для ручного ввода

Поле карточки для хранения текста, введенного вручную. Поле должно находиться внутри комплексной референсной колонки

Алиас представления

Алиас представления (записей таблицы, на которую ссылается поле)

Алиас параметра

Алиас параметра представления

RefSection

Параметр позволяет вывести только те представления, у которых есть #Reference с RefSection соответствующим значению параметра

Алиас представления выпадающего списка

Алиас представления (записей таблицы, на которую ссылается поле) в режиме работы, как выпадающий список

Префикс референса

Алиас префикса для определения используемого референса, предоставляемого представлениями

Маппинг представления

Настройки маппинга представления указанного в параметре "Алиас представления"

Максимальное отображаемое количество результатов

Максимальное отображаемое количество результатов, выводимых в popup’е

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Настройки popup’а

Отображает диалоговое окно с настройками выпадающего popup’а

Выпадающий список

Работать в режиме выпадающего списка

Отметить как обязательное

Отметить поле как обязательное для заполнение

Разрешить открывать ссылки

Разрешить открывать ссылки из контрола

Разрешить ручной ввод

Позволяет ввести значение, которое не указано в справочнике

Скрывать кнопку выбора

Скрывать кнопку "…​"

Скрывать поле

Скрыть поле, чтобы потом его можно было отобразить в расширениях

Только для чтения

Поле недоступно для редактирования

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

Настройка маппинга представления:

image50

При помощи этого окна (доступно при клике по трём точкам в поле "Маппинг представления") можно настраивать фильтрацию представления указанного в параметре "Алиас представления" на основе данных о карточке.

Каждое условие маппинга добавляется как параметр запроса к представлению указанного в параметре "Алиас представления" и содержит следующие настройки:

Название Описание

Тип поля

Тип поля для маппинга: Поле карточки; Идентификатор карточки; Тип карточки; Имя типа карточки; Текущий пользователь.

Параметр представления

Имя параметра представления, на которое осуществляется маппинг

Поле карточки

Поле карточки. Доступно только, если выбран тип поля – "Поле карточки"

Настройки popup’а:

image51
Название Описание

Ширина popup’а

Максимальная ширина popup’а в процентном соотношении от ширины экрана.

Элементы popup’а

Список номеров полей представления, через запятую, которые будут отображаться в окне с вариантами подстановки для каждого элемента.

Соотношение ширин колонок popup’а

Соотношение ширин колонок popup’а в обычном режиме при превышении максимальной ширины popup’а в процентном соотношении от ширины экрана.

Элементы popup’а выпадающего списка

Список номеров полей представления, через запятую, которые будут отображаться в окне с вариантами подстановки для каждого элемента, при работе в режиме выпадающего списка.

Соотношение ширин колонок popup’а выпадающего списка

Соотношение ширин колонок popup’а в режиме "Выпадающий список" при превышении максимальной ширины popup’а в процентном соотношении от ширины экрана.

Если ссылочный контрол связан с секцией, у которой нет первичного ключа, то ключом ссылки считается первая физическая колонка внутри комплексной колонки, на которую настроен контрол.
Механизм выбора референса представлений в контроле работает по принципу приоритета настроек. Наивысший приоритет имеет настройка "RefSection". Если указан "RefSection", то контрол будет искать в представлении первый референс с указанным "RefSection". Если "RefSection" не указан, далее по приоритету следует настройка "Префикс референса", и выбирается референс, у которого "ColPrefix" соответствует указанному "Префиксу референса". А если обе предыдущие настройки не указаны, то используется первый референс, у которого в списке секций есть секция, на которую ссылается комплексная колонка контрола.
Если в контроле не задан формат отображения и не найдено ни одного текстового поля в комплексной колонке, то контрол отображает значение “[EMPTY]”. Если есть поле для отображения, но представление не предоставило необходимых данных, то в контроле отображается “[NULL]”.
При очистке поля со ссылкой, можно очищать связанные поля при помощи карточного расширения на "Очистку связанных полей". См. пункт Очистка связанных полей

23.1.3. Добавление в карточку таблицы

Данные табличного типа должны храниться в виде записей отдельной таблицы БД.

Для добавления таблицы на форму выберите тип "Таблица" и нажмите кнопку добавления элемента.

image53
image54
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Секция карточки

Нажмите , чтобы выбрать таблицу БД, в которой хранятся записи

Поле для сортировки

Поле, в котором хранится порядок строк

Всплывающая подсказка

Всплывающая подсказка таблицы

Разрешить мультивыбор

Разрешить мультивыбор строк

Скрывать поле

Скрыть поле

Только для чтения

Поле недоступно для редактирования

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнитель

Дополнительные настройки отображения таблицы

Колонки и форма

Редактирование колонок и формы таблицы

Нажмите кнопку "Колонки и форма" чтобы открыть редактор для настройки вывода данных в таблицу.

На вкладке "Колонки" добавьте отображаемые поля выбранной таблицы. Для добавления поля нажмите кнопку добавления элемента. Выделите добавленную колонку и задайте нужные параметры:

Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Поля строки

Нажмите , чтобы выбрать поля таблицы

Поля в дочерних строках

Поле для сортировки дочерних строк

Агрегация дочерних строк

Дополнительная обработка списка дочерних строк. Более подробная информация в всплывающей подсказке на поле

Разделитель для дочерних строк

Разделитель между элементами дочерних строк. Более подробная информация в всплывающей подсказке на поле

Формат колонки

Формат поля. См. Строки стандартного формата

Выравнивание

Способ выравнивание текста в колонке

Скрытая колонка

Скрыть поле

Игнорировать часовой пояс

Не разрывать строки

Признак того, что контент ячеек в колонке выводится как неразрывные строки

image55

После добавления колонок перейдите на вкладку "Форма" для настройки формы, с помощью которой пользователь будет редактировать данные строки таблицы.

Форма настраивается аналогично настройке формы карточки.

image56

23.1.4. Создание поля "Вещественное число"

Выберите созданное поле и задайте требующиеся настройки:

image57
image58
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Поля карточки

Нажмите , чтобы выбрать поля в таблице БД, значение которых требуется отображать в поле карточки

Формат поля

Пока не реализовано

Всплывающая подсказка

Текст всплывающей подсказки поля

Поле не заполнено

Текст всплывающей подсказки при незаполненном обязательном поле

Минимальное значение

Минимальное значение, которое принимает поле. Можно использовать алиас “min” (без кавычек) для задания минимального возможного системного значения

Максимальное значение

Максимальное значение, которое принимает поле. Можно использовать алиас “max” (без кавычек) для задания максимального возможного системного значения

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Отметить как обязательное

Отметить данное поле как обязательное для заполнения

Скрывать поле

Скрыть поле

Только для чтения

Поле недоступно для редактирования

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

дополнительно

Дополнительные настройки отображения поля

23.1.5. Создание поля с вкладками

Выберите созданное поле и задайте требующиеся настройки:

image59
image60
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Всплывающая подсказка

Текст всплывающей подсказки

Скрывать поле

Скрывать поле

Скрывать заголовок

Скрывать заголовок

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения

Вкладки

Редактор вкладок

Нажмите кнопку "Вкладки" чтобы открыть редактор для настройки вкладок. Редактор вкладок идентичен редактору вкладок основного окна.

image61

23.1.6. Создание поля "Дата и время"

Выберите созданное поле и задайте требующиеся настройки:

image62
image63
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Поля карточки

Нажмите , чтобы выбрать поля в таблице БД, значение которых требуется отображать в поле карточки.

Формат поля

Пока не реализовано

Всплывающая подсказка

Текст всплывающей подсказки поля

Поле не заполнено

Текст всплывающей подсказки при незаполненном обязательном поле

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Время

Возможность редактировать время

Дата

Возможность редактировать дату

Игнорировать часовой пояс

Игнорировать часовой пояс пользователя

Отметить как обязательное

Отметить поле как обязательное для заполнения

Разрешить пустое значение

Разрешать оставлять поле пустым

Скрывать поле

Скрыть поле

Только для чтения

Поле недоступно для редактирования

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

23.1.7. Создание поля "Десятичное число"

Выберите созданное поле и задайте требующиеся настройки:

image64
image65
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Поля карточки

Нажмите , чтобы выбрать поля в таблице БД, значение которых требуется отображать в поле карточки.

Формат поля

Пока не реализовано

Всплывающая подсказка

Текст всплывающей подсказки поля

Поле не заполнено

Текст всплывающей подсказки при незаполненном обязательном поле

Минимальное значение

Минимальное значение, которое принимает поле. Можно использовать алиас “min” (без кавычек) для задания минимального возможного системного значения

Максимальное значение

Максимальное значение, которое принимает поле. Можно использовать алиас “max” (без кавычек) для задания максимального возможного системного значения

Знаков после запятой

Количество используемых знаков после запятой

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Отметить как обязательное

Отметить поле как обязательное для заполнения

Скрывать поле

Скрыть поле

Только для чтения

Поле недоступно для редактирования

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

23.1.8. Создание поля "Кнопка"

Выберите созданное поле и задайте требующиеся настройки:

image66
image67
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Всплывающая подсказка

Текст всплывающей подсказки кнопки

Текст

Текст кнопки

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Скрывать поле

Скрыть поле

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

23.1.9. Создание поля "Список"

Выберите созданное поле и задайте требующиеся настройки:

image68
image69
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Всплывающая подсказка

Текст всплывающей подсказки

Поле не заполнено

Текст всплывающей подсказки при незаполненном обязательном поле

Поля карточки

Нажмите , чтобы выбрать поля в таблице БД, значение которых требуется отображать в поле карточки

Поля для сортировки

Поле, в котором хранится порядок записей

Формат поля

Формат выводимого значения. Используется стандартные правила форматирования строк с применением специальных указателей для размещения колонок комплексной колонки. Например: "{0}, - {1}". Номера в указателях указываются в порядке следования физических колонок.

Поле для ручного ввода

Поле карточки для хранения текста, введенного вручную. Поле должно находиться внутри комплексной референсной колонки

Алиас представления

Алиас представления (записей таблицы, на которую ссылается поле)

Алиас параметра

Алиас параметра представления

RefSection

Параметр позволяет вывести только те представления, у которых есть #Reference с RefSection соответствующим значению параметра.

Префикс референса

Алиас префикса для определения используемого референса, предоставляемого представлениями.

Маппинг представления

Настройки маппинга представления, указанного в параметре "Алиас представления".

Максимальное отображаемое количество результатов

Максимальное отображаемое количество результатов, выводимых в popup’е.

Цвет текста

Цвет вводимого текста

Стиль текста

Стиль вводимого текста

Настройки popup’а

Отображает диалоговое окно с настройками выпадающего popup’а

Отметить как обязательное

Отметить поле как обязательное для заполнения

Перенос строк

Разрешить перенос строк

Разрешить открывать ссылки

Разрешить открывать ссылки из контрола

Разрешить ручной ввод

Разрешить ввод в поле произвольного значения

Скрывать кнопку выбора

Скрывать кнопку "…​"

Скрывать поле

Скрыть поле, чтобы его можно было показать в расширениях

Только для чтения

Поле недоступно для редактирования

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

Настройка маппинга представления:

image50

При помощи этого окна (доступно при клике по трём точкам в поле "Маппинг представления") можно настраивать фильтрацию представления, указанного в параметре "Алиас представления" на основе данных о карточке.

Каждое условие маппинга добавляется как параметр запроса к представлению, указанного в параметре "Алиас представления" и содержит следующие настройки:

Название Описание

Тип поля

Тип поля для маппинга: Поле карточки; Идентификатор карточки; Тип карточки; Имя типа карточки; Текущий пользователь.

Параметр представления

Имя параметра представления, на которое осуществляется маппинг

Поле карточки

Поле карточки. Доступно только, если выбран тип поля – "Поле карточки"

Настройки popup’а:

image70
Название Описание

Ширина popup’а

Максимальная ширина popup’а в процентном соотношении от ширины экрана.

Элементы popup’а

Список номеров полей представления, через запятую, которые будут отображаться в окне с вариантами подстановки для каждого элемента.

Соотношение ширин колонок popup’а

Соотношение ширин колонок popup’а в обычном режиме при превышении максимальной ширины popup’а в процентном соотношении от ширины экрана.

Если ссылочный контрол связан с секцией, у которой нет первичного ключа, то ключом ссылки считается первая физическая колонка внутри комплексной колонки, на которую настроен контрол.
Если в контроле не задан формат отображения и не найдено ни одного текстового поля в комплексной колонке, то контрол отображает значение “[EMPTY]”. Если есть поле для отображения, но представление не предоставило необходимых данных, то в контроле отображается “[NULL]”.
Механизм выбора референса представлений в контроле работает по принципу приоритета настроек. Наивысший приоритет имеет настройка "RefSection". Если указан "RefSection", то контрол будет искать в представлении первый референс с указанным "RefSection". Если "RefSection" не указан, далее по приоритету следует настройка "Префикс референса", и выбирается референс, у которого "ColPrefix" соответствует указанному "Префиксу референса". А если обе предыдущие настройки не указаны, то используется первый референс, у которого в списке секций есть секция, на которую ссылается комплексная колонка контрола.

23.1.10. Создание списка файлов

Выберите созданное поле и задайте требующиеся настройки:

image71
image72
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Всплывающая подсказка

Текст всплывающей подсказки

Сортировка

Тип выбранной сортировки по умолчанию.

Name - для сортировки по имени;

Size - для сортировки по размеру;

Modified - для сортировки по дате изменения;

Направление сортировки

Направление выбранной сортировки

Настройки группировки

Наличие и признак свёрнутости и развёрнутости для группировки по умолчанию.

Группировка

Type для группировки по типу;

Category для группировки по категории;

Copy для группировки по копии;

Представление категорий

Представление из которого получаются используемые категории.

Маппинг представления

Настройки маппинга представления категорий.

Запретить добавлять категории

Запрещает ручной ввод категории в диалоге выбора категорий

Запретить файлы без категории

Запрещает добавлять файлов без категорий в окне выбора категорий

Использовать категории

Разрешить функционал категорий для данного списка файлов.

Скрывать поле

Скрыть поле

Сохранять порядок категорий

Сохраняет порядок следования категорий из представления в диалоге выбора категорий

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

Настройка маппинга представления:

image50

При помощи этого окна (доступно при клике по трём точкам в поле "Маппинг представления") можно настраивать фильтрацию представления категорий на основе данных о карточке.

Каждое условие маппинга добавляется как параметр запроса к представлению категорий и содержит следующие настройки:

Название Описание

Тип поля

Тип поля для маппинга: Поле карточки; Идентификатор карточки; Тип карточки; Имя типа карточки; Текущий пользователь.

Параметр представления

Имя параметра представления, на которое осуществляется маппинг

Поле карточки

Поле карточки. Доступно только, если выбран тип поля – "Поле карточки"

23.1.11. Создание поля отображения текста

Выберите созданное поле и задайте требующиеся настройки:

image73
image74
Название Описание

Заголовок

Название поля, которое будет отображаться на форме

Алиас

Системное имя

Поля карточки

Нажмите , чтобы выбрать поля в таблице БД, значение которых требуется отображать в поле карточки.

Формат поля

Пока не реализовано

Всплывающая подсказка

Текст всплывающей подсказки

Цвет текста

Цвет отображаемого текста

Стиль текста

Стиль шрифта отображаемого текста

Граница и фон

Настройки границы и фона текстового поля

Скрывать поле

Скрыть поле

Скрывать заголовок

Скрыть заголовок на форме

Растянуть по ширине

Растянуть поле по всей ширине вне зависимости от количества колонок в блоке

Дополнительно

Дополнительные настройки отображения поля

Настройки границы и фона:

image75
Название

Цвет фона

Цвет фона отображаемого текста

Толщина рамки

Толщина рамки вокруг отображаемого текста

Радиус скругления

Радиус скругления рамки

Цвет рамки

Цвет рамки

Внутренний отступ

Отступ отображаемого текста от рамки

23.1.12. Создание поля метка

Выберите созданное поле и задайте требующиеся настройки:

image76
image77
Название Описание

Заголовок

Название поля, которое будет отображаться на форме