McZag пишет:Возможно вы правы.
Скажу честно, вы первый, кто обратился с такой проблемой. Меня заинтересовал бизнес-процесс, в рамках которого вы автоматически меняете статус после сохранения файлов и снятия блокировки. Что делает этот процесс? Автоматизация перевода в PDF? Распознавание? Синхронизация с внешним хранилищем?
Нет идея в другом, возникла необходимость выгружать файлы объекта на редактирование в папку скажем C:\Проекты\Имя проекта. Возникла эта необходимость потому, чтобы путь выгрузки был простым и понятным без GUID и прочих идентификаторов. Много где читал, что если не использовать GUID и прочие идетификаторы, то ТДМС не будет знать как вернуть ей файл в объект - это все вымыслы, есть куча способов дать понять ТДМС как и откуда вернуть файл. Плохо что свойства выгрузки в объекте они только для чтения и програмным способом их не поменять и это только лишь усложняет работу и не дает гибкости разработчикам. А информацию о путях выгрузки можно хранить или в атрибуте объекта, или в словаре во время сеанса работы, или сделать так, чтобы путь выгрузки был жестко привязан к структуре папок на диске и повторял структуру дерева ТДМС.
Удалось сделать, чтобы системные команды СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ загружали файл из папки C:\Проекты\Имя проекта обратно в объект. Это было сделано вот таким способом.
'============================================================================
==
' Процедура Object_BeforeCheckIn.
' Выполняется перед возвращением файлов в TDMS.
'============================================================================
==
Sub Object_BeforeCheckIn(Obj, Cancel)
' Получаем путь путь выгрузки файлов карточки документа.
LocalPath = ThisApplication.ExecuteScript("CMD_PROJECT_DLL", "GetProjectLocalPath", ThisObject)
' Возвращаем файлы в TDMS.
For each File in ThisObject.Files
File.checkIn LocalPath & File.FileName
Next
End Sub
Далее возникла необходимость, чтобы в зависимости от статуса объекта (документ в разработке, документ взят на редактирование) были доступны на объекте разные команды. Пользователь на заблокированном объекте должен видел только то, что ему в данном статусе объекта видеть положено, а не портянку команд ))) Соответственно, когда файл объекта возвращается в ТДМС и снимается блокировка сразу же хотелось поменять статус - это вроде бы как логично, чтобы было такое событие. Много чего можно было бы приделать, к этому событию, когда снимается блокировка и не использовать таймеры. Но как оказалось отследить по событию снятие блокировки нельзя, получается и нельзя разделить когда была нажата просто команда СОХРАНИТЬ, а когда СОХРАНИТЬ И ЗАКРЫТЬ. Проблем бы не было если бы событие Object_Modified вызывалось после разблокировки ))) или в Command_Completed можно было бы отследить нажатие системных команд.
Пока принял вот такое решение отказаться от использования системных команд СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ, когда файл взят на редактирование и объект заблокирован. Удалось скрыть системные команды если в статусе "документ взят на редактирование" запретить редактирование файлов. Сделал свои команды аналоги системным СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ из которых ничего не мешает обратно поменять статус и разблокировать объект.
А вообще хотелось бы управлять видимостью системных команд в контекстном меню, хотя бы на уровне профилей или события ContextMenu_BeforeShow - это давало бы больше гибкости при настройке системы.