Добавление файла на деталь проектов через карточку проекта

Нужно по нажатию кнопки на карточке проекта добавить файл на деталь файлов.

Вызывается фукнкция AddObject(ft_Import, NameValues, 1, null) в скрипте Wnd_OpoportunityEditScript (скрипт привязан к карточке проекта)

там кусок

try {
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()

Она выглядит так:

function AddFileRecord(Dataset, ObjectType, OldFileID, ShortFileName,
        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 не определен (тк в скрипт попали в середине). Как проверить, определен ли он, или вообще по-другому решить эту задачу?

Спасибо.

Нравится

8 комментариев

Здравствуйте, Лена!
Для проверки можно использовать блок 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", как я писал выше или скопируйте ее и используйте. Зачем лишние действия, если нужно просто залить файл в базу?

Показать все комментарии