// подключение системных библиотек
using System;
using System.Xml;

// подключение библиотек СУБП
using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.ObjectManager;

namespace DVScriptHost
{
    class DVScript
    {
        public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
        {
            try
            {
                // переменная процесса - карточка файла (тип - файл DV)
                ProcessVariable oFile = process.GetVariableByName("Файл");

                // переменная процесса - новое имя файла (строка)
                ProcessVariable oFileName = process.GetVariableByName("Новое имя");

                process.LogMessage("Получили переменные");

                // приводим тип
                DVFileCard dvFile = (DVFileCard)oFile.Value;

                process.LogMessage("Получили файл");
                // получаем шлюз
                DVGate oGate = (DVGate)process.Gates[DVGate.GateID];
                process.LogMessage("Получили шлюз");
                // получаем сессию
                UserSession oSession = oGate.Session;
                process.LogMessage("Получили сессию");
                // получаем данные карточки
                CardData oData = oSession.CardManager.get_CardData(dvFile.ID);
                process.LogMessage("Получили данные карточки файла");
                oData.Description = oFileName.Value.ToString();
                // получаем основную секцию
                SectionData oSection = oData.Sections["B4562DF8-AF19-4D0F-85CA-53A311354D39"];
                process.LogMessage("Получили секцию");
                // строка (в этой секции она всегда одна)
                RowData oRow = oSection.FirstRow;
                process.LogMessage("Получили строку");
                oRow.set_Value("FileName", oFileName.Value.ToString());
                // получаем идентификатор карточки файла с версиями (VersionedFileCard)
                string sVFCardID = oRow.get_Value("FileID").ToString();
                process.LogMessage("Идентификатор карточки файла с версиями: " + sVFCardID);
                // получаем системный объект - карточку файла с версиями
                VersionedFileCard oVFCard = (VersionedFileCard)oSession.CardManager.get_Card(sVFCardID);
                process.LogMessage("Получили системный объект - карточку файла с версиями");
                // у карточки файла с версиями, получаем текущую версию
                FileVersion oCurVer = oVFCard.CurrentVersion;
                process.LogMessage("Получили текущую версию");
                // переименовываем
                string sCurrent = oCurVer.Name;
                string sExt = Ext(sCurrent);
                string sNew = oFileName.Value.ToString() + "." + sExt;
                process.LogMessage(sExt);
                oCurVer.Name = sNew;
                oVFCard.Name = sNew;
                process.LogMessage("Файл переименован");
                IFile oRawFile = (IFile)oCurVer;
                oRawFile.Name = sNew;
            }
            catch (Exception ex)
            {
                // запись в журнал ошибки исполнения
                process.LogMessage("Ошибка выполнения скрипта: " + ex.Message);
            }
            return;
        }

        private string Ext(string sFileName)
        {
            string sExt = "";
            int i;
            for (i = sFileName.Length-1; i>-1 ; i--)
            {
                if (sFileName[i] != "."[0]) 
                {
                    sExt = sFileName[i] + sExt; 
                }else{
                    i = -1;
                }
            }
            return sExt;
        }
    }
}