1
Голосовать

Обязательное добавление файла

Создано:
Метки записи:

Здравствуйте!
Реализуем для пользователя бизнес-процесс, основой которого являются задачи. При выполнении задачи меняется стадия продажи и ставится следующая задача.
Все достаточно линейно, но вот какая сложность:
В результате одной задачи пользователь должен ОБЯЗАТЕЛЬНО прикрепить файл к продаже. То есть я это вижу так - пользователь меняет состояние задачи на "Выполнена", тут перед ним открывается окно выбора файла и файл автоматически прикрепляется к продаже, с которой связана задача.
Вопроса у меня 2.
1 - Как можно реализовать вот такое прикрепление файла?
2 - Как проверить, не отменил ли пользователь этот диалог? И если отменил - изменить статус продажи.

Комментарии

Яворский Алексей

По поводу 2го вопроса, то это можно реализовать следующим образом: Создаем елемент Скрипт в процессе, добавляем в него использование scr_WindowUtils

var FileName = System.CreateObject('TSObjectLibrary.Value');
        if (!(System.OpenDialog(FileName, '*.*', '',
                "Выберете файл", '')))
                {
                        ShowInformationDialog('Логика на кнопку отмена');
        }
 
        ShowInformationDialog(FileName.Value);

По первому вопросу советую посмотреть scr_FileUtils в нем есть функция SaveFileToDatabase, далее следует привязать файл к разделу продажи, для этого нужно вставить запись в таблицу для связи детали Файлы с соответствующим разделом tbl_FileInOpportunity используя соответствующий сервис InsertQuery (iq_FileInOpportunity)

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Алёна Овсянникова

Спасибо! Я пока еще не дошла до непосредственной реализации, возможно, когда дойду, появятся еще вопросы :)

samarasoft.ru

Сидоров Павел

Алексей, большое Вам спасибо за пример работы с файлом, одного вашего ответа хватило чтобы реализовать функционал.
Прикрепление файла работает корректно, но хотелось бы уточнить пару моментов.
Файл я сохранял в БД следующим образом.

Dataset.Open();
if ((Dataset.Values('TypeID') == '{AC9986F5-0EC2-45D1-B524-D36A1174C4C5}'||
         Dataset.Values('TypeID') == '{9F0C6C22-ADDC-4A5A-8287-FCBDD5C66554}') &&
         Dataset.Values('StatusID') == '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}'){
       
        var FileName = System.CreateObject('TSObjectLibrary.Value');
    if (!(System.OpenDialog(FileName, '*.*', '', "Выберете файл", '')))
        {
            ShowInformationDialog('Необходимо прикрепить файл!');          
        }
 
    else {
       
        var FileDataset = Services.GetNewItemByUSI('ds_Files');
        var CurrentDate = System.Now();
        var CurrentUser  = Connector.CurrentUser.ContactId;
        var FileID = Connector.GenGUID();
        FileDataset.Append();
        FileDataset.Values('ID') = FileID;
        FileDataset.Values('CreatedOn') = CurrentDate;
        FileDataset.Values('CreatedByID') = CurrentUser;              
        FileDataset.Values('ModifiedOn') = CurrentDate;
        FileDataset.Values('ModifiedByID') = CurrentUser;
        FileDataset.Values('Link') = FileName.Value;
        FileDataset.Values('Revision') = 1;
        FileDataset.Values('ItemTypeID') = '{39A5B367-4A7A-473E-8F74-26977CB6DB67}';      
        FileDataset.Post();
        SaveFileToDatabase(FileID, FileName.Value, 1, null);
       
        var InsertQuery = Services.GetNewItemByUSI('iq_FileInOpportunity');
        InsertQuery.ColumnsValues.ItemsByName('ID').Value = Connector.GenGUID();
        InsertQuery.ColumnsValues.ItemsByName('FileID').Value = FileID;
        InsertQuery.ColumnsValues.ItemsByName('OpportunityID').Value = Dataset.Values('OpportunityID');
        InsertQuery.Execute();
       
                ShowInformationDialog('Файл прикреплен: ' + FileName.Value);
        }
}
Dataset.Close();

