Добавление файла на деталь проектов через карточку проекта
Нужно по нажатию кнопки на карточке проекта добавить файл на деталь файлов.
Вызывается фукнкция AddObject(ft_Import, NameValues, 1, null) в скрипте Wnd_OpoportunityEditScript (скрипт привязан к карточке проекта)
там кусок
var FilesCount = CopyDataset.PageRecordsCount;
var FileID = CopyDataset.Values('ID');
var FilesTable = Services.GetNewItemByUSI('tbl_Files');
if ((FilesCount > 0) && !GetIsRecordIDAccessAllowedByTable(FilesTable, FileID, 'CanWrite')) {
var Message = FormatStr("Файл '%1' уже добавлен для текущей записи, "+
"но у Вас нет права изменения данного файла.\nПродолжить добавление нового файла?",
ShortFileName);
if (ShowConfirmationDialog(Message) != mrYes) {
CopyDataset.Close();
continue;
} else {
var FileOperation = foAdd;
}
} else {
var FileOperation = GetFileOperation(FilesCount, ObjectType, ShortFileName);
}
switch (FileOperation) {
case (foAdd):
if (ObjectType == ft_RMS) {
//добавить файл считалки
AddFileRecord(Dataset, ObjectType, OldFileID, ShortFileName, FileNameStr, Revision, AddedFileIDsArray);
var FileDescription = GetDatasetFieldValueByID('ds_Files', AddedFileIDsArray, 'Description');
//добавить эксель файл без окна добавления
AddFileRecordSilently(Dataset, ObjectType, OldFileID, ShortExcelName, ExcelFileNameStr, Revision, AddedFileIDsArray, FileDescription);
NoAddedFiles = false;
//удалить оба файла из папки %temp%
DeleteFile(FileNameStr);
DeleteFile(ExcelFileNameStr);
} else {
IsImportCanceled = AddFileRecord(Dataset, ObjectType, OldFileID, ShortFileName, FileNameStr, Revision, AddedFileIDsArray);
NoAddedFiles = false;
}
break;
case (foUpdate):
var FoundFileId = CopyDataset.Values('ID');
var UpdateResult = UpdateFileData(Dataset, FoundFileId,FileNameStr);
if (UpdateResult) {
ShowInformationDialog(FileAddedMessage);
}
NoAddedFiles = false;
break;
case (foNone):
IsImportCanceled = true;
break;
}
} finally {
CopyDataset.Close();
}
В ней вызывается function AddFileRecord()
Она выглядит так:
LongFileName, Revision, AddedFileIDsArray) {
var ID = Connector.GenGUID();
var IsImportCanceled = false;
try {
Dataset.Append();
Dataset.Values('ID') = ID;
Dataset.Values('ItemTypeID') = ObjectType;
Dataset.Values('Link') = ShortFileName;
Dataset.Values('Revision') = Revision;
if (ObjectType == ft_File || ObjectType == ft_RMS || ObjectType == ft_Import) {
var Result = SaveFileToDataset(LongFileName, Dataset, 'FileData');
if (!Result) {
return ;
}
}
var FilePosted = Dataset.Post();
if ((FilePosted) && (ObjectType == ft_File || ObjectType == ft_RMS || ObjectType == ft_Import)) {
CopyFileAccessDetailData(OldFileID, ID);
}
if (FilePosted) {
// Открываем окно для ввода описания
var Attributes = GetNewDictionary();
Attributes('RecordID') = ID;
strong>Attributes('NotifyObject') = Self;strong>
Attributes('ShowModal') = true;
var DefaultValues = GetNewDictionary();
var EditWindow = ShowEditWindowEx('wnd_FilesDetailEdit',
Attributes, DefaultValues, false, true);
if (EditWindow.ModalResult != wmrOK) {
Dataset.Delete();
FilePosted = false;
IsImportCanceled = true;
}
}
} finally {
Dataset.Close();
}
if (FilePosted) {
InsertFilesLink(ID);
AddedFileIDsArray.push(ID);
// Отправляем уведомление о дабавлении файла
// для файлов в проекте
if (FilesDetailGridArea.TableUSI == 'tbl_FileInOpportunity') {
var OpportunityID = GetAttribute(Self, 'ParentItemID');
var Today = new Date(System.Now())
SendMailByFileInOpportunity(OpportunityID, LongFileName,
Connector.CurrentUser.ContactID, Connector.CurrentUser.ContactName, Today.getVarDate(),
Connector.CurrentUser.ContactID, Connector.CurrentUser.ContactName, Today.getVarDate(), 1)
}
}
return IsImportCanceled;
}
Вот в этом месте Attributes('NotifyObject') = Self; возникает ошибка, так как объект Self не определен (тк в скрипт попали в середине). Как проверить, определен ли он, или вообще по-другому решить эту задачу?
Спасибо.
Нравится
Здравствуйте, Лена!
Для проверки можно использовать блок try-catch или условие:
if (Self) { //ToDo }
Как вариант, можно Self передавать аргументом в функцию из карточки.
If (Self) не подходит, так как это сразу вызывает исключение.
Попробовала
try {Attributes('NotifyObject') = Self;} catch (e) {Self = Services.GetNewItemByUSI('wnd_FileInOpportunityGridArea')};
но в итоге все ранво дальше в скрипте встречаются неопределнные объекты. Как по-умному сделать добавление файла через картчоку проекта?
Здравствуйте, Лена!
А передать Self в функцию не подойдет?
Нет, потому что дело не только в этом Self, но и в других объектах и переменных, которые инициализируются в ходе выполнения скрипта при добавлении файла через деталь. А тут я влезаю в середину, добавляя файл из карточки.
Лена, ну вроде бы Вы все правильно делаете. Скопировали функцию "AddFileRecord" из "scr_FileDetailGridArea". Еслинственное, что смущает - это то, что Вы передаете Dataset карточки редактирования, а не "ds_Files", который требуется.
Строго говоря, можно просто ограничиться использованием функции "SaveFileToDataset" или "SaveFileToDatabase" из "scr_FileUtils".
Елена,
function AddFileRecord() описана в scr_FilesDetailGridArea (скрипт реестра детали "Файлы") и под Self имеется в виду окно детали, в котором нажали кнопку "Добавить файл". Если я правильно понял, то Вы пытаетесь вызвать function AddFileRecord() из скрипта окна редактирования "Проекта" и Self, как такового, действительно нет. Попробуйте function AddFileRecord() вынести в отдельный библиотечный скрипт (например, scr_FileUtils), добавить еще один параметер, в который при вызове будете передавать Self. Но придется переделать и протестировать все вызов function AddFileRecord() в системе.
Дело не в Self даже, там еще BaseGridArea неинициализирован. Нужно как-то запустить весь скрипт, чтобы прошла инициализация нужных объектов.
Лена, зачем Вам все инициализировать?
Просто из карточки вызовите функцию "SaveFileToDatabase", как я писал выше или скопируйте ее и используйте. Зачем лишние действия, если нужно просто залить файл в базу?