Специфический запрос: работаем с картинками в карточке

15 3

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

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

Начали!

Шаг первый. Справочник, новый элемент:

Шаг второй. Реквизиты:

Шаг третий. Оформляем карточку:

Ну как минимум, это не вызывает отторжения. 

Теперь разберемся более детально. В данной карточке работают поля:

1. Наименование: Строка, (Ручной ввод);

2. Наша Организация: Справочник, Автозаполнение с возможностью выбора;

3. Печать или Штамп: Признак, имеет 2 значения "Печать" или "Штамп";

4. Текущий владелец: Справочник,(Ручной ввод); 

5. Дата передачи: Дата, (Ручной ввод);

6. Поле для картинки: Тип Текст, выбирается через "Действие" вручную.

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

Итак - с карточкой все понятно. Теперь дело за "Действиями"! В моем примере их 3:

1. DelStamp - Удаление картинки

2. LoadStamp - Загрузка картинки

3. Уведомление - Задание сотруднику, что в его ответственности появился "штамп" или "печать"

Разбираем по порядку. Первым дело - Штамп надо загрузить (LoadStamp):

FileIsExistReqName = ''
//------------------------------------------------------------------------------
  JPG_FILE_EXT = 'jpg'
  DotWithJPGExt = Format(".%s"; JPG_FILE_EXT)
  OpenDialog = CreateOpenDialog()
  OpenDialog.Filter = Format('JPEG files (*.jpeg)|*%0:s'; DotWithJPGExt)
  OpenDialog.MultiSelect = False
  if OpenDialog.Execute
    File = OpenDialog.Result
  // Проверить расширение файла
    if ExtractFileExt(File) <<>> DotWithJPGExt
      Msg = LoadStringFmt('DIRSTR_782'; 'COMMON'; DotWithJPGExt)
      Raise(CreateException('EDIRInvalidParamType'; Msg; ecInformation))
    else
      if FileSize(File) > 512000 // Если больше 500 Кб, то сругаться
        Raise(CreateException(""; "Размер файла не должен превышать 500 Кб"; ecWarning))
      else
        Object.Requisites("FilePath").LoadFromFile(File)
        Object.Requisites("FilePath").Extension = JPG_FILE_EXT 
        if Assigned(FileIsExistReqName)
          Object.Requisites("FileIsExist").Value = YES_VALUE
        endif
      endif
    endif                   
  endif

Примечание: У файла есть ограничение на объем, чтобы не перегружать систему бессмысленной информацией, как правило Штампы или печати это только 5% от сканированного листа - ему много и не нужно.

Следующий этап - Удаление изображения (DelStamp):

  Object.Requisites("FilePath").Value = NULL
  Object.Requisites("Ссылка").Value = NULL
  Object.Events.DisableAll      
  Object.Save   
  Object.Events.EnableAll

Просто и эффективно.

Следующий и финальный этап - Уведомление Ответственного с обратной связью (Задачей то есть)!

if Assigned(Object.Employee)
    
    
    Attachments = CreateList()
      if not IsWebRuntimeContext() and not IsNOMADRuntimeContext()
        FilePath = Object.Requisites('FilePath').AsString
        if Assigned(FilePath)
           if VarIsNull(Object.Ссылка)
                  PicFilePathOrig = GetTempFolder() & 'Stamp_' & Object.SYSREQ_ID & '.' & Object.Requisites('FilePath').Extension 
                  Object.Requisites('FilePath').SaveToFile(PicFilePathOrig)
                  Doc = EDocuments.CreateNewFromFile('ПЭА';'Д000088';'JPG';PicFilePathOrig)
                  Object.Requisites('Ссылка').AsInteger = Doc.ID
                  Doc.Save
                  Docum = EDocuments.ObjectInfo(Doc.ID)    
                  Attachments.Add(Docum.Name; Docum)
                  УдалитьФайл(PicFilePathOrig)           
            else
                Docum = EDocuments.ObjectInfo(Object.Requisites("Ссылка").AsInteger)    
                Attachments.Add(Docum.Name; Docum)
            endif
        endif
      endif

    if Object.PechStm == 'Печать' 
        Theme = "Вам передана печать: " & Object.Requisites(SYSREQ_NAME).DisplayText
        Text = "Вам передана печать: " & Object.Requisites(SYSREQ_NAME).DisplayText & CR & "Образец Печати во вложении." 
    else
        Theme = "Вам передан штамп: " & Object.Requisites(SYSREQ_NAME).DisplayText
        Text = "Вам передан штамп: " & Object.Requisites(SYSREQ_NAME).DisplayText & CR & "Образец Штампа во вложении."
    endif
    
    try
        MainDocumentInfo = EDocuments.ObjectInfo(Doc.ID)
        EDoc =  MainDocumentInfo.Document
        User = ReferenceRequisiteValue("РАБ"; Object.Employee; 'Пользователь')
        USERSF = ServiceFactory.GetUserByCode(User)
        EDoc.AccessRights.Readers.Add(USERSF)
        EDoc.Save
    except
        //
    endexcept
    
    Task = CreateTaskToEmployees(Theme; CArrayElement(ArrayOf(Object.Employee)); Attachments; Text; 0)//.Form.Show  
    
        try
          Task.Start
          MessageBox("Хорошие новости!";"Информация о печати направлена Ответственному лицу: " & Object.Requisites('Employee').DisplayText)
        except
          Task.Cancel
          Raise(CreateException('EDIRInvalidUserAction'; 
            LoadString('DIR149EAF85_1F8E_4DF8_A2C6_D1F4573CF4E4'; 'RM') & CR & GetLastException().Message & CR & 
            LoadString('DIR6A9D32E2_4D4B_484C_AFA4_1708CCFEB125'; 'COMMON'); ecWarning))
            EDocuments.DeleteByID(Doc.ID)
        endexcept
else    
   MessageBox("Внимание!";"Не указан текущий владелец! " & CR & "Кому отправлять уведомление?") 
endif

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

Теперь смотрим что у нас получилось:

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

Теперь посмотрим на нее в Исходящих:

Ну и как вы поняли - картинка во вложении полностью соответствует той, что была в карточке. 

Надеюсь, что хоть некоторым пользователям эта информация пришлась в кассу 

Примечание: В данном примере используется QR-Код как простой пример штампа, так как у меня не было под рукой нормального изображения.

Для справки: Ссылка на QR-Коде не нарушает ничьих авторских прав!

Николай Толстобоков

Статья конечно интересная, подробная. Но какие цели применения этому?

Тарас Асачёв

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

Кира Бояджян

Афигенно! При проверках это очень пригодится.

Авторизуйтесь, чтобы написать комментарий