Страница 1 из 1

Использование VBScript в корыстных целях

Добавлено: 15 окт 2010, 17:44
m0p3e
Для тех кто не очень любит FR, на примере покажу как с помощью VB Script решить нетривиальные (с точки зрения FCOM и не только) задачи.
Задача очень простая по сути, но только не для инструментария Галактики. Необходимо в трудовом договоре выводить в колонтитул ФИО сотрудника.
Для решения задачи потребуется два шага:
1. В нужной форме ТД создаем колонтитул содержащий блок с комментарием FIO. Для этого вызываем меню Вставка/Поле - выбираем поле COMMENTS. В качестве примечания задаем FIO. Сохраняем форму.
2. После формирования формы нам необходимо выполнить скрипт для модификации колонтитула. Для этого докомпиливаем интерфейс RPD_1;

Код: Выделить всё

#component "Z_Staff"

alter interface RPD_1 (fix 'Изменение колонтитула');

Procedure PushMacro;
{
 If isValid ( tnPersons )
    {
     var iStrFunc : StringFunctions;
     var FileName, VBSFileName : string;
     FileName := CreateTmpFileName;
     VBSFileName := TranslatePath ( GetStringParameter ( 'Files','OutputFilesDirectory', 0 ) + 'tdmacro.vbs' );
     LogStrToFile ( FileName, oem2ansi( 'wdReplaceAll = 2') );
     LogStrToFile ( FileName, oem2ansi( 'Dim oWord') );
     LogStrToFile ( FileNAme, oem2ansi( 'On Error Resume Next' ) ); 
     LogStrToFile ( FileName, oem2ansi( 'Set oWord = GetObject(,"Word.Application")') );
     LogStrToFile ( FileName, oem2ansi( 'If Not (oWord Is Nothing) then') );
     LogStrToFile ( FileName, oem2ansi( 'Dim oDoc') );
     LogStrToFile ( FileName, oem2ansi( 'For iDoc = 1 To oWord.Documents.Count') );
     LogStrToFile ( FileName, oem2ansi( 'Set oDoc = oWord.Documents.Item(iDoc)') );
     LogStrToFile ( FileName, oem2ansi( 'If InStr(1,oDoc.Name,"' + iStrFunc.GetFirstName ( Persons.FIO )+ string ( Persons.StrTabN ) + '") then') );
     LogStrToFile ( FileName, oem2ansi( 'Dim CodeText') );
     LogStrToFile ( FileName, oem2ansi( 'For iSec=1 To oDoc.Range(0,0).sections.count' ) );
     LogStrToFile ( FileName, oem2ansi( ' For iFoot=1 To oDoc.Range(0,0).sections.item(iSec).footers.count' ) );
     LogStrToFile ( FileName, oem2ansi( '  For iFil=1 To oDoc.Range(0,0).sections.item(iSec).footers.item(iFoot).Range.Fields.Count' ) );
     LogStrToFile ( FileName, oem2ansi( '   Set CodeText = oDoc.Range(0,0).sections.item(iSec).footers.item(iFoot).Range.Fields.item(iFil).Code' ) );
     LogStrToFile ( FileName, oem2ansi( '   If InStr(1,CodeText.Text,"COMMENTS  FIO") > 0 then' ) );
     LogStrToFile ( FileName, oem2ansi( '    CodeText.Text = "COMMENTS " + chr(34) + "' + iStrFunc.GetFIO ( Persons.FIO ) + '____________________ " + chr(34)' ) );
     LogStrToFile ( FileName, oem2ansi( '   End If') );
     LogStrToFile ( FileName, oem2ansi( '   oDoc.Range(0,0).sections.item(iSec).footers.item(iFoot).Range.Fields.item(iFil).Update' ) );
     LogStrToFile ( FileName, oem2ansi( '  Next') );
     LogStrToFile ( FileName, oem2ansi( '  oDoc.Range(0,0).sections.item(iSec).footers.item(iFoot).Range.Fields.Update' ) );
     LogStrToFile ( FileName, oem2ansi( ' Next') );
     LogStrToFile ( FileName, oem2ansi( 'Next') );
     LogStrToFile ( FileName, oem2ansi( 'End If') );
     LogStrToFile ( FileName, oem2ansi( 'Next') );
     LogStrToFile ( FileName, oem2ansi( 'End If') );

     If FileExist ( VBSFileName )
       DeleteFile ( VBSFileName );
     If CopyMoveFile ( FileName, VBSFileName, true, ecmfClientFrom + ecmfClientTo )
       ExecProgram ( 'start', VBSFileName,'Изменение колонтитула...',0,0 );
     If FileExist ( VBSFileName )
       DeleteFile ( VBSFileName );
    };
};

HandleEvent
 cmStaffWordDoc :
  {
   if inherited::handleevent(cmStaffWordDoc) <> heAbort
     PushMacro;
  };
end;
end.
Вот таким образом используя объектную модель ворда и VBScript решается задачка.