Копировать ссылку на страницу

Постановка задачи:

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

Необходимо организовать автоматический ввод документов из такого сетевого каталога в систему DIRECTUM.

Решение:

Нужно создать собственный сценарий занесения документов в систему DIRECTUM. В данном случае устройством, поставляющим документы, будет файловая система. Сценарий будет вызываться службами ввода при поступлении очередного документа в каталог какого-либо сотрудника. Сценарий будет импортировать документ в систему DIRECTUM, задавать тип карточки, вид документа и отправлять задачу сотруднику, ответственному за подкаталог.

Сценарию необходимо передавать параметры:

EDocKind – код заданного вида документа в справочнике Виды документов;
EDocCardType – имя типа карточки документа в компоненте Типы карточек документов;
FilePath – путь к подкаталогу сотрудника.

Код вида документа и имя типа карточки удобнее задавать через справочник Параметры запуска компонент. Подробнее см. описание компоненты «Параметры запуска компонент».

Чтобы передать параметры сценарию:

1.Создайте запись в справочнике Параметры запуска компонент.
2.В созданной записи справочника укажите значения параметров.
3.В командной строке вызова сценария укажите код созданной записи.

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

Подробнее о передаче параметров в сценарий см. описание компоненты «Дополнительные параметры вариантов запуска».

Свернуть/развернуть пример Пример

// Имя служебного файла, содержащего имена файлов для занесения

// в систему DIRECTUM.

INPUT_FILES_PARAM_NAME = "InputFiles.xml"

// Метаинформация о документе, заносимом в систему.

INSTANCE_INFO_PARAM_NAME = "InstanceInfos.xml"

// Получить параметры сценария из справочника Параметры запуска компонент.

ListParams = GetComponentLaunchParams()

EDocKind = ListParams.ValueByName('EDocKind')

EDocCardType = ListParams.ValueByName('EDocCardType')

// Получить путь к подпапке сотрудника.

ScriptParams = Object.Params

FilePath = ScriptParams.ValueByName('FilePath')

FilePath = IncludeTrailingPathDelimiter(FilePath)

// Получить имена файлов для занесения в систему.

InputFilesXml = CreateObject("MSXML.DOMDocument")

InputFilesXml.Load(FilePath & INPUT_FILES_PARAM_NAME)

InputFilesElements = InputFilesXml.selectNodes("//Files/FileInfo")

// Получить имена файлов для занесения в систему.

InstanceInfoXml = CreateObject("MSXML.DOMDocument")

InstanceInfoXml.Load(FilePath & INSTANCE_INFO_PARAM_NAME)

InstanceInfoXmlElements = InstanceInfoXml.selectNodes("//Files/FileInfo")

// Проверить наличие файлов для обработки.

InputFilesElementCount = InputFilesElements.length

if InputFilesElementCount == 0

  // "Не найдены файлы для занесения в систему".

  ExceptMessage = LoadString("DIR826B95C6_6B05_42F5_88F3_39D67AFF16D1"; "COMMON")

  Raise(CreateException("EDIRFileNotFound"; ExceptMessage; ecException))

endif

// Обработать полученные файлы.

InputFilesElementIndex = 0

while InputFilesElementIndex < InputFilesElementCount

  InputFilesElement = InputFilesElements.item(InputFilesElementIndex)

  CapturedFileName = InputFilesElement.selectSingleNode("FileName").text

  // Получить имя пользователя из InstanceInfos.xml.

  InstanceInfoXmlElement = InstanceInfoXmlElements.item(InputFilesElementIndex)

  OriginalFileName = InstanceInfoXmlElement.selectSingleNode("FileName").text

  // Определить параметры создания нового документа в DIRECTUM.

  CapturedFileExt = ExtractFileDriveDirNameExt(CapturedFileName; "E")

  EditorCode = GetEditorCodeByExtension(CapturedFileExt)

  // Создать новый документ из файла.

  EDocument = EDocuments.CreateNewFromFile(EDocCardType; EDocKind; EditorCode; FilePath & CapturedFileName)

  // В имя документа записать имя файла.

  EDocument.SYSREQ_EDOC_NAME = ExtractFileDriveDirNameExt(OriginalFileName; "N")

  EDocument.Save

  // Изменить примечание "Импортировано из файла %s".

  NewNote = LoadStringFmt("DIRA7FF8238_7096_4D7F_AE61_376884A4455E"; "COMMON"; ExtractFileDriveDirNameExt(OriginalFileName; "N"))

  EDocument.Versions.Values(EDocument.Versions.Count - 1).Note = NewNote

  // Получить имя пользователя, совпадающее с именем папки из полного пути к файлу.

  UserName = SubString(OriginalFileName; '\'; SubStringCount(OriginalFileName; '\') - 1) 

  try

    User = ServiceFactory.GetUserByName(UserName)

    except

    // Уведомление системному пользователю, если имя папки не совпадает ни с одним именем пользователя в системе.

    Role = ServiceFactory.GetRoleByName("ОтветственныйЗаИмпортИзDCTSCapture") 

    RoleMembers = ServiceFactory.GetRoleMembers(Role; nil)

    if RoleMembers.Count > 0

      User = RoleMembers.Value

    else

      // Если в роли нет исполнителей.

      User = ServiceFactory.GetUserByName("Administrator")

    endif

    TaskForNotice = Tasks.CreateNew()

    // Заполнить этап маршрута.

    TaskForNoticeRouteStep = Tasks.CreateRouteStep(1; User; jkJob; Today(); ""; "")

    TaskForNotice.Route.Add(TaskForNoticeRouteStep)

    TaskForNotice.Subject = "DCTS: при обработке файла '" & CapturedFileName & "' не удалось получить пользователя по имени '" & UserName & "'."

    AttachList = TaskForNotice.GetAttachments(TRUE)

    AttachList.Add(EDocument.Info)

    TaskForNotice.Start

  endexcept

// Если пользователь не определен, то не создавать задачу.

  if not ExceptionExists()

    // Отправить документ вложением в задачу сотруднику,

    // ответственному за подпапку.

    TaskForEDocProcess = Tasks.CreateNew()

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

    AttachmentList = TaskForEDocProcess.GetAttachments(TRUE)

    AttachmentList.Add(EDocument.Info)

    // Заполнить этап маршрута.

    FinalDate = ChangeDate("D"; Today(); 1)

    RouteStep = Tasks.CreateRouteStep(1; User; jkJob; FinalDate; ""; "")

    TaskForEDocProcess.Route.Add(RouteStep)

    TaskForEDocProcess.Subject = "Из папки пользователя '" & UserName & "' в систему занесен новый файл '" &  ExtractFileDriveDirNameExt(OriginalFileName; "N") & "'."

    TaskForEDocProcess.Start()

  endif

  // Выдать полные права на документ исполнителю задания.

  AccessRights = EDocument.AccessRights

  DocWriters = AccessRights.Writers

  DocReaders = AccessRights.Readers

  DocManagers = AccessRights.Managers

  if not AccessRights.IsManager(User)

    IsWriter = AccessRights.IsWriter(User)

      if IsWriter

        DocWriters.Delete(User)

      endif

    IsReader = AccessRights.IsReader(User)

      if IsReader

        DocReaders.Delete(User) 

      endif

    DocManagers.Add(User)

  endif

  if EDocument.Modified

    EDocument.Save

  endif

  InputFilesElementIndex = InputFilesElementIndex + 1

endwhile

© 2016 Компания DIRECTUM Сообщество пользователей DIRECTUM