1)В таблицу tbl_Files в поле link я передал FileName.Value и в ф-ию SaveFileToDatabase в параметр FileName тоже передал FileName.Value, из-за этого имя прикрепленного к продаже файла оображается вместе с полным именем директории, из которой он был выбран.
Каким образом можно сделать так, чтобы в имени осталось только непосредственно название файла и его расширение?

2) В таблицу tbl_Files в поле ItemTypeID я просто записал ID такой же как и у других файлов, которые я прикреплял средствами Terrasoft - '{39A5B367-4A7A-473E-8F74-26977CB6DB67}'
Таблицы с типами файлов я не нашел, в sq_Files, нет JOIN с какой-либо таблицей типа tbl_FileTypes.
Откуда же берется этот ID, и не приведет ли к каким-то последствиям при прикреплении файлов какого-то особого типа то, что я просто прописываю в ItemTypeID = '{39A5B367-4A7A-473E-8F74-26977CB6DB67}'?

Яворский Алексей

Здравствуйте Павел
1)
Способ 1.
Или использовать функцию ExtractFileName с скрита scr_FileUtils
Пример, в вашем коде :

ExtractFileName(FileName.Value)

Способ 2
Можно вытянуть имя файла, работая со строкой пути

var filename = FileName.Value.substring(FileName.Value.lastIndexOf("\\")+1,FileName.Value.length);

lastIndexOf("\\") - ищем последнее вхождение символа '\' получаем "\file.txt"
lastIndexOf("\\")+1 - для того что бы пропусить '\' получаем "file.txt"
FileName.Value.length - возвращает длинну строки с путем фала
substring - обрезаем строку FileName.Value начиная с вхождения символа '\' до конца строки

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Спасибо,Алексей.

Яворский Алексей

ItemTypeID = {39A5B367-4A7A-473E-8F74-26977CB6DB67} это тип Файл, имеется в виду типы перечисленные в перечеслении enm_FileTypes. Также это может быть Ссылка, URL, Ссылка на папку

Заполняется конкретными значаниями при выборе типа добавляемого файла

функция ShowAddObjectDialog в scr_FilesDetailGridArea с аргументами с указаного перечисления

Яворский Алексей
Эксперт 3-й линии поддержки

Прикрепленный файлРазмер
img.jpg 17.11 кб

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки

Сидоров Павел

Спасибо за пояснение, Алексей.

Мыреева Татьяна

Скажите пожалуйста, можно ли из скрипта прикреплять несколько файлов? Или все же только один?

Яворский Алексей

Здравствуйте Татьяна,
Пример выбора нескольких файлов можно посмотреть в разделе [База знаний], также полезно ознакомится с кодом детали файлы (scr_FilesDetailGridArea)
Пример на эту тему:

  var FileName = System.CreateObject('TSObjectLibrary.Value');                    
        var FileNames = System.CreateObject('TSObjectLibrary.StringsList');              
                                                                                             
                if ((System.PromptForFileNames(FileNames, '*.*', '', "Выберите файл(ы)",    
                        ''))) {                                                                  
                var FileCount = FileNames.Count;                                        
                                                                                                 
                        if (FileCount != 0)  {                                                  
                        for (var i=0; i<FileCount; i++)                                          
                        MessageBox(FileNames.Items(i));                                          
                        }                                                                        
        }                                                                            
                   else                                                                      
                       {                                                                    
          ShowInformationDialog('Необходимо прикрепить файл!');                    
      }                                                                                                                                

В коде формируется массив выбранных файлов FileNames, далее вы можете обратиться к каждому элементу и вызывать функцию записи в БД, как показал Павел в предыдущем посте

С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки