Атрибут типа «Документ». Скачивание архива с файлами из таблицы и записи


Введение

Comindware Business Application Platform позволяет прикрепить любые файлы к атрибуту типа «Документ». При этом, если к атрибуту прикреплено несколько файлов, на форме и в таблице каждый файл приходится скачивать отдельно.

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

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

Здесь представлен пример настройки кнопки, скачивающей файлы из выбранных записей в таблице. Кроме того, на форме эта кнопка будет скачивать файлы, прикреплённые к атрибуту типа «Документ» в текущей записи.

Прикладная задача

Имеется шаблон «Реестр документов», в котором хранятся файлы. Каждый документ может содержать несколько файлов.

В записи шаблона «Заявка» можно указать документы из «Реестра документов».

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

Настройка кнопки для скачивания файлов

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

  1. Создайте шаблон записи «Реестр документов».
  2. Создайте следующие атрибуты:

    Название Тип данных Свойства
    Наименование Текст  
    Вложения Документ Хранить несколько значений: флажок установлен
    Использовать для поиска записей: флажок установлен

    Внимание!

    Для корректного скачивания файлов с помощью C#-скрипта у атрибута типа «Документ» рекомендуется установить флажок «Использовать для поиска записей». В противном случае скрипт может не сработать.

  3. Создайте кнопку «Скачать вложения» со следующими свойствами:

    • Контекст операции: запись;
    • Операция: С# скрипт;
    • Результат выполнения: скачать документ.
  4. На вкладке «Скрипт» добавьте следующий C#-скрипт:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Comindware.Data.Entity;
    using Comindware.TeamNetwork.Api.Data.UserCommands;
    using Comindware.TeamNetwork.Api.Data;
    using System.IO;
    using System.IO.Compression;
    class Script
    {
    public static UserCommandResult Main(UserCommandContext userCommandContext, Comindware.Entities entities)
    {
    // ObjectIds — массив выбранных записей, полученный из контекста операции кнопки.
    var selected_Ids = userCommandContext.ObjectIds;
    // Создаем массив compressedBytes для хранения архива с файлами.
    byte[] compressedBytes;
    try
    {
    // Vlozheniya — системное имя атрибута «Вложения» шаблона записи «Реестр документов».
    // Помещаем в массив data значения атрибутов «Вложения» из выбранных записей.
    // Создаём поток resultStream для архива
    var data = Api.TeamNetwork.ObjectService.GetPropertyValues(selected_Ids, new[] { "Vlozheniya" });
    using (var resultStream = new MemoryStream())
    {
    using (var zip = new ZipArchive(resultStream, ZipArchiveMode.Update))
    {
    foreach (var id in selected_Ids)
    { // Присваиваем переменной doc_Obj значение атрибута «Вложения».
    if (data[id].TryGetValue("Vlozheniya", out object doc_Obj) && doc_Obj != null)
    {
    // Файлы из атрибута «Вложения» помещаем в массив doc_Array.
    // Проверяем, что количество файлов больше 0.
    var doc_Array = doc_Obj as object[];
    if(doc_Array.Length > 0)
    {
    // Каждый файл в массиве doc_Array преобразуем в строку Base64
    // и помещаем в архив fileInArchive.
    foreach(var doc in doc_Array)
    {
    var documentData = Api.TeamNetwork.DocumentService.GetContent(doc.ToString());
    var startStream = new MemoryStream();
    startStream.Write(documentData.Data, 0, documentData.Data.Length);
    startStream.Seek(0, SeekOrigin.Begin);
    var fileInArchive = zip.CreateEntry(documentData.Name, CompressionLevel.Optimal);
    using (var entryStream = fileInArchive.Open())
    {
    startStream.CopyTo(entryStream);
    }
    }
    }
    }
    }
    }
    // Помещаем поток с результирующим архивом в массив content.
    compressedBytes = resultStream.ToArray();
    }
    var memStream = new MemoryStream(compressedBytes);
    var content = memStream.ToArray();
    // Заполняем объект resulterr, который возвращает операция кнопки.
    var resulterr = new UserCommandResult
    {
    Success = true,
    Commited = true,
    // Собираем файл архива с именем ZipedFiles.zip и содержимым из массива content.
    // Этот файл скачает браузер после нажатия кнопки.
    File = new UserCommandFileResult()
    {
    Content = content,
    Name = "ZipedFiles.zip"
    },
    // Формируем сообщение об успешном выполнении операции кнопки.
    Messages = new[]
    {
    new UserCommandMessage
    { Severity = SeverityLevel.Normal,
    Text = "Успешно"
    }
    } };
    return resulterr;
    } // Обрабатываем любые ошибки
    catch
    {
    var resulterr = new UserCommandResult
    {
    Success = false,
    Commited = true,
    ResultType = UserCommandResultType.Notificate,
    Messages = new[]
    {
    new UserCommandMessage
    {
    Severity = SeverityLevel.Normal,
    Text = "Ошибка"
    }
    }
    };
    return resulterr;
    }
    }
    }
  5. Поместите атрибуты «Наименование» и «Вложения» в таблицу «Все записи» и на форму шаблона «Реестр документов».
  6. Поместите кнопку «Скачать вложения» в таблицу «Все записи» шаблона «Реестр документов».
  7. В шаблоне записи «Заявка» создайте атрибут:
    Название Тип данных Свойства
    Документы Запись

    Связанный шаблон: Реестр документов

    Хранить несколько значений: флажок установлен

  8. Поместите на форму шаблона «Заявка» атрибут «Документы» и настройте его представление в виде таблицы.

  9. Поместите в таблицу «Документы» на форме атрибуты «Наименование» и «Вложения» шаблона записи «Реестр документов».
  10. В область кнопок таблицы «Документы» поместите кнопки «Создать» и «Скачать вложения».

Тестирование

  1. Создайте новую запись шаблона «Заявка» и добавьте несколько строк с документами в таблицу «Документы».
  2. Выберите строки для скачивания документов и нажмите кнопку «Скачать вложения».
  3. Браузер скачает архив с файлами, прикреплёнными к выбранным записям.

    Примечание

    Если в браузере отобразится сообщение «Незащищенное скачивание заблокировано», нажмите кнопку «Сохранить», чтобы продолжить скачивание.

  4. Перейдите к таблице «Все записи» шаблона «Реестр документов».

  5. Выберите записи, из которых следует скачать вложения, и нажмите кнопку «Скачать вложения».
  6. Браузер скачает архив с файлами из выбранных записей.
  7. Откройте любую запись шаблона «Реестр документов» и нажмите кнопку «Скачать вложения».
  8. Браузер скачает архив с файлами, прикреплёнными к записи.

    Отображение кнопки «Скачать вложения» в таблице записей шаблона «Реестр документов»

    Отображение кнопки «Скачать вложения» в таблице записей шаблона «Реестр документов»

Связанные статьи

Атрибут типа «Документ»

Кнопки. Определение, настройка, удаление

Написание скриптов на языке C#

К началу



Номер Статьи: 2623
Размещено: Wed, Jul 24, 2024
Последнее обновление: Thu, Aug 1, 2024

Online URL: https://kb.comindware.ru/article/atribut-tipa-dokument-skachivanie-arhiva-s-fajlami-iz-tablicy-i-zapisi-2623.html