Метки записи: |
Здравствуйте!
Реализуем для пользователя бизнес-процесс, основой которого являются задачи. При выполнении задачи меняется стадия продажи и ставится следующая задача.
Все достаточно линейно, но вот какая сложность:
В результате одной задачи пользователь должен ОБЯЗАТЕЛЬНО прикрепить файл к продаже. То есть я это вижу так - пользователь меняет состояние задачи на "Выполнена", тут перед ним открывается окно выбора файла и файл автоматически прикрепляется к продаже, с которой связана задача.
Вопроса у меня 2.
1 - Как можно реализовать вот такое прикрепление файла?
2 - Как проверить, не отменил ли пользователь этот диалог? И если отменил - изменить статус продажи.
Комментарии
По поводу 2го вопроса, то это можно реализовать следующим образом: Создаем елемент Скрипт в процессе, добавляем в него использование scr_WindowUtils
if (!(System.OpenDialog(FileName, '*.*', '',
"Выберете файл", '')))
{
ShowInformationDialog('Логика на кнопку отмена');
}
ShowInformationDialog(FileName.Value);
По первому вопросу советую посмотреть scr_FileUtils в нем есть функция SaveFileToDatabase, далее следует привязать файл к разделу продажи, для этого нужно вставить запись в таблицу для связи детали Файлы с соответствующим разделом tbl_FileInOpportunity используя соответствующий сервис InsertQuery (iq_FileInOpportunity)
С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки
Спасибо! Я пока еще не дошла до непосредственной реализации, возможно, когда дойду, появятся еще вопросы :)
samarasoft.ru
Алексей, большое Вам спасибо за пример работы с файлом, одного вашего ответа хватило чтобы реализовать функционал.
Прикрепление файла работает корректно, но хотелось бы уточнить пару моментов.
Файл я сохранял в БД следующим образом.
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
Пример, в вашем коде :
Способ 2
Можно вытянуть имя файла, работая со строкой пути
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-й линии поддержки
С уважением,
Яворский Алексей
Эксперт 3-й линии поддержки
Спасибо за пояснение, Алексей.
Скажите пожалуйста, можно ли из скрипта прикреплять несколько файлов? Или все же только один?
Здравствуйте Татьяна,
Пример выбора нескольких файлов можно посмотреть в разделе [База знаний], также полезно ознакомится с кодом детали файлы (scr_FilesDetailGridArea)
Пример на эту тему:
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-й линии поддержки