Skip to main content
Version: 51.0.0

Файлові атрибути

Інформація про файли​

Отримання даних​

Образ документа — отримати назву файла​

module.exports = {
loaded(event) {
const docFile = event.document.getNativeFileAttribute()
const fileName = docFile.fileInfo.fileName
console.log('Образ документа:', fileName)
}
}

Файловий атрибут — отримати назву файла​

module.exports = {
loaded(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
const fileName = docFile.fileInfo.fileName
console.log('Файловий атрибут:', fileName)
}
}

Додатки документа — Отримати назви всіх файлів​

Отримати назви всіх файлів (назви оригінальних файлів, origFileName).

module.exports = {
loaded(event) {
const docAttachments = event.document.getAttachments()
for (const attachment of docAttachments) {
console.log('Назва файла додатка:', attachment.fileInfo.origFileName)
}
}
}

Отримання інформації про завантажений файл (структура, розмір, назва)​

Оригінальний файл

module.exports = {
loaded(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
console.log('Дані про файл-оригінал', docFile.originalFileInfo)
}
}

Такий скрипт поверне:

Дані про файл-оригінал {size: 11603, fileName: "dfxAtc-original30000007001693288.docx", origFileName: "0676079818.docx", contentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}

Перетворений файл

module.exports = {
loaded(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
console.log('Кінцевий файл', docFile.fileInfo)
}
}

Такий скрипт поверне:

Кінцевий файл {size: 9234, fileName: "dfxAtc-attachment3000000700169327e.pdf", origFileName: "0676079818.pdf", contentType: "application/pdf"}

Підписи​

Виводиться список усіх підписантів​

module.exports = {
loaded(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
const signers = docFile.signatures.map(signature => signature.signer)
console.log(signers.join(', ') + ' підписали цей документ')
}
}

Виводиться список усіх підписантів та час підписання​

module.exports = {
loaded(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
console.log('Всі підписи', docFile.signatures)
}
}

Такий скрипт поверне:

  1. 0: {timeStamp: "2020-09-11 15:08:13", signer: "Чугай Роман Олександрович"}
  2. 1: {timeStamp: "2020-09-18 14:12:38", signer: "Нечипоренко Ірина Петрівна"}

Перевірка чи підписано файл​

isSigned

module.exports = {
loaded(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
const isSigned = docFile.isSigned

if (isSigned === true) {
event.document.setAttribute('Attrtext01', 'Файл підписаний')
} else {
event.document.setAttribute('Attrtext01', 'Файл не підписаний')
}
}
}

Підписи: Подія при підписанні​

Event: signed

Подія спрацьовує у момент підписання образу, файлового атрибута документа, файлового атрибута таблиці, колекції файлів, додатки документа. Завдяки події можна виконати певні дії під час підписання. Додатково можуть бути отримані дані про підпис та сам файл: Підписант, Час підписання, Файл, Ревізія (event.signature).

Для файлового атрибута​

(Attrfile22 код файлового атрибута)

module.exports = {
document_Attrfile22_signed(event) {
event.document.setAttribute('Attrtext01', 'Документ підписаний')
console.log('Документ підписаний')
console.log('Підписант:', event.signature.signer)
console.log('Час підписання:', event.signature.timeStamp)
console.log('Дані файла:', event.signature.file)
console.log('Номер ревізії:', event.signature.revision)
}
}

Для образа документа​

(docImage це образ документа)

module.exports = {
document_docImage_signed(event) {
console.log('Документ підписаний')
}
}

Для файлового атрибута таблиці​

(Attrfile22 файловий атрибут таблиці)

module.exports = {
documentItem_Attrfile22_signed(event) {
console.log('Документ підписаний')
}
}

Для атрибута колекція файлів​

module.exports = {
document_Collection_signed(event) {
console.log('Документ в колекції підписаний')
}
}

Підписи: Подія при видаленні підпису файла​

Event: signatureRemoved

Подія спрацьовує під час видалення підпису. Може бути застосований до образу документа, файлового атрибута документа, файлового атрибута таблиці, колекції документів, додатків документів. Завдяки події можна виконати певні дії під час видалення підпису. Додатково можуть бути отримані дані про підпис та сам файл: Підписант, Час підписання, Файл, Ревізія (event.signature)

Для файлового атрибута​

(Attrfile22 код файлового атрибута)

module.exports = {
document_Attrfile22_signatureRemoved(event) {
console.log('Підписант:', event.signature.signer)
console.log('Час підписання:', event.signature.timeStamp)
console.log('Дані файла:', event.signature.file)
console.log('Номер ревізії:', event.signature.revision)
}
}

Для атрибута колекція документів​

module.exports = {
document_Collection_signatureRemoved(event) {
console.log('Підписант:', event.signature.signer)
console.log('Час підписання:', event.signature.timeStamp)
console.log('Дані файла:', event.signature.file)
console.log('Номер ревізії:', event.signature.revision)
}
}

Версії файлів: Подія при створенні версії​

Event: versionCreated

Подія спрацьовує на момент створення версії образу, файлового атрибута документа, файлового атрибута таблиці. Завдяки події можна виконати певні дії під час створення версії. Додатково можуть бути отримані дані про версію та сам файл (event.version).

Для файлового атрибута​

(Attrfile22 код файлового атрибута)

module.exports = {
document_Attrfile22_versionCreated(event) {
console.log('Номер версії:', event.version.version)
console.log('Файл:', event.version.file.origName)
}
}

Для образа документа​

(docImage це образ документа)

module.exports = {
document_docImage_versionCreated(event) {
console.log('Номер версії:', event.version.version)
console.log('Файл:', event.version.file.origName)
}
}

Для файлового атрибута таблиці​

(Attrfile22 файловий атрибут таблиці)

module.exports = {
documentItem_Attrfile22_versionCreated(event) {
console.log('Номер версії:', event.version.version)
console.log('Файл:', event.version.file.origName)
}
}

Версії файлів: Подія при видаленні версії​

Event: versionRemoved

Подія спрацьовує на момент видалення версії образу, файлового атрибута документа, файлового атрибута таблиці. Завдяки події можна виконати певні дії під час видалення версії. Додатково можуть бути отримані дані про версію та сам файл (event.version).

Для файлового атрибута​

(Attrfile22 код файлового атрибута)

module.exports = {
document_Attrfile22_versionRemoved(event) {
console.log('Номер версії:', event.version.version)
console.log('Файл:', event.version.file.origName)
}
}

Для образа документа​

(docImage це образ документа)

module.exports = {
document_docImage_versionRemoved(event) {
console.log('Номер версії:', event.version.version)
console.log('Файл:', event.version.file.origName)
}
}

Для файлового атрибута таблиці​

(Attrfile22 файловий атрибут таблиці)

module.exports = {
documentItem_Attrfile22_versionRemoved(event) {
console.log('Номер версії:', event.version.version)
console.log('Файл:', event.version.file.origName)
}
}

Операції з файлами​

Базові операції​

Очищення файлового атрибута​

clearItem() В даному випадку при редагуванні атрибута Attrtext01 файловий атрибут Attrfile22_20Mb очищається.

module.exports = {
document_attributeChanged_Attrtext01(event) {
const docFile = event.document.getFileAttribute('Attrfile22_20Mb')
docFile.clearItem()
}
}

Додатки документа — видалення файла за умовою​

(description = file15032021)

module.exports = {
loaded(event) {
const docAttachments = event.document.getAttachments()
for (const attachment of docAttachments) {
if (attachment.description === 'file15032021') {
attachment.deleteItem()
}
}
}
}

Виклик кнопки дії в файлових атрибутах​

За допомогою конструкції event.form.getNodeControl(4).getButton('someCode').click() є можливість із скрипта імітувати натискання кнопок в файлових атрибутах. Може використовуватись для нативних та кастомних кнопок.

Приклад використання. В атрибуті відключена кнопка "Підписати". Підписання запускається перед виконанням дії за допомогою скрипту.

module.exports = {
action_beforeExecute_approve(event) {
event.form.getNodeControl(5).getButton('signDoc').click() // запускаємо підписання файла в атрибуті образ документа (5 = ID документа на формі), signDoc - код кнопки дії "Підписати"
}
}

Створення версії файлів перед виконанням кнопки дії​

module.exports = {
async action_beforeExecute_approve(event) {
for (const attach of event.document.getAttachments()) {
await attach.createVersion(false) // false = створення версій без очистки вмісту, true = з очисткою
}
}
}

Автоматичні дії​

Виконання дій файлового атрибута по події. Додавання файла/ підписання/ сканування/ завантаження/ генерація по шаблону.

Образ документа: якщо файл не підписаний — підписати після збереження​

При збереженні документа автоматично викликається функція підписання файлу.

module.exports = {
beforeSave(event) {
const file = event.document.getNativeFileAttribute()
if (file.fileInfo && !file.isSigned) {
event.cancelSave()
const fileAttributeNodeID = 8
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openSignWindow()
}
}
}

Файловий атрибут: якщо файл не підписаний — підписати після збереження​

module.exports = {
beforeSave(event) {
const file = event.document.getFileAttribute('a001')
if (file.fileInfo && !file.isSigned) {
event.cancelSave()
const fileAttributeNodeID = 9
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openSignWindow()
}
}
}

Файловий атрибут таблиці: якщо файл не підписаний — підписати після збереження​

module.exports = {
beforeSave(event) {
const file = event.documentItem.getFileAttribute('a001')
if (file.fileInfo && !file.isSigned) {
event.cancelSave()
const fileAttributeNodeID = 2
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openSignWindow()
}
}
}

Образ документа: якщо файл не заданий — сканувати документ​

При спробі збереження документа автоматично запускається сканування.

module.exports = {
beforeSave(event) {
const file = event.document.getNativeFileAttribute()
if (!file.fileInfo) {
event.cancelSave()
const fileAttributeNodeID = 8
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openScanWindow()
}
}
}

Образ документа: якщо файл не заданий — генерувати документ​

Якщо в образі документа файл не заданий, то при спробі збереження документа автоматично запускається генерація файлу за налаштованим шаблоном. Якщо шаблон не налаштований, метод нічого не робить.

module.exports = {
beforeSave(event) {
const file = event.document.getNativeFileAttribute()
if (!file.fileInfo) {
event.cancelSave()
const fileAttributeNodeID = 8
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.generateByTemplate()
}
}
}

Файловий атрибут таблиці: якщо файл не заданий — генерувати документ​

module.exports = {
beforeSave(event) {
const file = event.documentItem.getFileAttribute('a001')
if (!file.fileInfo) {
event.cancelSave()
const fileAttributeNodeID = 3
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openScanWindow()
}
}
}

Завантаження файлу з документа при збереженні документа​

module.exports = {
beforeSave(event) {
const file = event.document.getNativeFileAttribute()
if (file.fileInfo) {
const fileAttributeNodeID = 8
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.downloadFile()
}
}
}

Файловий атрибут таблиці: завантажити файл з документа при збереженні​

module.exports = {
beforeSave(event) {
const file = event.documentItem.getFileAttribute('Attrfile22_20Mb')
if (file.fileInfo) {
const fileAttributeNodeID = 3
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.downloadFile()
}
}
}

Образ документа: завантаження файлу з документа при збереженні​

При спробі збереження документа (якщо файл не заданий) з'являється форма для завантаження файлу.

module.exports = {
beforeSave(event) {
const file = event.document.getNativeFileAttribute()
if (!file.fileInfo) {
event.cancelSave()
const fileAttributeNodeID = 8
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openUploadFileWindow()
}
}
}

Образ документа: якщо затвердити завдання — підписати документ​

Якщо в образі файл заданий, то при спробі затвердження завдання буде виконано автоматичне підписання файлу.

module.exports = {
action_beforeExecute_approve(event) {
const file = event.document.getNativeFileAttribute()
if (file.fileInfo && !file.isSigned) {
const fileAttributeNodeID = 9
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openSignWindow()
}
}
}

Образ документа: якщо затвердити завдання — підписати документ (з вбудованим таймером)​

Вбудований таймер дає час на підпис.

module.exports = {
async action_beforeExecute_approve(event) {
const sleep = (mls) => new Promise(res => setTimeout(res, mls))
const timeout = 30000
const step = 3000
const file = event.document.getNativeFileAttribute()

if (file.fileInfo && !file.isSigned) {
event.skipStandardConfirmDialog() // Не показувати діалог підтвердження дії над завданням
const fileAttributeNodeID = 4
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.openSignWindow()
const fileupdate = event.document.getNativeFileAttribute()

// Повторна перевірка чи підписаний файл і цикл
let awaitedTime = 0
while (awaitedTime < timeout) {
if (fileupdate.isSigned) {
return
}
await sleep(step)
awaitedTime = awaitedTime + step
}
event.cancelAction()
}
}
}

Кастомні кнопки файлових атрибутів​

Додавання власних кнопок та дій по їх натисканню.

Приклад використання additionalActions​

У вказаному прикладі до Образу документа додається Кнопка і при натисканні в консоль виводиться інформація про файл.

AdditionalActions спрацьовує при відкритті, створенні документа, відповідно якщо що-небудь вказати відразу під additionalActions воно буде виконано при зазначених діях. Те, що написано всередині handler спрацьовує безпосередньо при натисканні кнопки.

module.exports = {
form_6_additionalActions(event) { // 6 - id атрибута. additionalActions - додавання кнопки
return [
{
code: 'button1', // Внутрішній код кнопки
label: 'Інформація про файл', // Підсвітка кнопки
icon: 'u-icon-bell', // Іконка кнопки. Можна брати приклади з Ярликів
handler() { // Подія при натисканні на кнопку
const docFile = event.document.getNativeFileAttribute() // Взяти інформацію про атрибут
const fileName = docFile.fileInfo.fileName
console.log('Образ документа:', fileName)
}
}
]
}
}

Приклад використання additionalActions, beforeAction​

У вказаному прикладі до Образу документа додається Кнопка і при її натисканні спочатку виконується перевірка файлу, і лише потім, коли перевірка пройдена виконується дія натискання на кнопку, в даному випадку - скачування файлу.

const { showErrorWindow } = require('@unitybase/ub-pub')

module.exports = {
form_6_additionalActions(event) {
return [
{
code: 'button2',
label: 'Вигрузити файл',
icon: 'fas fa-arrow-down',
handler() {
const fileAttributeNodeID = 6
const fileAttributeControl = event.form.getNodeControl(fileAttributeNodeID)
fileAttributeControl.downloadFile() // Вигрузка файла
}
}
]
},
form_6_beforeAction_button2(event) {
const fileAttr = event.document.getNativeFileAttribute()
if (!fileAttr.fileInfo) {
event.cancelAction()
showErrorWindow('Файл повинен бути завантажений')
return
}
if (!fileAttr.isSigned) {
event.cancelAction()
showErrorWindow('Файл повинен бути підписаний')
return
}
if (fileAttr.fileInfo.contentType !== 'application/pdf') {
event.cancelAction()
showErrorWindow('Файл повинен бути формату pdf')
}
}
}

Приклад використання additionalActions, actionExecuted​

У вказаному прикладі до Образу документа додається Кнопка і при її натисканні виконується процедура, якщо процедура виконалася і помилок немає, то виконуються дії після натискання кнопки: actionExecuted. Якщо процедура не виконалася, відбулися помилки, наприклад, то actionExecuted не буде виконано.

Наприклад: якщо написати вираз await UB.connection.query({entity: 'frm_Attribute', method: 'selectIsUsed', execParams: {ID: aaaaaaa}}), то при натисканні на кнопку буде помилка, і як наслідок actionExecuted виконано не буде.

const { connection } = require('@unitybase/ub-pub')

module.exports = {
form_6_additionalActions(event) {
return [
{
code: 'button3',
label: 'Вигрузити файл',
icon: 'fas fa-arrow-down',
async handler() {
await UB.connection.query({
entity: 'frm_Attribute',
method: 'selectIsUsed',
execParams: { ID: 12 }
})
}
}
]
},
form_6_actionExecuted_button3(event) {
const fileAttributeNodeID = 6
const fileControl = event.form.getNodeControl(fileAttributeNodeID)
fileControl.downloadFile()
}
}

Карусель або діалогове вікно для атрибута додатки документа/колекція файлів​

Для атрибута додатки документа/колекція файлів можливе додавання кнопок карусель або діалогове вікно. У прикладі додаємо кнопки, по натисканню виводимо повідомлення.

const { showErrorWindow } = require('@unitybase/ub-pub')

module.exports = {
form_4_additionalActions(event) { // 4 - ID атрибута додатків документів
return [
{
code: 'carousel',
label: 'Кастомний атрибут в карусели',
icon: 'u-icon-key',
handler() {
showErrorWindow('Натиснуто кнопку в карусели')
},
carousel: true
},
{
code: 'dialog',
label: 'Кастомний атрибут в діалоговому вікні',
icon: 'u-icon-close',
handler() {
showErrorWindow('Натиснуто кнопку в діалоговому вікні')
},
dialog: true,
availableInReadonlyMode: true
}
]
}
}

В цілому additionalActions використовується для того, щоб оголосити кнопку, а також виконати будь-які дії під час натискання кнопки. beforeAction використовується для того, щоб задати якісь умови, які повинні бути виконані до натискання кнопки, якщо умови не виконані, то відповідно дії при натисканні не виконуються. actionExecuted запускає виконання дій після натискання кнопки. Кнопка необов'язково задається за допомогою additionalActions, вона може бути задана програмним кодом, і тоді, наприклад, управління кнопкою зі скрипта виконується за допомогою beforeAction і actionExecuted.

Скрипт керує лише кастомними кнопками, заданими програмним кодом або за допомогою скрипту, і не керує стандартними кнопками.

Скрипт може бути застосований до Образу документа, Файлового атрибута документа, Файлового атрибута таблиці документа, атрибута колекція документа, атрибута додатків документів. Достатньо лише підставити відповідне id атрибута.