uses
  'QueryTools',
  'Un_ToolsXml',
  'Un_Tools',
  'Un_Const',
  'Un_Progress',
  'Un_System',
  'Un_Log',
  'Un_Debug';


{~CfgParamChoiceOrg
  запускаемый скрипт на диалоги из конфигурации.

  exchange #2816
  переработка кода скрипта под новый редактор конфигуратора в эксче.
  теперь при вызове скрипта сюда передаются все параметры, которые указаны
  как подпараметры для параметра скрипта.
  все что возвращается сохраняется в значениях для параметра скрипта и в
   подпараметрах.

  пример xml вызова скрипта:
  <PARAMS
    INI_FILE="D:\work\AzkScript_184_2_35\FK2009\Exp_FK_IR.cfg"
    org_caption="ООО&quot;Кулебакикадастрсъемка&quot;"
    org_taxcode="5251007924"
    org_kpp="525101001"
    org_id="1000004099"/>

  результат выбора орг:
  <PARAMS
    INI_FILE="D:\work\AzkScript_184_2_35\FK2009\Exp_FK_IR.cfg"
    org_caption="ООО&quot;Кулебакикадастрсъемка&quot;"
    org_taxcode="5251007924"
    org_kpp="525101001"
    org_id="1000004099">
    <RESULT
      org_caption="тест"
      org_kpp="123654561"
      org_taxcode="1233333333"
      org_id="1000004164"/>
  </PARAMS>

  особенность в том, что параметр в конфиге имеет два определения: caption и ID.

  caption - это название параметра в конфиге, которое отбражается в
  редакторе в качестве названия параметра, а ID - это внутренний идентификатор
  параметра для обмена со скриптом.
  отказ от парсинга строки, переданной в атрибуте config как commatext
  объекта TStringList, упрощает и ускоряет работу скрипта и увеличивает гибкость
  передачи параметров, поскольку при этом допускаются вложенные элементы.

  если ID указан - передается id в качестве названия параметра (атрибута)
  и он же определяет имя параметра (атрибута) в результате.
  если же ID не указывается, то в качестве обмена фигурирует caption.

  проблема в том, что при отказе передачи параметров в атрибуте Config,
  и при переходе на атрибуты, требуется обязательное указание строк в
  параметрах ID, поскольку кирилица и пробелы в названиях атрибутов не
  допускаются.}
function CfgParamChoiceOrg( aXml: Variant): boolean;
var
  xXmlDoc: Variant;
  xFormDfmFileName: string;
  xForm : TFormCustomList;
  xDBGrid: TDBGridEh;
  xOrgXml: Variant;
//  xConfig: TStringList;
  xDirRoot: string;
  xCfgNode: Variant;
  xID: string;
  xConfig: TStringList;
begin
  Result := FALSE;

  InitializeSystem( '');
  InitializeLog;
  InitializeDebug;
                       //showmessage(axml.xml);
  try
    // инициализация глою.переменных
    // загружается конфиг файл
    QueryInitialization;
    try
      xXmlDoc := aXml.documentElement;
{
xConfig := TStringList.Create;
xConfig.text:= axml.xml;
xConfig.savetofile('c:\temp\test_cfg_in.xml');
xConfig.Free;
}
      xDirRoot:= ExtractFilePath( VarToStr( xXmlDoc.GetAttribute( 'INI_FILE')));

      xConfig:= NIL;
      xForm := NIL;
      try
        xConfig:= TStringList.Create;
        xConfig.CommaText := VarToStr( xXmlDoc.GetAttribute( 'CONFIG'));

        xForm := TFormCustomList.Create(Application);
        xFormDfmFileName := xDirRoot + 'Forms\FmOrg.dfm';
//showmessage( xFormDfmFileName);
        if not FileExists( xFormDfmFileName) then EXIT;
        LoadForm( xFormDfmFileName, xForm);
        xDBGrid := TDBGridEh( xForm.FindComponent('DBGrid'));

        // пробуем найти по инн и кпп организацию, чтобы
        // поставить галочку выбора этой орг.
        xID := TRIM( xConfig.Values[ 'org_id']);
        if (LENGTH( xID) > 0) then begin
          if (QueryField(  ' select count( * ) N'
                          +' from org O'
                          +' Join Contractor C on C.Org_Id = O.Id'
                          +' Left Join Budget B on B.Org_Id = C.Inspector_Id'
                          +' where o.CLOSE_DATE is null and B.Id = ? and o.id=?',
                          [ Budget_Id, xID],
                          'N') = '1')
            then xForm.Bookmark := xID;
        end;

        // выбор орг. только среди незакрытых и актуальных
        // на текущий (прилогиненный) бюджет.
        // проверка прав пользователя для доступа к организациям
        // не проверяется.
        xForm.SQLText :=
             ' Select O.Id, O.Caption, O.Description, O.Kadm_Code,'
            +' O.Version, O.Close_Date, O.Open_Date,'
            +' O.Taxcode, O.Kpp, O.Name, O.Caption_Empty'
            +' from org O'
            +' Join Contractor C on C.Org_Id = O.Id'
            +' Left Join Budget B on B.Org_Id = C.Inspector_Id'
            +' where o.CLOSE_DATE is null and B.Id = ?';
        xForm.SQLTextParams := Budget_Id;

        if (xForm.ShowModal <> mrOk) then EXIT;

        // добавляем раздел доп.параметров: результат будет в любом случае
        xCfgNode := xXmlDoc.appendChild(
                        xXmlDoc.ownerDocument.createElement( 'RESULT'));
        xCfgNode.SetAttribute( 'org_caption', '');
        xCfgNode.SetAttribute( 'org_kpp'    , '');
        xCfgNode.SetAttribute( 'org_taxcode', '');
        xCfgNode.SetAttribute( 'org_id'     , '');
        Result := TRUE;

        // если орг. не выбрана - возвращаем пустое значение.
        // это нужно чтобы сбросить параметры в случае отказа выбора
        // организации.
        if (xDBGrid.Bookmark.Count <> 1) then EXIT;

        xOrgXml := QueryXml( ' Select o.id, O.Taxcode, O.Kpp, o.caption'
                            +' from org O where O.ID=?',
                             [ xDBGrid.Bookmark[ 0]]);
        xOrgXml := xOrgXml.documentElement;
        if (xOrgXml.childNodes.Length <> 1) then EXIT;
        xOrgXml := xOrgXml.childNodes.Items[ 0];

        xCfgNode.SetAttribute( 'org_caption', xOrgXml.GetAttribute( 'CAPTION'));
        xCfgNode.SetAttribute( 'org_kpp'    , xOrgXml.GetAttribute( 'KPP'));
        xCfgNode.SetAttribute( 'org_taxcode', xOrgXml.GetAttribute( 'TAXCODE'));
        xCfgNode.SetAttribute( 'org_id'     , xOrgXml.GetAttribute( 'ID'));
{
xConfig := TStringList.Create;
xConfig.text:= axml.xml;
xConfig.savetofile('c:\temp\test_cfg_out.xml');
xConfig.Free;
}
        finally
          xConfig.Free;
          xForm.Free;
      end;
      finally
        QueryFinalization;
        FinalizeDebug;
    end;
    except
      ExceptionHandler;
  end;
end;

begin
end.
