Мельница данных   (13.11.2018)
Использование пользовательских приложений.
Библиотека ParusInfoProvider.dll содержит реализацию провайдера для БД Парус8. Провайдер реализует, в дополнение к обязательным, интерфейс, позволяющий управлять им посредством механизма "Пользовательских приложений":
  IParusProvider = interface(IDispatch)
    ['{4864AE99-80E6-4FC6-9DB0-EAB248F72362}']
    procedure Connect(const Database: WideString;
      const UserName: WideString; 
      const Password: WideString); safecall;
    property QueryObject: OleVariant;
    property StoredProcObject: OleVariant;
  end;
Объект-провайдер может установить связь с БД либо самостоятельно с использованием переданных в метод Connect параметров соединения, либо с помощью объектов Query и StoredProc , предоставляемых системой Парус8 для использования в пользовательских приложениях. В свою очередь, созданный провайдер с установленным соединением может быть передан в метод Execute объекта QueryBuilder.Application . Вторым параметром может быть передано значение, представляющее структуру запроса. Это может быть либо строка с указанием имени файла, либо объект, реализующий интерфейс IStream (например, MSXML.DOMDocument ), либо строка, представляющая собой xml-документ. Все средства манипуляции структурой и поведением запроса предоставляются на уровне работы с xml-документом, описывающим запрос.
        Пример скрипта пользовательского приложения на DelphiScript

procedure QueryBuilderTest;
var
  LApplication: OleVarint;
  LProvider: OleVarint;
  LDocument: OleVariant;
begin
  //описание структуры запроса. Из BLOB, из файла, из строки - откуда угодно
  LDocument := CreateOleObject('MSXML.DOMDocument');
  //LDocument реализует IXMLDOMDocument и IStream
  LDocument.loadXML('<Query Provider="{B3079C97-6EBC-43EB-880F-58F094B322B0}">' +
    '<Item Type="Table" Table="AGNLIST" Alias="MAIN" TableAlias="MAIN">'  +
      '<Item ColumnIndex="0" Type="Field" Field="AGNABBR" Table="AGNLIST" ' + 
        'Alias="MAIN_AGNABBR" TableAlias="MAIN"/>' +
      '<Item ColumnIndex="1" Type="Field" Field="VERSION" Table="AGNLIST" ' + 
        'Alias="MAIN_VERSION" TableAlias="MAIN"/>' +
    '</Item>' +
  '</Query>');

  //Скрытие дерева структуры
  LDocument.documentElement.setAttribute('TreeWidth', 0);

  //Наложение условий отбора на колонку
  LDocument.selectSingleNode('/*/Item/Item[@Field="AGNABBR" and @Table="AGNLIST"]').
    setAttribute('ColumnFilter', 'Б*');

  //Переименование колонки
  LDocument.selectSingleNode('/*/Item/Item[@Field="VERSION" and @Table="AGNLIST"]').
    setAttribute('Caption', 'Версия');


  //создание провайдера и передача ему объектов для соединения с БД
  LProvider := CreateOleObject('ParusInfoProvider.ParusProvider');
  LProvider.QueryObject := Query;
  LProvider.StoredProcObject := StoredProc;

  //создание и использование объекта-приложения QueryBuilder
  LApplication := CreateOleObject('QueryBuilder.Application');

  //В качестве второго параметра передается ОБЪЕКТ, через 
  //   IStream содержащий структуру запроса
  LApplication.Execute(LProvider, LDocument);
  LApplication.Visible := True;

  //Ожидание завершения работы с приложением
  repeat
    Application.ProcessMessages;
  until not LApplication.Visible;

end;

Интерфейс автоматизации поддерживает также метод для автоматического применения шаблона для переноса в Excel.
        Допустим, .MQR-файл, описывающий запрос, содержащий шаблон с именем "Простой Перенос" загружен в раздел "Модули пользовательских приложений" с мнемокодом "QueryData". Для этого необходимо создать модуль пользовательского приложения с типом "COM-сервер" или "Надстройка Excel" и загрузить из файла .MQR-файл. Проверки соответствия формата загружаемого файла заявленному типу модуля пользовательского приложения Парус не производит, что позволяет воспользоваться этим трюком. Тогда:
procedure QueryBuilderTemplateTest;
var
  LApplication: OleVarint;
  LProvider: OleVarint;
  S: string;
begin
  Query.SQL.Text := 'select BMODULE from V_UAMODULES where SCODE = :CODE';
  //мнемокод модуля пользовательского приложения, содержащего
  //загруженный .MQR-файл
  Query.ParamByName('CODE').Value := 'QueryData';
  Query.Open;
  S := Query.FieldByName('BMODULE').AsString;
  Query.Close;

 //создание провайдера и передача ему объектов для соединения с БД
  LProvider := CreateOleObject('ParusInfoProvider.ParusProvider');
  LProvider.QueryObject := Query;
  LProvider.StoredProcObject := StoredProc;

  //создание и использование объекта-приложения QueryBuilder
  LApplication := CreateOleObject('QueryBuilder.Application');

  //В качестве второго параметра передается СТРОКА, содержащая xml с описанием
  //структуры запроса и шаблоны для переноса в Excel
  LApplication.ExecuteTemplate(LProvider, S, 'Простой Перенос');
end;