// FindQueryDlg.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "FindQueryDlg.h"
#include "FindAdjustApprDlg.h"
#include "FindAdjustDocDlg.h"
#include "FindAdjustCharactDlg.h"
#include "FindAdjustResourceDlg.h"
#include "FindAdjustBlobDlg.h"
#include "FindAdjustUserDateDlg.h"
#include "apl_api.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/*
#ifdef _DEBUG
// Функции преобразования типов - нужны исключительно при отладке
QBS QPE2QBS(QPE el){return (QBS)el;}
QBS QGO2QBS(QGO el){return (QBS)el;}
QBS QF2QBS (QF  el){return (QBS)el;}

QPE QBS2QPE(QBS el){return (QPE)el;}
QGO QBS2QGO(QBS el){return (QGO)el;}
QF  QBS2QF (QBS el){return (QF )el;}
#endif
*/

#define SelectStringInCombo(ctrl,val) for(int indx_a=0;indx_a<ctrl.GetCount();indx_a++)\
{if(val==(CaplQLQuery::aplQLLogRelation)ctrl.GetItemData(indx_a)){ctrl.SetCurSel(indx_a);break;}}


/////////////////////////////////////////////////////////////////////////////
// CFindQueryDlg dialog

CFindQueryDlg::CFindQueryDlg(CWnd* pParent /*=NULL*/)
	: CResizableDialog(CFindQueryDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFindQueryDlg)
	m_int_source = -1;
	m_int_type = -1;
	m_IsMakeTableResult = FALSE;
	m_StateSaveQuery = FALSE;
	m_StateFindType = -1;
	//}}AFX_DATA_INIT
	m_QL_query=_T("");
	m_mode=FindObject_NDef;
	m_mode_text=_T("");
	m_cur_ext_num=0;
	m_extents=_T("");
	m_fields=_T("");
	m_is_load_bmp=false;
	m_vis_mode=0;
	m_is_adjustment=false;
	m_can_make_table=true;
	m_can_save=true;
	m_read_only=false;
	m_mode_slave=false;

	m_state_id=CaplQLQuery::aplNOLOGREL;
	m_state_name=CaplQLQuery::aplNOLOGREL;	
	m_state_descr=CaplQLQuery::aplNOLOGREL;	
	m_state_type=CaplQLQuery::aplNOLOGREL;	
	m_state_code_ver=CaplQLQuery::aplNOLOGREL;	
	m_state_code_ver1=CaplQLQuery::aplNOLOGREL;
	m_state_code_ver2=CaplQLQuery::aplNOLOGREL;
	m_state_code_izd=CaplQLQuery::aplNOLOGREL;
	m_state_source=CaplQLQuery::aplNOLOGREL;
	m_state_ver=CaplQLQuery::aplNOLOGREL;
	
	m_StringSource=_T("");
	m_StringType=_T("");
	m_dbuf=0;
	
	m_api=0;
	m_instance=0;
	m_changed=false;
	m_single_mode=false;

	m_adj_add_icon=0;
	m_adj_del_icon=0;
	m_adj_edit_icon=0;
}

CFindQueryDlg::~CFindQueryDlg()
{
	::DestroyIcon(m_adj_add_icon);
	::DestroyIcon(m_adj_del_icon);
	::DestroyIcon(m_adj_edit_icon);
	if(m_dbuf!=0)delete m_dbuf;
}

void CFindQueryDlg::DoDataExchange(CDataExchange* pDX)
{
	CResizableDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFindQueryDlg)
	DDX_Control(pDX, IDC_BTN_TYPE, m_BtnType);
	DDX_Control(pDX, IDC_STATIC_HEADER, m_st_header);
	DDX_Control(pDX, IDC_EDIT_NAME_QUERY, m_edt_name_query);
	DDX_Control(pDX, IDC_SELECT_FIND_TYPE, m_SelectFindType);
	DDX_Control(pDX, IDC_COMBO_STATE_ID, m_CmbxStId);
	DDX_Control(pDX, IDC_COMBO_STATE_NAME, m_CmbxStName);
	DDX_Control(pDX, IDC_COMBO_STATE_DESCR, m_CmbxStDescr);
	DDX_Control(pDX, IDC_COMBO_STATE_TYPE, m_CmbxStType);
	DDX_Control(pDX, IDC_COMBO_STATE_CODE_VER, m_CmbxStCodeVer);
	DDX_Control(pDX, IDC_COMBO_STATE_CODE_VER1, m_CmbxStCodeVer1);
	DDX_Control(pDX, IDC_COMBO_STATE_CODE_VER2, m_CmbxStCodeVer2);
	DDX_Control(pDX, IDC_COMBO_STATE_CODE_IZD, m_CmbxStCodeIzd);
	DDX_Control(pDX, IDC_COMBO_STATE_SOURCE, m_CmbxStSource);
	DDX_Control(pDX, IDC_COMBO_STATE_VER, m_CmbxStVer);
	DDX_Control(pDX, IDC_EDIT_ID, m_EditId);
	DDX_Control(pDX, IDC_EDIT_NAME, m_EditName);
	DDX_Control(pDX, IDC_EDIT_DESCR, m_EditDescr);
	DDX_Control(pDX, IDC_COMBO_TYPE, m_EditType);
	DDX_Control(pDX, IDC_EDIT_CODE_VER, m_EditCodeVer);
	DDX_Control(pDX, IDC_EDIT_CODE_VER1, m_EditCodeVer1);
	DDX_Control(pDX, IDC_EDIT_CODE_VER2, m_EditCodeVer2);
	DDX_Control(pDX, IDC_EDIT_CODE_IZD, m_EditCodeIzd);
	DDX_Control(pDX, IDC_COMBO_SOURCE, m_EditSource);
	DDX_Control(pDX, IDC_EDIT_VER, m_EditVer);
	DDX_Control(pDX, IDC_CHK_FIND_VERSION, m_ctrl_find_version);
	DDX_Control(pDX, ID_ADJUST_EDIT, m_adj_edit);
	DDX_Control(pDX, ID_ADJUST_DEL, m_adj_del);
	DDX_Control(pDX, ID_ADJUST_ADD, m_adj_add);
	DDX_Control(pDX, IDC_LIST_ADJUST, m_ListAdjust);
	DDX_Control(pDX, IDC_TAB_ADJUST, m_TabAdjust);
	DDX_CBIndex(pDX, IDC_COMBO_SOURCE, m_int_source);
	DDX_CBIndex(pDX, IDC_COMBO_TYPE, m_int_type);
	DDX_Control(pDX, IDC_CHK_ST_ID, m_Chk_StId);
	DDX_Control(pDX, IDC_CHK_ST_NAME, m_Chk_StName);
	DDX_Control(pDX, IDC_CHK_ST_DESCR, m_Chk_StDescr);
	DDX_Control(pDX, IDC_CHK_ST_TYPE, m_Chk_StType);
	DDX_Control(pDX, IDC_CHK_ST_CODE_VER, m_Chk_StCodeVer);
	DDX_Control(pDX, IDC_CHK_ST_CODE_VER1, m_Chk_StCodeVer1);
	DDX_Control(pDX, IDC_CHK_ST_CODE_VER2, m_Chk_StCodeVer2);
	DDX_Control(pDX, IDC_CHK_ST_CODE_IZD, m_Chk_StCodeIzd);
	DDX_Control(pDX, IDC_CHK_ST_SOURCE, m_Chk_StSource);
	DDX_Control(pDX, IDC_CHK_ST_VER, m_Chk_StVer);
	DDX_Control(pDX, IDC_CHK_SAVE_QUERY, m_ChkSaveQuery);
	DDX_Control(pDX, ID_EXECUTE_FIND, m_BtnFind);
	DDX_Control(pDX, IDCANCEL, m_BtnCancel);
	DDX_Control(pDX, ID_SHOW_STEPQL, m_BtnShowStepQl);
	DDX_Control(pDX, IDC_CHK_MAKE_TABLE_RESULT, m_CtrlMakeTableResult);
	DDX_Check(pDX, IDC_CHK_MAKE_TABLE_RESULT, m_IsMakeTableResult);
	DDX_Text(pDX, IDC_EDIT_NAME_QUERY, m_StringNameQuery);
	DDX_Check(pDX, IDC_CHK_SAVE_QUERY, m_StateSaveQuery);
	DDX_CBIndex(pDX, IDC_SELECT_FIND_TYPE, m_StateFindType);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFindQueryDlg, CResizableDialog)
	//{{AFX_MSG_MAP(CFindQueryDlg)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_ADJUST, OnSelchangeTabAdjust)
	ON_CBN_SELCHANGE(IDC_SELECT_FIND_TYPE, OnSelchangeSelectFindType)
	ON_BN_CLICKED(ID_ADJUST_ADD, OnAdjustAdd)
	ON_BN_CLICKED(ID_ADJUST_DEL, OnAdjustDel)
	ON_BN_CLICKED(ID_ADJUST_EDIT, OnAdjustEdit)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_ADJUST, OnDblclkListAdjust)
	ON_BN_CLICKED(IDC_CHK_FIND_VERSION, OnChkFindVersion)
	ON_BN_CLICKED(ID_EXECUTE_FIND, OnExecuteFind)
	ON_NOTIFY(NM_RCLICK, IDC_LIST_ADJUST, OnRclickListAdjust)
	ON_BN_CLICKED(ID_SHOW_STEPQL, OnShowStepql)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_ID, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_SAVE_QUERY, OnChkSaveQuery)
	ON_EN_CHANGE(IDC_EDIT_ID, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_NAME_QUERY, OnChangeEditNameQuery)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_NAME, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_DESCR, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_CODE_VER, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_CODE_VER1, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_CODE_VER2, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_CODE_IZD, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_SOURCE, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_TYPE, OnSelchangeComboState)
	ON_CBN_SELCHANGE(IDC_COMBO_STATE_VER, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_CODE_VER, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_CODE_VER1, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_CODE_VER2, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_CODE_IZD, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_DESCR, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_ID, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_NAME, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_SOURCE, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_TYPE, OnSelchangeComboState)
	ON_BN_CLICKED(IDC_CHK_ST_VER, OnSelchangeComboState)
	ON_EN_CHANGE(IDC_EDIT_NAME, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_DESCR, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_CODE_VER, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_CODE_VER1, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_CODE_VER2, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_CODE_IZD, OnChangeEdit)
	ON_EN_CHANGE(IDC_EDIT_VER, OnChangeEdit)
	ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnChangeEdit)
	ON_CBN_SELCHANGE(IDC_COMBO_SOURCE, OnChangeEdit)
	ON_BN_CLICKED(IDC_BTN_TYPE, OnBtnType)
	//}}AFX_MSG_MAP
	//ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipShow)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFindQueryDlg message handlers
// Поведение при выборе/изменении искомого объекта и его аттрибутов

BOOL CFindQueryDlg::OnInitDialog() 
{
	CResizableDialog::OnInitDialog();
	ModifyStyleEx(0, WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT);   
	ModifyStyle(0, WS_MAXIMIZEBOX);   
	EnableToolTips(TRUE);
	UpdateData(FALSE);
	if(m_api==0) return FALSE;
	
	m_BtnFind.SetIcon(GetAplStdIco16(APLSTDICO_PLAY));
	m_BtnFind.SetFlat(FALSE);
	m_BtnCancel.SetIcon(GetAplStdIco16(APLSTDICO_CANCEL));
	m_BtnCancel.SetFlat(FALSE);
	m_BtnShowStepQl.SetIcon(GetAplStdIco16(APLSTDICO_STQL));
	m_BtnShowStepQl.SetFlat(FALSE);
	
	int i;

	COLORMAP  cm;
	cm.from=RGB(192,192,192);
	cm.to=GetSysColor(COLOR_BTNFACE);

	if(!m_is_load_bmp)
	{
		if(aplGetBitPerPixel(this)>8)
			m_name_bmp.LoadMappedBitmap(IDB_FIND_NAME,0,&cm,1);
		else 
			m_name_bmp.LoadMappedBitmap(IDB_FIND_NAME_16,0,&cm,1);
		
		imagelist_tab.Create(IDR_ICONS,16,2,cm.from);
		imagelist_but.Create(IDR_MENU_ICONS,20,2,cm.from);
		m_is_load_bmp=true;
	}
	HBITMAP hBmpOld=m_st_header.SetBitmap(HBITMAP(m_name_bmp));
	::DeleteObject(hBmpOld);
	m_TabAdjust.SetImageList(&imagelist_tab);

	m_adj_add_icon=imagelist_but.ExtractIcon(0);
	m_adj_del_icon=imagelist_but.ExtractIcon(1);
	m_adj_edit_icon=imagelist_but.ExtractIcon(7);
	
	m_adj_add.SetIcon( m_adj_add_icon);
	m_adj_del.SetIcon( m_adj_del_icon);
	m_adj_edit.SetIcon(m_adj_edit_icon);
/**/
	// TODO: Add extra initialization here

	// Заполняем комбобокс источника
	m_EditSource.ResetContent();
	for(i=0;i<m_api->m_prd_mgr.m_list_mob_types.GetSize();i++){
		m_EditSource.AddString(m_api->m_prd_mgr.m_list_mob_types.GetAt(i));
	}

	// Заполняем типы для документов
	aplExtent ext;
	CString buf;
	m_list_document_types.Clear();
	apidata.GetEntityExtent(m_api->m_doc_mgr.e_dt,m_list_document_types);
	m_list_action_types.Clear();
	apidata.GetEntityExtent(m_api->m_bp_mgr.e_bp_type,m_list_action_types);
	m_list_project_types.Clear();
	apidata.GetEntityExtent(m_api->m_project_mgr->e_project_type,m_list_project_types);


	// заполняем комбобоксы выбора типа
	int pos_added;
	InserString2Control(m_CmbxStId,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplNOTLIKE);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplNOTLIKELEFT);
	InserString2Control(m_CmbxStId,CaplQLQuery::aplNOTLIKERIGHT);
//	m_CmbxStId.AddString(APL_T("Равно"));
//	m_CmbxStId.AddString(APL_T("Содержит"));
//	m_CmbxStId.AddString(APL_T("Не равно"));
//	m_CmbxStId.AddString(APL_T("Не содержит"));
	m_CmbxStId.SetCurSel(1);
	InserString2Control(m_CmbxStName,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStName,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStName,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStName,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStName,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStName,CaplQLQuery::aplNOTLIKE);
//	m_CmbxStName.AddString(APL_T("Равно"));
//	m_CmbxStName.AddString(APL_T("Содержит"));
	m_CmbxStName.SetCurSel(1);
	InserString2Control(m_CmbxStDescr,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStDescr,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStDescr,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStDescr,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStDescr,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStDescr,CaplQLQuery::aplNOTLIKE);
//	m_CmbxStDescr.AddString(APL_T("Равно"));
//	m_CmbxStDescr.AddString(APL_T("Содержит"));
	m_CmbxStDescr.SetCurSel(1);
	InserString2Control(m_CmbxStType,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStType,CaplQLQuery::aplNOTEQUAL);
//	InserString2Control(m_CmbxStType,CaplQLQuery::aplNOLOGREL);
//	InserString2Control(m_CmbxStType,CaplQLQuery::aplNOTEXIST);
	pos_added=m_CmbxStType.AddString( APL_T("не задан"));m_CmbxStType.SetItemData(pos_added,CaplQLQuery::aplNOTEXIST);
//	m_CmbxStType.AddString(APL_T("Равен"));
//	m_CmbxStType.AddString(APL_T("Не задан"));
	m_CmbxStType.SetCurSel(0);
	InserString2Control(m_CmbxStCodeVer,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStCodeVer,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStCodeVer,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStCodeVer,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStCodeVer,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStCodeVer,CaplQLQuery::aplNOTLIKE);
//	m_CmbxStCodeVer.AddString(APL_T("Равен"));
//	m_CmbxStCodeVer.AddString(APL_T("Содержит"));
	m_CmbxStCodeVer.SetCurSel(1);
	InserString2Control(m_CmbxStCodeVer1,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStCodeVer1,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStCodeVer1,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStCodeVer1,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStCodeVer1,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStCodeVer1,CaplQLQuery::aplNOTLIKE);
//	m_CmbxStCodeVer1.AddString(APL_T("Равен"));
//	m_CmbxStCodeVer1.AddString(APL_T("Содержит"));
	m_CmbxStCodeVer1.SetCurSel(1);
	InserString2Control(m_CmbxStCodeVer2,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStCodeVer2,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStCodeVer2,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStCodeVer2,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStCodeVer2,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStCodeVer2,CaplQLQuery::aplNOTLIKE);
//	m_CmbxStCodeVer2.AddString(APL_T("Равен"));
//	m_CmbxStCodeVer2.AddString(APL_T("Содержит"));
	m_CmbxStCodeVer2.SetCurSel(1);
	InserString2Control(m_CmbxStCodeIzd,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStCodeIzd,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStCodeIzd,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStCodeIzd,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStCodeIzd,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStCodeIzd,CaplQLQuery::aplNOTLIKE);
//	m_CmbxStCodeIzd.AddString(APL_T("Равен"));
//	m_CmbxStCodeIzd.AddString(APL_T("Содержит"));
	m_CmbxStCodeIzd.SetCurSel(1);
	InserString2Control(m_CmbxStSource,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStSource,CaplQLQuery::aplNOTEQUAL);
//	m_CmbxStSource.AddString(APL_T("Равен"));
	m_CmbxStSource.SetCurSel(0);
	InserString2Control(m_CmbxStVer,CaplQLQuery::aplEQUAL);
	InserString2Control(m_CmbxStVer,CaplQLQuery::aplLIKE);
	InserString2Control(m_CmbxStVer,CaplQLQuery::aplLIKELEFT);
	InserString2Control(m_CmbxStVer,CaplQLQuery::aplLIKERIGHT);
	InserString2Control(m_CmbxStVer,CaplQLQuery::aplNOTEQUAL);
	InserString2Control(m_CmbxStVer,CaplQLQuery::aplNOTLIKE);
	m_EditSource.ResetContent();
	m_EditSource.AddString( APL_T("Не известно"));
	m_EditSource.AddString( APL_T("Покупное"));
	m_EditSource.AddString( APL_T("Изготовляемое"));
	m_EditSource.AddString( APL_T("По кооперации"));
	m_EditSource.AddString( APL_T("Назначается"));

//	m_CmbxStVer.AddString(APL_T("Равно"));
//	m_CmbxStVer.AddString(APL_T("Содержит"));
	m_CmbxStVer.SetCurSel(1);
	
	// Устанавливаем стиль таблицы уточнений
	HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST_ADJUST);
	ListView_SetExtendedListViewStyle(hWnd, 
		ListView_GetExtendedListViewStyle(hWnd) | LVS_EX_FULLROWSELECT /*| LVS_EX_GRIDLINES */);

	// Вкладки на таблице уточнений
	m_TabAdjust.InsertItem(0,TAB_ADJ_NAME_APPROVAL);
	m_TabAdjust.InsertItem(1,TAB_ADJ_NAME_CHARACTER);
	m_TabAdjust.InsertItem(2,TAB_ADJ_NAME_DOCUMENTS);
	//m_TabAdjust.InsertItem(3,TAB_ADJ_NAME_RESOURCES);

	LoadDataFromBuf();
	if(m_mode_slave){
		m_BtnShowStepQl.EnableWindow(FALSE);
		m_BtnFind.SetWindowText(_T("OK"));
		m_BtnFind.SetIcon(GetAplStdIco16(APLSTDICO_OK));
		m_edt_name_query.EnableWindow(false);
	}

	// Заполняем комбобокс типа искомого объекта
	int pos=-1;
	i=0;
	if((m_vis_mode&APL_MODE_SELECT_PRD)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Изделие"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Product);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Product;
		if(m_mode==FindObject_Product)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_PDF)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Версию изделия"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_ProductVer);
		if(m_mode==FindObject_NDef)m_mode=FindObject_ProductVer;
		if(m_mode==FindObject_ProductVer)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_DOC)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Документ"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Document);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Document;
		if(m_mode==FindObject_Document)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_LOT)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Партию изделий"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Lot);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Lot;
		if(m_mode==FindObject_Lot)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_PRDINST)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Экземпляр изделия"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_ProductInst);
		if(m_mode==FindObject_NDef)m_mode=FindObject_ProductInst;
		if(m_mode==FindObject_ProductInst)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_BP)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Бизнес-процесс"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_BP);
		if(m_mode==FindObject_NDef)m_mode=FindObject_BP;
		if(m_mode==FindObject_BP)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_BPINST)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Экземпляр бизнес-процесса"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_BPInst);
		if(m_mode==FindObject_NDef)m_mode=FindObject_BPInst;
		if(m_mode==FindObject_BPInst)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_CATEGORY)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Категорию"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Category);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Category;
		if(m_mode==FindObject_Category)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_FOLDER)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Папку"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Folder);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Folder;
		if(m_mode==FindObject_Folder)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_PROJECT)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Проект"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Project);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Project;
		if(m_mode==FindObject_Project)pos=i;
		i++;
	}
	// специальных флагов для задачи и процесса нет - кончились биты в маске :-(
	// поэтому будем показывать их только в режиме "показать все"
	if((m_vis_mode==0 )&& m_api->m_data.GetEntityBN(_T("apl_action"))!=0)
	{
		i=m_SelectFindType.InsertString(i, APL_T("Задача"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Task);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Task;
		if(m_mode==FindObject_Task)pos=i;
		i++;

		i=m_SelectFindType.InsertString(i, APL_T("Процесс"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Process);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Process;
		if(m_mode==FindObject_Process)pos=i;
		i++;
	}

	if((m_vis_mode&APL_MODE_SELECT_PERSON)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Сотрудника"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Person);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Person;
		if(m_mode==FindObject_Person)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_ORG)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Рабочую группу"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Organization);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Organization;
		if(m_mode==FindObject_Organization)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_CHANGE)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Изменение"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Change);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Change;
		if(m_mode==FindObject_Change)pos=i;
		i++;
	}
	if( m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Запрос"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Find);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Find;
		if(m_mode==FindObject_Find)pos=i;
		i++;
	}
	if( m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Сводная таблица"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_CombinedTable);
		if(m_mode==FindObject_NDef)m_mode=FindObject_CombinedTable;
		if(m_mode==FindObject_CombinedTable)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_CLASSIF_SYSTEM)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Справочник"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_ClassifSystem);
		if(m_mode==FindObject_NDef)m_mode=FindObject_ClassifSystem;
		if(m_mode==FindObject_ClassifSystem)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_CLASSIF_ELEMENT)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Элемент структуры справочника"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_ClassifLevel);
		if(m_mode==FindObject_NDef)m_mode=FindObject_ClassifLevel;
		if(m_mode==FindObject_ClassifLevel)pos=i;
		i++;
	}
	if((m_vis_mode&APL_MODE_SELECT_REQUIREMENT)>0 || m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Требование"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_Requirement);
		if(m_mode==FindObject_NDef)m_mode=FindObject_Requirement;
		if(m_mode==FindObject_Requirement)pos=i;
		i++;
	}
	if( m_vis_mode==0){
		i=m_SelectFindType.InsertString(i, APL_T("Объекты всех типов"));
		m_SelectFindType.SetItemData(i,(DWORD) FindObject_All);
		if(m_mode==FindObject_NDef)m_mode=FindObject_All;
		if(m_mode==FindObject_All)pos=i;
		i++;
	}
	if(pos==-1)pos=0;
	// Устанавливаем активный
	m_SelectFindType.SetCurSel(pos);
	if(i==1){
		// выбрать все равно ничего нельзя
		m_SelectFindType.EnableWindow(FALSE);
		m_single_mode=true;
	}

	m_CtrlMakeTableResult.EnableWindow(m_can_make_table);
	m_ChkSaveQuery.EnableWindow(m_can_save);

	m_page_num=adj_appr;
	m_TabAdjust.SetCurSel((int)m_page_num);
	
	DrawTabPage();
	OnSelchangeSelectFindType();
	OnChkSaveQuery();
	
	if(m_read_only){
		m_edt_name_query.EnableWindow(FALSE);
		m_SelectFindType.EnableWindow(FALSE);
		m_EditId.EnableWindow(FALSE);m_Chk_StId.EnableWindow(FALSE);m_CmbxStId.EnableWindow(FALSE);
		m_EditName.EnableWindow(FALSE);m_Chk_StName.EnableWindow(FALSE);m_CmbxStName.EnableWindow(FALSE);
		m_EditDescr.EnableWindow(FALSE);m_Chk_StDescr.EnableWindow(FALSE);m_CmbxStDescr.EnableWindow(FALSE);
		m_EditType.EnableWindow(FALSE);m_Chk_StType.EnableWindow(FALSE);m_CmbxStType.EnableWindow(FALSE);
		m_EditCodeVer.EnableWindow(FALSE);m_Chk_StCodeVer.EnableWindow(FALSE);m_CmbxStCodeVer.EnableWindow(FALSE);
		m_EditCodeVer1.EnableWindow(FALSE);m_Chk_StCodeVer1.EnableWindow(FALSE);m_CmbxStCodeVer1.EnableWindow(FALSE);
		m_EditCodeVer2.EnableWindow(FALSE);m_Chk_StCodeVer2.EnableWindow(FALSE);m_CmbxStCodeVer2.EnableWindow(FALSE);
		m_EditCodeIzd.EnableWindow(FALSE);m_Chk_StCodeIzd.EnableWindow(FALSE);m_CmbxStCodeIzd.EnableWindow(FALSE);
		m_EditSource.EnableWindow(FALSE);m_Chk_StSource.EnableWindow(FALSE);m_CmbxStSource.EnableWindow(FALSE);
		m_EditVer.EnableWindow(FALSE);m_Chk_StVer.EnableWindow(FALSE);m_CmbxStVer.EnableWindow(FALSE);
		m_adj_add.EnableWindow(FALSE);m_adj_del.EnableWindow(FALSE);
		m_CtrlMakeTableResult.EnableWindow(FALSE);

	}
	m_changed=false;

	AddAnchor(IDC_TAB_ADJUST, TOP_LEFT, TOP_RIGHT);
	AddAnchor(IDC_LIST_ADJUST, TOP_LEFT, BOTTOM_RIGHT);

	AddAnchor(ID_ADJUST_ADD, TOP_RIGHT, TOP_RIGHT);
	AddAnchor(ID_ADJUST_DEL, TOP_RIGHT, TOP_RIGHT);
	AddAnchor(ID_ADJUST_EDIT, TOP_RIGHT, TOP_RIGHT);
				
	AddAnchor(IDC_CHK_MAKE_TABLE_RESULT, BOTTOM_LEFT, BOTTOM_LEFT);

	AddAnchor(ID_EXECUTE_FIND, BOTTOM_RIGHT, BOTTOM_RIGHT);
	AddAnchor(ID_SHOW_STEPQL, BOTTOM_RIGHT, BOTTOM_RIGHT);
	AddAnchor(IDCANCEL, BOTTOM_RIGHT, BOTTOM_RIGHT);
				
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

// ЯАИ:  Перенесено в CaplTranslateDialog
/*BOOL CFindQueryDlg::OnToolTipShow( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
	TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
	UINT nID = pNMHDR->idFrom;
	CString buf;
	
	if (pTTT->uFlags & TTF_IDISHWND){
		nID = ::GetDlgCtrlID((HWND)nID);
		//CString tooltip_text;
		//tooltip_text.LoadString(nID);
		//		if(nID==IDC_CHK_NAME){m_ChkName.GetWindowText(buf);tooltip_text+=buf;}
		//pTTT->lpszText = _tcsdup(tooltip_text);
		pTTT->lpszText = (LPTSTR)nID;
		pTTT->hinst = AfxGetResourceHandle();
		return(true);
	}
	return false;
}*/



// Нажатие выбор значений в состояниях
void CFindQueryDlg::OnSelchangeComboState() 
{
	// TODO: Add your control notification handler code here
	m_changed=true;
	if(m_Chk_StId.GetCheck()==0){
		m_state_id=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_id=(CaplQLQuery::aplQLLogRelation)(m_CmbxStId.GetItemData(m_CmbxStId.GetCurSel()));
	}
	if(m_Chk_StName.GetCheck()==0){
		m_state_name=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_name=(CaplQLQuery::aplQLLogRelation)(m_CmbxStName.GetItemData(m_CmbxStName.GetCurSel()));
	}
	if(m_Chk_StDescr.GetCheck()==0){
		m_state_descr=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_descr=(CaplQLQuery::aplQLLogRelation)(m_CmbxStDescr.GetItemData(m_CmbxStDescr.GetCurSel()));
	}
	if(m_Chk_StType.GetCheck()==0){
		m_state_type=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_type=(CaplQLQuery::aplQLLogRelation)(m_CmbxStType.GetItemData(m_CmbxStType.GetCurSel()));
	}
	if(m_Chk_StCodeVer.GetCheck()==0){
		m_state_code_ver=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_code_ver=(CaplQLQuery::aplQLLogRelation)(m_CmbxStCodeVer.GetItemData(m_CmbxStCodeVer.GetCurSel()));
	}
	if(m_Chk_StCodeVer1.GetCheck()==0){
		m_state_code_ver1=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_code_ver1=(CaplQLQuery::aplQLLogRelation)(m_CmbxStCodeVer1.GetItemData(m_CmbxStCodeVer1.GetCurSel()));
	}
	if(m_Chk_StCodeVer2.GetCheck()==0){
		m_state_code_ver2=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_code_ver2=(CaplQLQuery::aplQLLogRelation)(m_CmbxStCodeVer2.GetItemData(m_CmbxStCodeVer2.GetCurSel()));
	}
	if(m_Chk_StCodeIzd.GetCheck()==0){
		m_state_code_izd=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_code_izd=(CaplQLQuery::aplQLLogRelation)(m_CmbxStCodeIzd.GetItemData(m_CmbxStCodeIzd.GetCurSel()));
	}
	if(m_Chk_StSource.GetCheck()==0){
		m_state_source=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_source=(CaplQLQuery::aplQLLogRelation)(m_CmbxStSource.GetItemData(m_CmbxStSource.GetCurSel()));
	}
	if(m_Chk_StVer.GetCheck()==0){
		m_state_ver=CaplQLQuery::aplNOLOGREL;
	}else{
		m_state_ver=(CaplQLQuery::aplQLLogRelation)(m_CmbxStVer.GetItemData(m_CmbxStVer.GetCurSel()));
	}
	SetEditComboState();
}

void CFindQueryDlg::SetEditComboState()
{
	m_changed=true;
	m_EditId.EnableWindow(m_state_id!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStId.EnableWindow(m_state_id!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StId.SetCheck(m_state_id!=CaplQLQuery::aplNOLOGREL);
	
	m_EditName.EnableWindow(m_state_name!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStName.EnableWindow(m_state_name!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StName.SetCheck(m_state_name!=CaplQLQuery::aplNOLOGREL);
	
	m_EditDescr.EnableWindow(m_state_descr!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStDescr.EnableWindow(m_state_descr!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StDescr.SetCheck(m_state_descr!=CaplQLQuery::aplNOLOGREL);
	
	m_EditType.EnableWindow(m_state_type!=CaplQLQuery::aplNOLOGREL && m_state_type!=CaplQLQuery::aplNOTEXIST);
	m_BtnType.EnableWindow(m_state_type!=CaplQLQuery::aplNOLOGREL && m_state_type!=CaplQLQuery::aplNOTEXIST && (m_mode==FindObject_Document || m_mode==FindObject_BP));
	m_CmbxStType.EnableWindow(m_state_type!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StType.SetCheck(m_state_type!=CaplQLQuery::aplNOLOGREL);
	
	m_EditCodeVer.EnableWindow(m_state_code_ver!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStCodeVer.EnableWindow(m_state_code_ver!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StCodeVer.SetCheck(m_state_code_ver!=CaplQLQuery::aplNOLOGREL);
	
	m_EditCodeVer1.EnableWindow(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStCodeVer1.EnableWindow(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StCodeVer1.SetCheck(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL);
	
	m_EditCodeVer2.EnableWindow(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStCodeVer2.EnableWindow(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StCodeVer2.SetCheck(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL);
	
	m_EditCodeIzd.EnableWindow(m_state_code_izd!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStCodeIzd.EnableWindow(m_state_code_izd!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StCodeIzd.SetCheck(m_state_code_izd!=CaplQLQuery::aplNOLOGREL);
	
	m_EditSource.EnableWindow(m_state_source!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStSource.EnableWindow(m_state_source!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StSource.SetCheck(m_state_source!=CaplQLQuery::aplNOLOGREL);
	
	m_EditVer.EnableWindow(m_state_ver!=CaplQLQuery::aplNOLOGREL);
	m_CmbxStVer.EnableWindow(m_state_ver!=CaplQLQuery::aplNOLOGREL);
	m_Chk_StVer.SetCheck(m_state_ver!=CaplQLQuery::aplNOLOGREL);
	
}

void CFindQueryDlg::OnChkSaveQuery() 
{
	// TODO: Add your control notification handler code here
	m_changed=true;
	//m_edt_name_query.EnableWindow(m_ChkSaveQuery.GetCheck());
	//m_edt_descr_query.EnableWindow(m_ChkSaveQuery.GetCheck());
}

void CFindQueryDlg::OnChkFindVersion() 
{
	// TODO: Add your control notification handler code here
	m_changed=true;
	OnSelchangeSelectFindType();
}

// Смена объекта поиска - смена заголовков у строк объекта поиска
void CFindQueryDlg::OnSelchangeSelectFindType() 
{
	// TODO: Add your control notification handler code here
	m_changed=true;
	TypeFindObject old_mode=m_mode;
	CString str;
	CaplInstance *inst;
	int i,k;
	i=m_SelectFindType.GetCurSel();
	if(!m_single_mode){
		m_mode=(TypeFindObject)m_SelectFindType.GetItemData(i);
	}
	if(m_mode!=old_mode)m_int_type=0;
	m_ctrl_find_version.ShowWindow(SW_HIDE);
	m_CtrlMakeTableResult.EnableWindow(m_can_make_table);
	switch(m_mode)
	{
	case FindObject_Product: // Product
		SetStateName( APL_T("Обозначение изделия"), APL_T("Наименование изделия"), APL_T("Описание изделия"),
			_T(""),_T(""),_T(""),_T(""), APL_T("Код изделия"),_T(""),_T(""));
//		m_ctrl_find_version.ShowWindow(SW_NORMAL);
//		m_ctrl_find_version.SetWindowText(APL_T("Не искать версии изделий"));
		m_mode_text= APL_T("изделие");
		break;
	case FindObject_ProductVer: // Product version
		SetStateName( APL_T("Обозначение изделия"), APL_T("Наименование изделия"), APL_T("Описание изделия"),
			 APL_T("Тип версии изделия"), APL_T("Код версии изделия"), APL_T("Код версии изделия 1"), APL_T("Код версии изделия 2"), APL_T("Код изделия"),
			 APL_T("Источник версии изделия"), APL_T("Версия"));
//		m_ctrl_find_version.ShowWindow(SW_NORMAL);
//		m_ctrl_find_version.SetWindowText(APL_T("Не искать версии изделий"));
		m_mode_text= APL_T("версия изделия");
		break;
	case FindObject_Document: // Doc
		SetStateName( APL_T("Обозначение документа"), APL_T("Наименование документа"), APL_T("Описание документа"),
			 APL_T("Вид документа"), APL_T("Имя исходного файла"),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_ctrl_find_version.ShowWindow(SW_NORMAL);
		m_ctrl_find_version.SetWindowText( APL_T("Искать только активные версии документов"));
		m_ctrl_find_version.EnableWindow(TRUE);
		m_mode_text= APL_T("документ");
		break;
	case FindObject_Lot: // Lot
		SetStateName( APL_T("Обозначение партии"),_T(""), APL_T("Описание партии"),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("партия изделий");
		break;
	case FindObject_ProductInst: // Product Inst
		SetStateName( APL_T("Обозначение"), APL_T("Серийный номер"), APL_T("Описание"),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("экземпляр изделия");
		break;
	case FindObject_BP: // Action
		SetStateName( APL_T("Обозначение БП"), APL_T("Наименование БП"), APL_T("Описание БП"),
			 APL_T("Тип БП"),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("бизнес процесс");
		m_ctrl_find_version.ShowWindow(SW_NORMAL);
		m_ctrl_find_version.SetWindowText( APL_T("Искать только активные версии БП"));
		m_ctrl_find_version.SetCheck(1);
		m_ctrl_find_version.EnableWindow(FALSE);
		break;
	case FindObject_BPInst: // Action
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"),
			 APL_T("Описание"),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("экземпляр БП");
		break;
	case FindObject_Category:
		SetStateName( APL_T("Обозначение категории"), APL_T("Наименование категории"), APL_T("Описание категории"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("категория");
		break;
	case FindObject_Folder:
		SetStateName(_T(""), APL_T("Наименование папки"), APL_T("Описание папки"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("папка");
		break;
	case FindObject_Project:
		SetStateName( APL_T("Обозначение проекта"), APL_T("Наименование проекта"), APL_T("Описание проекта"),
			 APL_T("Тип проекта"),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("проект");
		break;
	case FindObject_Person:
		SetStateName( APL_T("Обозначение сотрудника"), APL_T("Фамилия сотрудника"), APL_T("Имя сотрудника"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""), APL_T("Отчество сотрудника"));
		m_mode_text= APL_T("сотрудник");
		break;
	case FindObject_Organization:
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"), APL_T("Описание"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("рабочая группа");
		break;
	case FindObject_Find:
		SetStateName("", APL_T("Наименование запроса"),_T(""),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("запрос");
		//m_CtrlMakeTableResult.EnableWindow(false);
		//m_CtrlMakeTableResult.SetCheck(false);
		break;
	case FindObject_CombinedTable:
		SetStateName(_T(""), APL_T("Наименование таблицы"),_T(""),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("сводная таблица");
		//m_CtrlMakeTableResult.EnableWindow(false);
		//m_CtrlMakeTableResult.SetCheck(false);
		break;
	case FindObject_Change:
		SetStateName( APL_T("Обозначение изменения"), APL_T("Наименование изменения"),_T(""),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("изменение");
		//m_CtrlMakeTableResult.EnableWindow(false);
		//m_CtrlMakeTableResult.SetCheck(false);
		break;
	case FindObject_ClassifSystem:
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"), APL_T("Описание"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("справочник");
		break;
	case FindObject_ClassifLevel:
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"), APL_T("Описание"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("элемент структуры справочника");
		break;
	case FindObject_Task:
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"), APL_T("Описание"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("задача");
		break;
	case FindObject_Process:
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"), APL_T("Описание"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("процесс");
		break;
	case FindObject_Requirement:
		SetStateName( APL_T("Обозначение"), APL_T("Наименование"), APL_T("Текст"),
			_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("требование");
		break;
	case FindObject_All:
		SetStateName(_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""));
		m_mode_text= APL_T("все");
		//m_CtrlMakeTableResult.EnableWindow(false);
		//m_CtrlMakeTableResult.SetCheck(false);
		break;
	}
	// Заполняем комбобокс типа 
	if(m_mode==FindObject_ProductVer){
		m_EditType.ResetContent();
		for(i=0;i<m_api->m_prd_mgr.m_list_pdf_types.GetSize();i++){
			m_EditType.AddString(m_api->m_prd_mgr.m_list_pdf_types.GetAt(i));
		}
		m_EditType.SetCurSel(m_int_type);
		//if(m_CmbxStType.GetCount()==2)m_CmbxStType.DeleteString(1);
		for(i=0;i<m_CmbxStType.GetCount();i++){
			if(CaplQLQuery::aplNOTEXIST==((CaplQLQuery::aplQLLogRelation)m_CmbxStType.GetItemData(i))){
				m_CmbxStType.DeleteString(i);
				break;
			}
		}
	}else{
		//if(m_CmbxStType.GetCount()==1)m_CmbxStType.AddString(APL_T("Не задан"));
		for(i=0;i<m_CmbxStType.GetCount();i++){
			if(CaplQLQuery::aplNOTEXIST==((CaplQLQuery::aplQLLogRelation)m_CmbxStType.GetItemData(i))){
				break;
			}
		}
		int pos_added;
		if(i==m_CmbxStType.GetCount()){pos_added=m_CmbxStType.AddString( APL_T("не задан"));m_CmbxStType.SetItemData(pos_added,CaplQLQuery::aplNOTEXIST);}
	}
	if(m_mode==FindObject_Document){
		m_EditType.ResetContent();
		for(i=0;i<m_list_document_types.Size;i++)
		{
			inst = m_list_document_types.GetAt(i);
			if(inst==0)continue;
			if(inst->GetAccessmode()==aplNO) continue;
			apidata.GetAttr(inst,m_api->m_doc_mgr.a_dt_pdt,str);
			k=m_EditType.AddString(str);
			m_EditType.SetItemData(k,(DWORD)m_list_document_types.GetAt(i));
		}
		m_EditType.SetCurSel(m_int_type);
	}
	if(m_mode==FindObject_BP){
		m_EditType.ResetContent();
		for(i=0;i<m_list_action_types.Size;i++){
			apidata.GetAttr(m_list_action_types.GetAt(i),m_api->m_bp_mgr.a_bp_type_name,str);
			k=m_EditType.AddString(str);
			m_EditType.SetItemData(k,(DWORD)m_list_action_types.GetAt(i));
		}
		m_EditType.SetCurSel(m_int_type);
	}
	if(m_mode==FindObject_Project){
		m_EditType.ResetContent();
		for(i=0;i<m_list_project_types.Size;i++){
			apidata.GetAttr(m_list_project_types.GetAt(i),m_api->m_project_mgr->a_project_type_name,str);
			k=m_EditType.AddString(str);
			m_EditType.SetItemData(k,(DWORD)m_list_project_types.GetAt(i));
		}
		m_EditType.SetCurSel(m_int_type);
	}
	
	OnSelchangeComboState();
	SetTabPagesActive(old_mode);
	DrawTabPage();
}

// Установка заголовка и состояния поля "наименование" - "серийный номер"
void CFindQueryDlg::SetStateName(CString id,CString name,CString descr,
								 CString type,CString code_ver,CString code_ver1,
								 CString code_ver2,CString code_izd,CString source,CString ver)
{
	
	UpdateData(TRUE);
	if(id==_T("")){
		m_CmbxStId.SetCurSel(1);
		m_Chk_StId.SetWindowText( APL_T("Обозначение"));
		m_state_id=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_id!=0)m_CmbxStId.SetCurSel(m_state_id-1);
		if(m_state_id!=0){SelectStringInCombo(m_CmbxStId,m_state_id);}
		m_Chk_StId.SetWindowText(id);
	}
	m_Chk_StId.EnableWindow(id!=_T(""));

	if(name==_T("")){
		m_CmbxStName.SetCurSel(1);
		m_Chk_StName.SetWindowText( APL_T("Наименование"));
		m_state_name=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_name!=0)m_CmbxStName.SetCurSel(m_state_name-1);
		if(m_state_name!=0){SelectStringInCombo(m_CmbxStName,m_state_name);}
		m_Chk_StName.SetWindowText(name);
	}
	m_Chk_StName.EnableWindow(name!=_T(""));

	if(descr==_T("")){
		m_CmbxStDescr.SetCurSel(1);
		m_Chk_StDescr.SetWindowText( APL_T("Описание"));
		m_state_descr=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_descr!=0)m_CmbxStDescr.SetCurSel(m_state_descr-1);
		if(m_state_descr!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStDescr,m_state_descr);}
		m_Chk_StDescr.SetWindowText(descr);
	}
	m_Chk_StDescr.EnableWindow(descr!=_T(""));
	
	if(type==_T("")){
		m_CmbxStType.SetCurSel(0);
		m_Chk_StType.SetWindowText( APL_T("Тип"));
		m_state_type=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_type!=0)m_CmbxStType.SetCurSel(m_state_type-1);
		if(m_state_type!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStType,m_state_type);}
		m_Chk_StType.SetWindowText(type);
	}
	m_Chk_StType.EnableWindow (type!=_T("") );
	
	if(code_ver==_T("")){
		m_CmbxStCodeVer.SetCurSel(1);
		m_Chk_StCodeVer.SetWindowText( APL_T("Код"));
		m_state_code_ver=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_code_ver!=0)m_CmbxStCodeVer.SetCurSel(m_state_code_ver-1);
		if(m_state_code_ver!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStCodeVer,m_state_code_ver);}
		m_Chk_StCodeVer.SetWindowText(code_ver);
	}
	m_Chk_StCodeVer.EnableWindow(code_ver!=_T(""));
	
	if(code_ver1==_T("")){
		m_CmbxStCodeVer1.SetCurSel(1);
		m_Chk_StCodeVer1.SetWindowText( APL_T("Код1"));
		m_state_code_ver1=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_code_ver1!=0)m_CmbxStCodeVer1.SetCurSel(m_state_code_ver1-1);
		if(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStCodeVer1,m_state_code_ver1);}
		m_Chk_StCodeVer1.SetWindowText(code_ver1);
	}
	m_Chk_StCodeVer1.EnableWindow(code_ver1!=_T(""));
	
	if(code_ver2==_T("")){
		m_CmbxStCodeVer2.SetCurSel(1);
		m_Chk_StCodeVer2.SetWindowText( APL_T("Код2"));
		m_state_code_ver2=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_code_ver2!=0)m_CmbxStCodeVer2.SetCurSel(m_state_code_ver2-1);
		if(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStCodeVer2,m_state_code_ver2);}
		m_Chk_StCodeVer2.SetWindowText(code_ver2);
	}
	m_Chk_StCodeVer2.EnableWindow(code_ver2!=_T(""));
	
	if(code_izd==_T("")){
		m_CmbxStCodeIzd.SetCurSel(1);
		m_Chk_StCodeIzd.SetWindowText( APL_T("Код изделия"));
		m_state_code_izd=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_code_izd!=0)m_CmbxStCodeIzd.SetCurSel(m_state_code_izd-1);
		if(m_state_code_izd!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStCodeIzd,m_state_code_izd);}
		m_Chk_StCodeIzd.SetWindowText(code_izd);
	}
	m_Chk_StCodeIzd.EnableWindow(code_izd!=_T(""));
	
	if(source==_T("")){
		m_CmbxStSource.SetCurSel(0);
		m_Chk_StSource.SetWindowText( APL_T("Источник"));
		m_state_source=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_source!=0)m_CmbxStSource.SetCurSel(m_state_source-1);
		if(m_state_source!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStSource,m_state_source);}
		m_Chk_StSource.SetWindowText(source);
	}
	m_Chk_StSource.EnableWindow(source !=_T(""));
	
	if(ver==_T("")){
		m_CmbxStVer.SetCurSel(1);
		m_Chk_StVer.SetWindowText( APL_T("Версия"));
		m_state_ver=CaplQLQuery::aplNOLOGREL;
	}else{
		//if(m_state_ver!=0)m_CmbxStVer.SetCurSel(m_state_ver-1);
		if(m_state_ver!=CaplQLQuery::aplNOLOGREL){SelectStringInCombo(m_CmbxStVer,m_state_ver);}
		m_Chk_StVer.SetWindowText(ver);
	}
	m_Chk_StVer.EnableWindow(ver!=_T(""));
	
	SetEditComboState();
}


/////////////////////////////////////////////////////////////////////////////
// CFindQueryDlg математика отображения-поведения таблицы уточнений

// Скрывает (открывает) закладки документов и характеристик 
void CFindQueryDlg::SetTabPagesActive(TypeFindObject old_mode)
{
	int count=m_TabAdjust.GetItemCount();
	if(count==1){
		if(old_mode==FindObject_Requirement){
			m_TabAdjust.InsertItem(0,TAB_ADJ_NAME_APPROVAL);
			m_TabAdjust.InsertItem(1,TAB_ADJ_NAME_CHARACTER);
		}
	}else if(count==2){
		if(old_mode==FindObject_Category || old_mode==FindObject_Person || old_mode==FindObject_Organization ){
			m_TabAdjust.InsertItem(0,TAB_ADJ_NAME_APPROVAL);
		}else if(old_mode==FindObject_Change){
			m_TabAdjust.InsertItem(1,TAB_ADJ_NAME_CHARACTER);
		}
	}else if(count==4){
		m_TabAdjust.DeleteItem(3);
		if(m_page_num==adj_res){
			m_page_num=adj_char;
			m_TabAdjust.SetCurSel(0);
		}
	}
	SetTabPagesEnable(TRUE);
	switch(m_mode)
	{
	case FindObject_Product: // Product
	case FindObject_ProductVer: // Product Version
	case FindObject_Lot: // Lot
	case FindObject_ProductInst: // Product Inst
	case FindObject_Project: // Project
	case FindObject_All: // все кроме категории и папки
		break;
	case FindObject_Document: // Doc
		//m_TabAdjust.InsertItem(3,TAB_ADJ_NAME_BLOBS);
		break;
	case FindObject_BP: // 
	case FindObject_BPInst: // 
		//Отключено до лучших времен m_TabAdjust.InsertItem(3,TAB_ADJ_NAME_RESOURCES);
		break;
	case FindObject_Category:
	case FindObject_Person:
	case FindObject_Organization:
		m_TabAdjust.DeleteItem(0);
		if(m_page_num==adj_appr){
			m_page_num=adj_char;
			m_TabAdjust.SetCurSel(0);
		}
		break;
	case FindObject_Change:
		m_TabAdjust.DeleteItem(1);
		if(m_page_num==adj_char){
			m_page_num=adj_appr;
			m_TabAdjust.SetCurSel(0);
		}
		break;
	case FindObject_Requirement:
		m_TabAdjust.DeleteItem(0);
		m_TabAdjust.DeleteItem(1);
		if(m_page_num==adj_char || m_page_num==adj_appr){
			m_page_num=adj_doc;
			m_TabAdjust.SetCurSel(0);
		}
		break;
	case FindObject_Folder:
	case FindObject_Find:
	case FindObject_CombinedTable:
	case FindObject_ClassifSystem:
	case FindObject_ClassifLevel:
	case FindObject_Process:
	case FindObject_Task:
		SetTabPagesEnable(FALSE);
		break;
	}
	SetHiglight();
}

void CFindQueryDlg::SetHiglight()
{
	int count=m_TabAdjust.GetItemCount();
	TCITEM TabCtrlItem;
	TabCtrlItem.mask=TCIF_IMAGE;
	int nItem;
	// approval
	nItem=count==2?-1:0;
	m_TabAdjust.GetItem(nItem, &TabCtrlItem);
	if(m_list_approval.Size>0){TabCtrlItem.iImage=3;}else{TabCtrlItem.iImage=2;}
	m_TabAdjust.SetItem(nItem, &TabCtrlItem);
	
	// характеристики
	nItem=count==2?0:1;
	m_TabAdjust.GetItem(nItem, &TabCtrlItem);
	if(m_list_char.Size>0){TabCtrlItem.iImage=5;}else{TabCtrlItem.iImage=4;}
	m_TabAdjust.SetItem(nItem, &TabCtrlItem);
	
	// документы
	nItem=count==2?1:2;
	m_TabAdjust.GetItem(nItem, &TabCtrlItem);
	if(m_list_doc.Size>0){TabCtrlItem.iImage=7;}else{TabCtrlItem.iImage=6;}
	m_TabAdjust.SetItem(nItem, &TabCtrlItem);

	// ресурсы
	if(m_mode==FindObject_BP || m_mode==FindObject_BPInst){
		nItem=count==2?2:3;
		m_TabAdjust.GetItem(nItem, &TabCtrlItem);
		if(m_list_res.Size>0){TabCtrlItem.iImage=9;}else{TabCtrlItem.iImage=8;}
		m_TabAdjust.SetItem(nItem, &TabCtrlItem);
	}
	// поиск по БЛОБам
	if(m_mode==FindObject_Document){
		nItem=count==2?2:3;
		m_TabAdjust.GetItem(nItem, &TabCtrlItem);
		if(m_list_blob.Size>0){TabCtrlItem.iImage=11;}else{TabCtrlItem.iImage=10;}
		m_TabAdjust.SetItem(nItem, &TabCtrlItem);
	}
}

void CFindQueryDlg::SetTabPagesEnable(BOOL mode)
{
	m_TabAdjust.EnableWindow(mode);
	if(!m_read_only){
		m_adj_add.EnableWindow(mode);
		m_adj_del.EnableWindow(mode);
	}
	m_adj_edit.EnableWindow(mode);
	m_ListAdjust.EnableWindow(mode);
}

// Клик по закладке блокнота
void CFindQueryDlg::OnSelchangeTabAdjust(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int pos=m_TabAdjust.GetCurSel();
/*	Старый математический способ
	if(m_mode==FindObject_Category || m_mode==FindObject_Person || m_mode==FindObject_Organization){
		m_page_num=(TypeAdj)(pos+1);
	}else{
		m_page_num=(TypeAdj)pos;
	}
*/
	CString str;
	TCITEM item_data;
	item_data.mask=TCIF_TEXT;
	item_data.cchTextMax=256;
	TCHAR* cbuf=new TCHAR[item_data.cchTextMax];
	item_data.pszText=cbuf;
	m_TabAdjust.GetItem(pos,&item_data);
	str=cbuf;
	delete[] cbuf;
	if     (str==TAB_ADJ_NAME_APPROVAL ){m_page_num=adj_appr;
	}else if(str==TAB_ADJ_NAME_CHARACTER){m_page_num=adj_char;
	}else if(str==TAB_ADJ_NAME_DOCUMENTS){m_page_num=adj_doc;
	}else if(str==TAB_ADJ_NAME_RESOURCES){m_page_num=adj_res;
	//}else if(str==TAB_ADJ_NAME_BLOBS){m_page_num=adj_blob;
	}else{
		return;
	}
	DrawTabPage();
	*pResult = 0;
}

// Формируем столбцы таблицы уточнений - в зависимости от выбранной вкладки блокнота
void CFindQueryDlg::DrawTabPage()
{
	RECT rect;
	int i;
	// удаление столбцов
	int nColumnCount = m_ListAdjust.GetHeaderCtrl()->GetItemCount();
	for (i=0;i < nColumnCount;i++){
		m_ListAdjust.DeleteColumn(0);
	}
	// Для определения ширины столбца надо знать общую ширину
	m_ListAdjust.GetWindowRect(&rect);
	int width=rect.right-rect.left;
	int delt;
	if(!m_read_only){
		m_adj_add.EnableWindow(TRUE);
		m_adj_del.EnableWindow(TRUE);
	}
	m_adj_edit.EnableWindow(TRUE);
	if(m_page_num==adj_appr)
	{
		// статусы
		delt=div(width,20).quot;
		m_ListAdjust.InsertColumn(CT_APPR_IS_EXIST, APL_T("Наличие"),LVCFMT_LEFT,delt*2);
		m_ListAdjust.InsertColumn(CT_APPR_IS_APPR, APL_T("Статус"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_APPR_IS_DESCR, APL_T("Описание"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_APPR_IS_PERSON, APL_T("Сотрудник"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_APPR_IS_ROLE, APL_T("Роль"),LVCFMT_LEFT,delt*2);
		m_ListAdjust.InsertColumn(CT_APPR_IS_DATE, APL_T("Дата"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_APPR_IS_REVOC_DATE, APL_T("Дата аннулир."),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_APPR_IS_IS_DIG_SIGN, APL_T("ЭЦП"),LVCFMT_LEFT,delt*1);
	}
	else if(m_page_num==adj_char)
	{
		// Характеристики
		delt=div(width,20).quot;
		m_ListAdjust.InsertColumn(CT_CHAR_IS_EXIST, APL_T("Наличие"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_CHAR_NAME, APL_T("Наименование"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_CHAR_TYPE, APL_T("Тип"),LVCFMT_LEFT,delt*4);
		m_ListAdjust.InsertColumn(CT_CHAR_RELATION, APL_T("Отношение"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_CHAR_VALUE, APL_T("Значение"),LVCFMT_LEFT,delt*4);
	}
	else if(m_page_num==adj_doc)
	{
		// Документы
		delt=div(width,20).quot;
		m_ListAdjust.InsertColumn(CT_DOC_IS_EXIST, APL_T("Наличие"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_DOC_ID, APL_T("Обозначение"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_DOC_NAME, APL_T("Наименование"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_DOC_KIND, APL_T("Вид документа"),LVCFMT_LEFT,delt*5);
/*
		m_adj_add.EnableWindow(FALSE);
		m_adj_del.EnableWindow(FALSE);
		m_adj_edit.EnableWindow(FALSE);
*/
	}
	else if(m_page_num==adj_res)
	{
		// ресурсы
		delt=div(width,20).quot;
		m_ListAdjust.InsertColumn(CT_RES_IS_EXIST, APL_T("Наличие"),LVCFMT_LEFT,delt*3);
		m_ListAdjust.InsertColumn(CT_RES_ID_R, APL_T("Обозначение ресурса"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_RES_NAME_R, APL_T("Наименование ресурса"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_RES_TYPE_R, APL_T("Тип ресурса"),LVCFMT_LEFT,delt*5);
		m_ListAdjust.InsertColumn(CT_RES_ID_O, APL_T("Обозначение объекта"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_RES_NAME_O, APL_T("Наименование объекта"),LVCFMT_LEFT,delt*6);
		m_ListAdjust.InsertColumn(CT_RES_TYPE_O, APL_T("Тип объекта"),LVCFMT_LEFT,delt*5);
	}
	else if(m_page_num==adj_blob)
	{
		delt=div(width,20).quot;
		if(m_api->m_data.CanFindInBLOB()){
			m_ListAdjust.InsertColumn(CT_BLOB_IS_EXIST, APL_T("Тип поиска"),LVCFMT_LEFT,delt*3);
			m_ListAdjust.InsertColumn(CT_BLOB_CONTENT, APL_T("Искомая подстрока"),LVCFMT_LEFT,delt*16);
		}else{
			m_ListAdjust.InsertColumn(CT_BLOB_IS_EXIST,_T("..."),LVCFMT_LEFT,delt*18);
			m_adj_add.EnableWindow(FALSE);
			m_adj_del.EnableWindow(FALSE);
			m_adj_edit.EnableWindow(FALSE);
		}
	}
	else if(m_page_num==adj_class)
	{
		// справочники
		delt=div(width,40).quot;
		m_ListAdjust.InsertColumn(CT_CLS_TYPE, APL_T("Тип"),LVCFMT_LEFT,delt*11);
		m_ListAdjust.InsertColumn(CT_CLS_ID, APL_T("Обозначение"),LVCFMT_LEFT,delt*12);
		m_ListAdjust.InsertColumn(CT_CLS_NAME, APL_T("Наименование"),LVCFMT_LEFT,delt*12);
		m_ListAdjust.InsertColumn(CT_CLS_LVL, APL_T("Уровень"),LVCFMT_LEFT,delt*4);
		//m_CtrlRadioAnd.SetWindowText(_T("Должны выполнятся все условия для справочников"));
		//m_CtrlRadioOr.SetWindowText(_T("Должны выполнятся "));
	}
	FillTabAdjust();
}

void CFindQueryDlg::FillTabAdjustCharact()
{
	ElValChar* el_ch;
	COleDateTime odt;
	CString buf,buf1;
	CaplInstance *unit;
	CString str_type,str_is;
	int i,item_num;//,iY,iM,iD;
	//	double rval;
	m_ListAdjust.DeleteAllItems();


	for(i=0;i<m_list_char.Size;i++)
	{
		el_ch=m_list_char.GetAt(i);
		if(el_ch==0){
			::MessageBox(0, APL_T("Ошибка в данных!"),_T("Error"),MB_OK|MB_ICONERROR);
			return;
		}
		if(el_ch->apl_char!=0){
			apidata.GetAttrBN(el_ch->apl_char,_T("name"),buf);
		}else{
			::MessageBox(0, APL_T("Ошибка - характеристика не определена!"),_T("Error"),MB_OK|MB_ICONERROR);
			return;
		}

		apidata.GetAttrBN(el_ch->apl_char,_T("unit"),unit);
		if(el_ch->is_exist){str_is= APL_T("Есть");}else{str_is= APL_T("Нет");}
		if(el_ch->type){apidata.GetAttrBN(el_ch->type,_T("name"),str_type);}else{str_type=_T("");}
		
		item_num=m_ListAdjust.InsertItem(i,str_is,0);
		m_ListAdjust.SetItemData(item_num,(DWORD)i);

		if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_step_unit))
		{
			if(!el_ch->b_val && !el_ch->b_max && !el_ch->b_min)
			{
				m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
			}
			if(el_ch->b_val)
			{
				buf1.Format( APL_T("%s:значение"),buf);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf1);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation));
				buf1=el_ch->val;
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
			if(el_ch->b_max)
			{
				buf1.Format( APL_T("%s:верхнее отклонение"),buf);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf1);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation_max));
				buf1=el_ch->val_max;
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
			if(el_ch->b_min)
			{
				buf1.Format( APL_T("%s:нижнее отклонение"),buf);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf1);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation_min));
				buf1=el_ch->val_min;
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
		}
		else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_descript_unit)||
			apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_enum_unit) )
		{
			m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf);
			m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
			if(el_ch->b_val)
			{
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation));
				buf1=el_ch->val;
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
		}
		else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_monetary_unit))
		{
			m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf);
			m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
			if(el_ch->b_val)
			{
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation));
				buf1=el_ch->val;
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
		}
		else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_time_unit))
		{
			m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf);
			m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
			if(el_ch->b_val)
			{
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation));
				//buf1.Format(_T("%02s:%02s:%s"),el_ch->val_min,el_ch->val_max,el_ch->val);
				if(el_ch->dtt!=0){
					buf1=el_ch->dtt->Format(_T("%d.%m.%Y %H:%M:%S"));
				}else{
					buf1=APL_T("Не задано");
				}
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
		}
		else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_reference_unit))
		{
			m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf);
			m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
			if(el_ch->b_val)
			{
				m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation));
				m_api->m_charact_mgr.GetItemName(el_ch->m_cur_ref_val,buf1);
				m_ListAdjust.SetItemText(item_num,CT_CHAR_VALUE,buf1);
			}
		}
		else
		{// эта характеристика может иметь только условие "существует"
			m_ListAdjust.SetItemText(item_num,CT_CHAR_NAME,buf);
			m_ListAdjust.SetItemText(item_num,CT_CHAR_TYPE,str_type);
			m_ListAdjust.SetItemText(item_num,CT_CHAR_RELATION,CaplQLQuery::LogOp2String(el_ch->log_relation));
		}
	}
}

// Заполняет таблицу значениями из соотв. массива уточнений
void CFindQueryDlg::FillTabAdjust()
{
	ElValDoc* el_doc;
	ElValApproval* el_apr;
	ElValRes* el_res;
	ElValBLOB* el_blob;
	CaplInstance* inst;
	COleDateTime odt;
	CString buf,buf1;
	CString str_type,str_is;
	int i,item_num;//,iY,iM,iD;
//	double rval;
	m_ListAdjust.DeleteAllItems();
	if(m_page_num==adj_appr){
		// статусы
		for(i=0;i<m_list_approval.Size;i++){
			el_apr=m_list_approval.GetAt(i);
			if(el_apr==0){
				MessageBox( APL_T("Ошибка в данных!"),_T("Error"),MB_OK|MB_ICONERROR);
				return;
			}
			if(el_apr->is_exist){buf= APL_T("Есть");}else{buf= APL_T("Нет");}
			item_num=m_ListAdjust.InsertItem(i,buf,0);
			m_ListAdjust.SetItemData(item_num,(DWORD)i);
			if(el_apr->status!=0){
				apidata.GetAttr(el_apr->status,m_api->m_appr_mgr.a_appr_status_name,buf);
			}else{
				buf=_T("");
			}
			m_ListAdjust.SetItemText(item_num,CT_APPR_IS_APPR,buf);
			if(el_apr->descr!=_T(""))
			{
				m_ListAdjust.SetItemText(item_num,CT_APPR_IS_DESCR,el_apr->descr);
			}
			if(el_apr->person!=0)
			{
				if(apidata.IsKindOf(el_apr->person,m_api->m_appr_mgr.e_pers_org))
				{
					apidata.GetAttr(el_apr->person,m_api->m_appr_mgr.a_po_the_pers,inst);
				}
				else if(apidata.IsKindOf(el_apr->person,m_api->m_appr_mgr.e_person))
				{
					inst = el_apr->person;
				}
				else
				{
					MessageBox( APL_T("Неправильный объект в свойствах сотрудника!"),_T("Error"),MB_OK|MB_ICONERROR);
					return;
				}
				apidata.GetAttr(inst,m_api->m_appr_mgr.a_pers_last_name,buf);
			}
			else
			{
				buf=_T("");
			}
			m_ListAdjust.SetItemText(item_num,CT_APPR_IS_PERSON,buf);
			buf=el_apr->pers_org_role;
			m_ListAdjust.SetItemText(item_num,CT_APPR_IS_ROLE,buf);
			buf=_T("");
			if(el_apr->is_single_date){
				if(el_apr->date_time_beg!=0){
//					m_date_mgr.Get(el_apr->date_time_beg,odt);
//					buf=odt.Format(_T("%d.%m.%Y"));
					buf=el_apr->date_time_beg->Format(_T("%d.%m.%Y %H:%M:%S"));
				}
			}else{
				buf=_T("");
				if(el_apr->date_time_beg!=0){
//					m_date_mgr.Get(el_apr->date_time_beg,odt);
//					buf1=odt.Format(_T("c %d.%m.%Y"));
					buf1=el_apr->date_time_beg->Format( APL_T("с %d.%m.%Y %H:%M:%S"));
					buf+=buf1;
				}
				if(el_apr->date_time_end!=0){
//					m_date_mgr.Get(el_apr->date_time_end,odt);
//					buf1=odt.Format(APL_T("по %d.%m.%Y"));
					buf1=el_apr->date_time_end->Format( APL_T(" по %d.%m.%Y %H:%M:%S"));
					buf+=buf1;
				}
			}
			m_ListAdjust.SetItemText(item_num,CT_APPR_IS_DATE,buf);
			buf=_T("");
			if(el_apr->revoc_date_time_beg!=0){
				buf1=el_apr->revoc_date_time_beg->Format( APL_T("с %d.%m.%Y %H:%M:%S"));
				buf+=buf1;
			}
			if(el_apr->revoc_date_time_end!=0){
				buf1=el_apr->revoc_date_time_end->Format( APL_T(" по %d.%m.%Y %H:%M:%S"));
				buf+=buf1;
			}		
			m_ListAdjust.SetItemText(item_num,CT_APPR_IS_REVOC_DATE,buf);
			if(el_apr->is_dig_sign==0){buf= APL_T("Отсутствует");}
			else if(el_apr->is_dig_sign==1){buf= APL_T("Есть");}
			else {buf=_T("");}
			m_ListAdjust.SetItemText(item_num,CT_APPR_IS_IS_DIG_SIGN,buf);
		}
	}else if(m_page_num==adj_char){
		// Характеристики
		FillTabAdjustCharact();

	}else if(m_page_num==adj_doc){
		// Документы
		for(i=0;i<m_list_doc.Size;i++){
			el_doc=m_list_doc.GetAt(i);

			if(el_doc==0){
				MessageBox( APL_T("Ошибка в данных!"),_T("Error"),MB_OK|MB_ICONERROR);
				return;
			}
			if(el_doc->is_exist){buf= APL_T("Есть");}else{buf= APL_T("Нет");}
			item_num=m_ListAdjust.InsertItem(i,buf,0);
			m_ListAdjust.SetItemData(item_num,(DWORD)i);
			m_ListAdjust.SetItemText(item_num,CT_DOC_ID,el_doc->id);
			m_ListAdjust.SetItemText(item_num,CT_DOC_NAME,el_doc->name);
			if(el_doc->type!=0){
				apidata.GetAttr(el_doc->type,m_api->m_doc_mgr.a_dt_pdt,buf);
			}else{
				buf=_T("");
			}
 			m_ListAdjust.SetItemText(item_num,CT_DOC_KIND,buf);
		}
	}else if(m_page_num==adj_res){
		// Ресурсы
		for(i=0;i<m_list_res.Size;i++){
			el_res=m_list_res.GetAt(i);

			if(el_res==0){
				MessageBox( APL_T("Ошибка в данных!"),_T("Error"),MB_OK|MB_ICONERROR);
				return;
			}
			if(el_res->is_exist){buf= APL_T("Есть");}else{buf= APL_T("Нет");}

			item_num=m_ListAdjust.InsertItem(i,buf,0);
			m_ListAdjust.SetItemData(item_num,(DWORD)i);
			m_ListAdjust.SetItemText(item_num,CT_RES_ID_R,el_res->id_res);
			m_ListAdjust.SetItemText(item_num,CT_RES_NAME_R,el_res->name_res);
			if(el_res->type_res!=0){
				apidata.GetAttr(el_res->type_res,m_api->m_bp_mgr.a_bp_type_name,buf);
			}else{
				buf=_T("");
			}
			m_ListAdjust.SetItemText(item_num,CT_RES_TYPE_R,buf);
			m_ListAdjust.SetItemText(item_num,CT_RES_ID_O,el_res->id_obj);
			m_ListAdjust.SetItemText(item_num,CT_RES_NAME_O,el_res->name_obj);
			switch(el_res->type_obj)
			{
			case ElValRes::TROProduct:buf= APL_T("Изделие");break;
			case ElValRes::TROPerson:buf= APL_T("Сотрудник");break;
			case ElValRes::TROOrg:buf= APL_T("Рабочая группа");break;
			case ElValRes::TRONoType:
			default:buf= APL_T("Не определен");break;
			}
			m_ListAdjust.SetItemText(item_num,CT_RES_TYPE_O,buf);
		}
	}
	else if(m_page_num==adj_blob)
	{
		if(m_api->m_data.CanFindInBLOB()){
			for(i=0;i<m_list_blob.Size;i++){
				el_blob=m_list_blob.GetAt(i);
				if(el_blob==0){
					MessageBox( APL_T("Ошибка в данных!"),_T("Error"),MB_OK|MB_ICONERROR);
					return;
				}
				if(el_blob->is_equal){buf= APL_T("Только подстрока целиком");}else{buf=_T("");}
				
				item_num=m_ListAdjust.InsertItem(i,buf,0);
				m_ListAdjust.SetItemData(item_num,(DWORD)i);
				m_ListAdjust.SetItemText(item_num,CT_BLOB_CONTENT,el_blob->word);
			}
		}else{
			item_num=m_ListAdjust.InsertItem(0, APL_T("Поиск в теле документа возможен только в БД ORACLE с установленным interMedia Text"),0);
		}
	}
	SetHiglight();
}


void CFindQueryDlg::OnRclickListAdjust(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	*pResult = 0;
	
	const MSG* msg;
	CPoint mouseclick;
	msg=GetCurrentMessage();
	//mouseclick - координаты клика мыши
	mouseclick=msg->pt;
	CaplMenu menu;
	CMenu* pPopup =0;
	//загружаем контекстное меню
	VERIFY(menu.LoadMenu(IDR_CONTEXT_MENU));
	pPopup = menu.GetSubMenu(0);
	
	int num_curr= m_ListAdjust.GetNextItem( -1 , LVNI_ALL | LVNI_SELECTED );
	if(m_read_only){
		pPopup->EnableMenuItem(IDC_DELETE,MF_BYCOMMAND | MF_GRAYED);
		pPopup->EnableMenuItem(IDC_ADD,MF_BYCOMMAND | MF_GRAYED);
		pPopup->ModifyMenu(0,MF_BYPOSITION,IDC_CHANGE, APL_T("Просмотреть"));
	}else if(m_page_num==adj_blob && !m_api->m_data.CanFindInBLOB()){
		pPopup->EnableMenuItem(IDC_DELETE,MF_BYCOMMAND | MF_GRAYED);
		pPopup->EnableMenuItem(IDC_ADD,MF_BYCOMMAND | MF_GRAYED);
		pPopup->EnableMenuItem(IDC_CHANGE,MF_BYCOMMAND | MF_GRAYED);
	}else{
		if(num_curr== -1){
			pPopup->EnableMenuItem(IDC_CHANGE,MF_BYCOMMAND | MF_GRAYED);
			pPopup->EnableMenuItem(IDC_DELETE,MF_BYCOMMAND | MF_GRAYED);
		}else{
			pPopup->SetDefaultItem(IDC_CHANGE,MF_BYCOMMAND | MF_GRAYED);
		}
	}
	
	BOOL res=pPopup->TrackPopupMenu(TPM_LEFTALIGN|
		TPM_RIGHTBUTTON|TPM_RETURNCMD,msg->pt.x, msg->pt.y,this);
	//в зависимости от выбора строки контекстного меню :
	switch (res)
	{
	case IDC_ADD: OnAdjustAdd();      break;
	case IDC_DELETE:OnAdjustDel();	break;
	case IDC_CHANGE:OnAdjustEdit();	break;
	default:break;
	}
}


// Нажатие на кнопку "Добавить"
void CFindQueryDlg::OnAdjustAdd() 
{
	// TODO: Add your control notification handler code here
	CFindAdjustDocDlg doc_dlg;
	CFindAdjustApprDlg appr_dlg;
	CFindAdjustCharactDlg char_dlg;
	CFindAdjustResourceDlg res_dlg;
	CFindAdjustBlobDlg blob_dlg;
	CFindAdjustUserDateDlg user_date_dlg;
	if(m_read_only)return;

	appr_dlg.m_api=m_api;
	/*appr_dlg.m_mode_slave=m_mode_slave;*/
	doc_dlg.m_api=m_api;
	char_dlg.m_api=m_api;
	res_dlg.m_api=m_api;
	blob_dlg.m_api=m_api;
	user_date_dlg.m_api=m_api;


	if(m_page_num==adj_appr)
	{
		if(appr_dlg.DoModal()==IDOK && appr_dlg.m_el!=0)
		{
			if(!appr_dlg.m_el->IsEmpty() )
			{
				m_changed=true;
				m_list_approval.Add(appr_dlg.m_el);
			}else{
				delete appr_dlg.m_el;
			}
		}
	}
	else if(m_page_num==adj_char)
	{
		if(char_dlg.DoModal()==IDOK && char_dlg.m_el!=0){
			if(char_dlg.m_el->apl_char)
			{
				m_changed=true;
				m_list_char.Add(char_dlg.m_el);
			}else{
				delete char_dlg.m_el;
			}
		}
	}
	else if(m_page_num==adj_doc)
	{
		if(doc_dlg.DoModal()==IDOK && doc_dlg.m_el!=0)
		{
			m_changed=true;
			m_list_doc.Add(doc_dlg.m_el);
		}
	}
	else if(m_page_num==adj_res)
	{
		if(res_dlg.DoModal()==IDOK && res_dlg.m_el!=0)
		{
			m_changed=true;
			m_list_res.Add(res_dlg.m_el);
		}

	}
	else if(m_page_num==adj_blob)
	{
		if(!m_api->m_data.CanFindInBLOB()){return;}
		if(blob_dlg.DoModal()==IDOK && blob_dlg.m_el!=0)
		{
			m_changed=true;
			m_list_blob.Add(blob_dlg.m_el);
		}
	}
	FillTabAdjust();
}

// Нажатие на кнопку "Удалить"
void CFindQueryDlg::OnAdjustDel() 
{
	// TODO: Add your control notification handler code here
	if(m_read_only)return;

	int num_curr= m_ListAdjust.GetNextItem( -1 , LVNI_ALL | LVNI_SELECTED );
	if( num_curr== -1){
		AfxMessageBox( APL_T("Запись не выбрана!"));
		return;
	}
	num_curr=m_ListAdjust.GetItemData(num_curr);
	if(m_page_num==adj_appr){
		m_changed=true;
		m_list_approval.Remove(num_curr);
	}else if(m_page_num==adj_char){
		m_changed=true;
		m_list_char.Remove(num_curr);
	}else if(m_page_num==adj_doc){
		m_changed=true;
		m_list_doc.Remove(num_curr);
	}else if(m_page_num==adj_res){
		m_changed=true;
		m_list_res.Remove(num_curr);
	}else if(m_page_num==adj_blob){
		if(!m_api->m_data.CanFindInBLOB()){return;}
		m_changed=true;
		m_list_blob.Remove(num_curr);	}
	FillTabAdjust();
	
}

// Даблклик на строку в таблице
void CFindQueryDlg::OnDblclkListAdjust(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	OnAdjustEdit();
	*pResult = 0;
}

// Нажатие на кнопку "Редактировать"
void CFindQueryDlg::OnAdjustEdit() 
{
	// TODO: Add your control notification handler code here
	CFindAdjustDocDlg doc_dlg;
	CFindAdjustApprDlg appr_dlg;
	CFindAdjustCharactDlg char_dlg;
	CFindAdjustResourceDlg res_dlg;
	CFindAdjustBlobDlg blob_dlg;
	CFindAdjustUserDateDlg user_date_dlg;

	ElValApproval* el_appr=0;
	ElValDoc* el_doc=0;
	ElValChar* el_char=0;
	ElValRes* el_res=0;
	ElValBLOB* el_blob=0;
	
	appr_dlg.m_api=m_api;appr_dlg.m_read_only=m_read_only;/*appr_dlg.m_mode_slave=m_mode_slave;*/
	doc_dlg.m_api=m_api;doc_dlg.m_read_only=m_read_only;
	char_dlg.m_api=m_api;char_dlg.m_read_only=m_read_only;
	res_dlg.m_api=m_api;res_dlg.m_read_only=m_read_only;
	blob_dlg.m_api=m_api;blob_dlg.m_read_only=m_read_only;
	user_date_dlg.m_api=m_api;user_date_dlg.m_read_only=m_read_only;


	
	int num_curr= m_ListAdjust.GetNextItem( -1 , LVNI_ALL | LVNI_SELECTED );
	if( num_curr== -1){
		AfxMessageBox( APL_T("Запись не выбрана!"));
		return;
	}
	
	if(m_page_num==adj_appr)
	{
		appr_dlg.m_el=m_list_approval.GetAt(m_ListAdjust.GetItemData(num_curr));
		el_appr=new ElValApproval(appr_dlg.m_el);
		if(appr_dlg.DoModal()==IDOK && !el_appr->Compare(appr_dlg.m_el))	
			m_changed=true;

		delete el_appr;
		
	}
	else if(m_page_num==adj_char)
	{
		char_dlg.m_el=m_list_char.GetAt(m_ListAdjust.GetItemData(num_curr));
		el_char= new ElValChar(char_dlg.m_el);
		if(char_dlg.DoModal()==IDOK && !el_char->Compare(char_dlg.m_el))	
			m_changed=true;
		delete el_char;
	}
	else if(m_page_num==adj_doc)
	{
		doc_dlg.m_el=m_list_doc.GetAt(m_ListAdjust.GetItemData(num_curr));
		el_doc= new ElValDoc(doc_dlg.m_el);
		if(doc_dlg.DoModal()==IDOK && !el_doc->Compare(doc_dlg.m_el))
			m_changed=true;
		delete el_doc;
	}
	else if(m_page_num==adj_res)
	{
		res_dlg.m_el=m_list_res.GetAt(m_ListAdjust.GetItemData(num_curr));
		el_res= new ElValRes(res_dlg.m_el);
		if(res_dlg.DoModal()==IDOK && !el_res->Compare(res_dlg.m_el))
			m_changed=true;
		delete el_res;

	}
	else if(m_page_num==adj_blob)
	{
		if(!m_api->m_data.CanFindInBLOB()){return;}
		blob_dlg.m_el=m_list_blob.GetAt(m_ListAdjust.GetItemData(num_curr));
		el_blob= new ElValBLOB(blob_dlg.m_el);
		if(blob_dlg.DoModal()==IDOK && !el_blob->Compare(blob_dlg.m_el))
			m_changed=true;

		delete el_blob;
	}
	FillTabAdjust();
	
}



/////////////////////////////////////////////////////////////////////////////////////
// Математика формирования запроса

bool CFindQueryDlg::TestNameQuery() 
{
	CString name;
	if(!m_can_save)
		return true;
	UpdateData(TRUE);
	//if(m_ChkSaveQuery.GetCheck()!=1)return true;
	if(m_api==0)return true;
	if(m_StringNameQuery==_T("")){
		AfxMessageBox( APL_T("Имя запроса не может быть пустым!"),MB_ICONERROR);
		return false;
	}
	CaplAttrValue tst_values[1];
	aplExtent ext;
	bool flag=false;
	tst_values[0].value.Set(m_StringNameQuery);
	tst_values[0].attr=m_api->m_query_mgr.a_apl_query_name;
	if(m_api->m_data.NET_FindInstancesWithAttrValues(
		m_api->m_query_mgr.e_apl_query,1,&tst_values[0],ext,false)>0)
	{
		if(ext.Size>1 || ext[0]!=m_instance){
			AfxMessageBox( APL_T("Имя запроса уже используется!"),MB_ICONERROR);
			return false;
		}
	}
	return true;
}


void CFindQueryDlg::OnExecuteFind() 
{
	if(!TestNameQuery())return;
	m_can_make_table=m_CtrlMakeTableResult.IsWindowEnabled()==1;
	SaveDataToBuf();
	if(GenerateStepQL()){
		CResizableDialog::OnOK();
	}
};

void CFindQueryDlg::OnShowStepql() 
{
	// TODO: Add your control notification handler code here
	if(!TestNameQuery())return;
	m_can_make_table=m_CtrlMakeTableResult.IsWindowEnabled()==1;
	UpdateData(TRUE);
	SaveDataToBuf();
	if(GenerateStepQL(false)){
		EndDialog(ID_SHOW_STEPQL);
	}
}

bool CFindQueryDlg::GenerateStepQL(bool show_message)
{
	// TODO: Add your control notification handler code here
	int name_num=0;
	UpdateData(TRUE);
	m_cur_ext_num=0;
	m_fields=_T("");/*m_fields_pdf=_T("");*/m_extents=_T("");
	m_descrtiption=_T("");
	m_blob_query=_T("");
	CString buf;
	if(m_api!=0){
		
		if(m_state_id==CaplQLQuery::aplNOLOGREL &&
			m_state_name==CaplQLQuery::aplNOLOGREL &&
			m_state_descr==CaplQLQuery::aplNOLOGREL &&
			m_state_type==CaplQLQuery::aplNOLOGREL &&
			m_state_code_ver==CaplQLQuery::aplNOLOGREL &&
			m_state_code_ver1==CaplQLQuery::aplNOLOGREL &&
			m_state_code_ver2==CaplQLQuery::aplNOLOGREL &&
			m_state_code_izd==CaplQLQuery::aplNOLOGREL &&
			m_state_source==CaplQLQuery::aplNOLOGREL &&
			m_state_ver==CaplQLQuery::aplNOLOGREL &&
			m_list_approval.Size==CaplQLQuery::aplNOLOGREL &&
			m_list_char.Size==CaplQLQuery::aplNOLOGREL &&
			m_list_doc.Size==CaplQLQuery::aplNOLOGREL &&
			m_list_res.Size==CaplQLQuery::aplNOLOGREL &&
			m_list_blob.Size==CaplQLQuery::aplNOLOGREL &&
			!m_mode_slave)
		{
			if(show_message)
			{
				if(MessageBox( APL_T("В запросе не определено ни одного уточнения.\nЭто приведет к чтению ВСЕГО содержимого БД\n\nВы уверены, что хотите этого ?"),
					0,MB_ICONQUESTION|MB_YESNO)!=IDYES) return false;
			}
		}
		if(show_message && m_mode==FindObject_All &&
			m_list_approval.Size==0 &&
			m_list_char.Size==0 &&
			m_list_doc.Size==0)
		{
			MessageBox( APL_T("Нельзя искать все объекты без уточнений.\nЭто приведет к чтению ВСЕГО содержимого БД\n\nУточните условия поиска"),
				0,MB_ICONQUESTION|MB_OK);
			return false;
		}
		// Главные идентификаторы объекта
		if(!MakeObjectIdentify()){
			return false;
		}
		if(m_mode==FindObject_Document){
			if(!MakeQueryBlob()){
				return false;
			}
		}
		// Рассовываем содержимое по классам запроса
		if(m_mode!=FindObject_Category && m_mode!=FindObject_Folder 
					&& m_mode!=FindObject_Find && m_mode!=FindObject_CombinedTable
					&& m_mode!=FindObject_ClassifSystem && m_mode!=FindObject_ClassifLevel
					&& m_mode!=FindObject_Task && m_mode!=FindObject_Process
					&& m_mode!=FindObject_Requirement)
		{
			if(!MakeQueryAppr()){
				return false;
			}
		}
		if(m_mode!=FindObject_Folder && m_mode!=FindObject_Find
					&& m_mode!=FindObject_Change 
					&& m_mode!=FindObject_CombinedTable
					&& m_mode!=FindObject_ClassifSystem 
					&& m_mode!=FindObject_ClassifLevel
					&& m_mode!=FindObject_Task 
					&& m_mode!=FindObject_Process
					&& m_mode!=FindObject_Requirement)
		{
			if(!MakeQueryChar()){return false;}
		}
		if(m_mode!=FindObject_Folder
				&& m_mode!=FindObject_Find
				&& m_mode!=FindObject_CombinedTable
				&& m_mode!=FindObject_Task 
				&& m_mode!=FindObject_Process)
		{
			if(!MakeQueryDoc()){return false;}
		}
		if(m_mode==FindObject_BP || m_mode==FindObject_BPInst)
		{
			if(!MakeQueryRes()){return false;}
		}
		// А теперь в выходные поля заносим ссылки на наш екстент
		if(m_cur_ext_num==0){
			// Ни одного уточнения видать нету. Будем создавать новый экстент
			// Создаем экстент
			switch(m_mode)
			{
			case FindObject_Document: // Doc
				m_fields=_T("Ext_");
				m_extents=_T("Ext_{apl_document")+m_object_condition+_T("}\n");
				break;
			case FindObject_BP: // Action
				m_fields=_T("Ext_");
				m_extents=_T("Ext_{apl_business_process")+m_object_condition+_T("}\n");
				break;
			case FindObject_ProductVer: // Product
			case FindObject_Product: // Product
			case FindObject_Lot: // Lot
			case FindObject_ProductInst: // Product Inst
			case FindObject_Category: 
			case FindObject_Folder: 			
			case FindObject_Project: 			
			case FindObject_Person: 			
			case FindObject_Organization: 			
			case FindObject_Find: 
			case FindObject_CombinedTable: 
			case FindObject_Change: 
			case FindObject_ClassifSystem: 
			case FindObject_ClassifLevel: 
			case FindObject_BPInst: 
			case FindObject_Process:
			case FindObject_Task:
			case FindObject_Requirement:

				m_fields=_T("Ext_");
				m_extents=_T("Ext_{")+m_object_name+m_object_condition+_T("}\n");
				break;
			}				
			
		}
		m_QL_query=_T("SELECT\n");
		m_QL_query+=m_fields;
		m_QL_query+=_T("\nFROM\n")+m_extents+_T("\nEND_SELECT");
	}
	
	m_is_adjustment=m_list_approval.Size>0 || m_list_char.Size>0 || m_list_doc.Size>0;
	return true;
}

// Формирует ветку условий для атрибутов самого объекта
// и пути для выбора результатов из экстентов
bool CFindQueryDlg::MakeObjectIdentify()
{
	CString str_par,str_rel,str_rel_descr,str_temp;
	int i;
	struct sArrName{
		CString name_attr;
		CString sql;
	} ArrName[10];
	CArray<int,int> ListAttr;
	CArray<int,int> ListAttrPdf;
//	int count_only_prd=0;
	// Проходим по полям диалога и заполняем отчекенные условия-значения
	if(m_state_id!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditId.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_id==CaplQLQuery::aplLIKE ||
						m_state_id==CaplQLQuery::aplNOTLIKE ||m_state_id==CaplQLQuery::aplNOTLIKELEFT ||
						m_state_id==CaplQLQuery::aplNOTLIKERIGHT))
		{
			AfxMessageBox( APL_T("Не определено обозначение объекта!"));
			return false;
		}
		//if(m_state_id==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_id,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_id,false)+_T(" '");
//		switch(m_state_id) {
//		case 1:str_rel=_T(" = '");str_rel_descr=_T("= '");break;
//		case 2:str_rel=_T(" LIKE '");str_rel_descr=APL_T(" содержит '");break;
//		case 3:str_rel=_T(" != '");str_rel_descr=APL_T("не равно '");break;
//		case 4:str_rel=_T(" NOT LIKE '");str_rel_descr=APL_T(" не содержит '");break;
//		default:str_rel=_T(" LIKE '");str_rel_descr=APL_T(" содержит '");break;
//		}
		ArrName[TFO_Id].sql=str_rel+str_par+_T("' ");
		if(m_mode==FindObject_ProductVer){ListAttrPdf.Add(TFO_Id);}else{ListAttr.Add(TFO_Id);}
//		count_only_prd++;
		//m_descrtiption+=APL_T("Обозначение ")+CString((m_state_id==1)?_T("= '"):APL_T(" содержит '"))+str_par+_T("'; ");
		m_descrtiption+= APL_T("Обозначение ")+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_name!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditName.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_name== CaplQLQuery::aplLIKE ||m_state_name==CaplQLQuery::aplNOTLIKE)){
			if(m_mode==FindObject_ProductInst){
				AfxMessageBox( APL_T("Не определен серийный номер объекта!"));
			}else if(m_mode==FindObject_Person){
				AfxMessageBox( APL_T("Не определена фамилия!"));
			}else{
				AfxMessageBox( APL_T("Не определено наименование объекта!"));
			}
			return false;
		}
//		if(m_state_name==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_name,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_name,false)+_T(" '");

		ArrName[TFO_Name].sql=str_rel+str_par+_T("' ");
		if(m_mode==FindObject_ProductVer){ListAttrPdf.Add(TFO_Name);}else{ListAttr.Add(TFO_Name);}
		//		count_only_prd++;
		if(m_mode==FindObject_ProductInst){
			str_temp= APL_T("Серийный номер ");
		}else if(m_mode==FindObject_Person){
			str_temp= APL_T("Фамилия ");
		}else{
			str_temp= APL_T("Наименование ");
		}
		//m_descrtiption+=str_temp+CString((m_state_name==1)?_T("= '"):APL_T(" содержит '"))+str_par+_T("'; ");
		m_descrtiption+=str_temp+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_descr!=CaplQLQuery::aplNOLOGREL){
		m_EditDescr.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_descr== CaplQLQuery::aplLIKE ||m_state_descr==CaplQLQuery::aplNOTLIKE)){
			if(m_mode==FindObject_Person){
				AfxMessageBox( APL_T("Не определено имя!"));
			}else{
				AfxMessageBox( APL_T("Не определено описание объекта!"));
			}
			return false;
		}
		//if(m_state_descr==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_descr,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_descr,false)+_T(" '");

		ArrName[TFO_Descr].sql=str_rel+str_par+_T("' ");
		//		if(m_mode==FindObject_ProductVer){ListAttrPdf.Add(TFO_Id);}else{ListAttr.Add(TFO_Id);}
		ListAttr.Add(TFO_Descr);
		//		count_only_prd++;
		if(m_mode==FindObject_Person){
			str_temp= APL_T("Имя ");
		}else{
			str_temp= APL_T("Описание ");
		}
		//m_descrtiption+=str_temp+CString((m_state_descr==1)?_T("= '"):APL_T(" содержит '"))+str_par+_T("'; ");
		m_descrtiption+=str_temp+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_type!=CaplQLQuery::aplNOLOGREL){
		if(m_state_type==CaplQLQuery::aplNOTEXIST){
			ArrName[TFO_Type].sql=_T(" = #0 ");
			m_descrtiption+= APL_T("Тип: не задан; ");
		}else{
			m_EditType.GetWindowText(str_par);
			if(str_par==_T("")){
				AfxMessageBox( APL_T("Не определен тип!"));
				return false;
			}
			str_rel=CaplQLQuery::LogOp2String(m_state_type,false);
			if(m_mode==FindObject_ProductVer){
				// Для типа product-а нужно преобразование
				str_par=m_api->m_prd_mgr.StrConvertRus2PdfType(str_par);
				
				ArrName[TFO_Type].sql=_T(" ")+str_rel+_T(" '")+ str_par+ _T("'");
			}
			if(m_mode==FindObject_Document){
				// Для типа документа нужно перевести имя типа в номер инстансы
				aplExtent ext;
				CString buf;
				apidata.GetEntityExtentBN(_T("document_type"),ext);
				for(i=0;i<ext.Size;i++)
				{
					if(ext[i]==0)continue;
					if(ext[i]->GetAccessmode()==aplNO)continue;
					apidata.GetAttrBN(ext[i],_T("product_data_type"),buf);
					if(buf==str_par){break;}
				}
				if(i<ext.Size){
					buf.Format(_T(" #%i"),ext[i]->GetId());
					ArrName[TFO_Type].sql= _T(" ")+str_rel+buf;
				}else{
					ArrName[TFO_Type].sql= _T("->document_type.product_data_type ")+str_rel+_T(" '")+str_par+_T("' ");
				}
				
			}
			if(m_mode==FindObject_BP){
				// Для типа документа нужно перевести имя типа в номер инстансы
				aplExtent ext;
				CString buf;
				apidata.GetEntityExtentBN(_T("apl_business_process_type"),ext);
				for(i=0;i<ext.Size;i++)
				{
					apidata.GetAttrBN(ext[i],_T("name"),buf);
					if(buf==str_par){break;}
				}
				if(i<ext.Size){
					buf.Format(_T(" #%i"),ext[i]->GetId());
					ArrName[TFO_Type].sql= _T(" ")+str_rel+buf;
				}else{
					ArrName[TFO_Type].sql= _T("->apl_business_process_type.name ")+str_rel+_T(" '")+str_par+_T("' ");
				}
			}
			if(m_mode==FindObject_Project){
				// Для типа проекта нужно перевести имя типа в номер инстансы
				aplExtent ext;
				CString buf;
				apidata.GetEntityExtentBN(_T("apl_project_type"),ext);
				for(i=0;i<ext.Size;i++)
				{
					apidata.GetAttrBN(ext[i],_T("name"),buf);
					if(buf==str_par){break;}
				}
				if(i<ext.Size){
					buf.Format(_T(" #%i"),ext[i]->GetId());
					ArrName[TFO_Type].sql= _T(" ")+str_rel+buf;
				}else{
					ArrName[TFO_Type].sql= _T("->apl_project_type.name ")+str_rel+_T(" '")+str_par+_T("' ");
				}
			}
			m_descrtiption+= APL_T("Тип ='")+str_par+_T("'; ");
		}
		ListAttr.Add(TFO_Type);
		
	}
	if(m_state_code_ver!=CaplQLQuery::aplNOLOGREL){
		m_EditCodeVer.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_code_ver== CaplQLQuery::aplLIKE ||m_state_code_ver==CaplQLQuery::aplNOTLIKE)){
			AfxMessageBox( APL_T("Не определен код объекта!"));
			return false;
		}
		//if(m_state_code_ver==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_ver,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_ver,false)+_T(" '");

		ArrName[TFO_Code].sql=str_rel+str_par+_T("' ");
		ListAttr.Add(TFO_Code);
		m_descrtiption+= APL_T("Код ")+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL){
		m_EditCodeVer1.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_code_ver1== CaplQLQuery::aplLIKE ||m_state_code_ver1==CaplQLQuery::aplNOTLIKE)){
			AfxMessageBox( APL_T("Не определен код 1 объекта!"));
			return false;
		}
		//if(m_state_code_ver1==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_ver1,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_ver1,false)+_T(" '");
		ArrName[TFO_CodeVer1].sql=str_rel+str_par+_T("' ");
		ListAttr.Add(TFO_CodeVer1);
		m_descrtiption+= APL_T("Код 1 ")+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL){
		m_EditCodeVer2.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_code_ver2== CaplQLQuery::aplLIKE ||m_state_code_ver2==CaplQLQuery::aplNOTLIKE)){
			AfxMessageBox( APL_T("Не определен код 2 объекта!"));
			return false;
		}
		//if(m_state_code_ver2==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_ver2,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_ver2,false)+_T(" '");
		ArrName[TFO_CodeVer2].sql=str_rel+str_par+_T("' ");
		ListAttr.Add(TFO_CodeVer2);
		m_descrtiption+= APL_T("Код 2 ")+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_code_izd!=CaplQLQuery::aplNOLOGREL){
		m_EditCodeIzd.GetWindowText(str_par);
		if(str_par==_T("") && (m_state_code_izd== CaplQLQuery::aplLIKE ||m_state_code_izd==CaplQLQuery::aplNOTLIKE)){
			AfxMessageBox( APL_T("Не определен код изделия!"));
			return false;
		}
		//if(m_state_code_izd==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_izd,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_code_izd,false)+_T(" '");
		ArrName[TFO_CodeIzd].sql=str_rel+str_par+_T("' ");
		if(m_mode==FindObject_ProductVer){ListAttrPdf.Add(TFO_CodeIzd);}else{ListAttr.Add(TFO_CodeIzd);}
		m_descrtiption+= APL_T("Код изделия ")+str_rel_descr+str_par+_T("'; ");
	}
	if(m_state_source!=CaplQLQuery::aplNOLOGREL){
		m_EditSource.GetWindowText(str_par);
		if(str_par==_T("")){
			AfxMessageBox( APL_T("Не определен источник версии изделия!"));
			return false;
		}
		str_par=m_api->m_prd_mgr.StrConvertRus2MakeOrBuy(str_par);
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_source,false)+_T(" ");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_source,false)+_T(" ");
		
		ArrName[TFO_Source].sql= str_rel+_T(" '")+str_par+_T("'");
		ListAttr.Add(TFO_Source);
		m_descrtiption+=(m_mode==FindObject_Document)? APL_T("Имя файла"): APL_T("Источник ")+str_rel_descr+_T(" '")+str_par+_T("'; ");
	}
	if(m_state_ver!=CaplQLQuery::aplNOLOGREL){
		m_EditVer.GetWindowText(str_par);
		if(str_par==_T("")){
			if(m_mode==FindObject_Person){
				AfxMessageBox( APL_T("Не определено отчество!"));
				return false;
			}else if(m_state_code_izd== CaplQLQuery::aplLIKE ||m_state_code_izd==CaplQLQuery::aplNOTLIKE){
				AfxMessageBox( APL_T("Не определено обозначение версии изделия!"));
				return false;
			}
		}
		/*if(m_mode==FindObject_Person){
			str_rel=_T(" LIKE \"");
			if(m_state_ver==1){str_par=_T("''")+str_par+_T("''");};
			ArrName[6].sql=str_rel+str_par+_T("\" ");
		}else{*/
//			if(m_state_ver==1){str_rel=_T(" = '");}else{str_rel=_T(" LIKE '");}
//			ArrName[TFO_Ver].sql=str_rel+str_par+_T("' ");
		//}
		//if(m_mode==FindObject_ProductVer){ListAttrPdf.Add(6);}else{ListAttr.Add(6);}
		str_rel=_T(" ")+CaplQLQuery::LogOp2String(m_state_ver,false)+_T(" '");
		str_rel_descr=_T(" ")+CaplQLQuery::LogOp2String(m_state_ver,false)+_T(" '");
		ArrName[TFO_Ver].sql=str_rel+str_par+_T("' ");
		ListAttr.Add(TFO_Ver);
		if(m_mode==FindObject_Person){
			str_temp= APL_T("Отчество ");
		}else{
			str_temp= APL_T("Обозначение версии ");
		}
		m_descrtiption+=str_temp+str_rel_descr+str_par+_T("'; ");
	}
	// Определимся с названиями атрибутов у базовых ентитей
	switch(m_mode){
	case FindObject_Product: // Product
		m_object_name=_T("product");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_CodeIzd].name_attr=_T(".code");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_ProductVer: // Product definition formation
		m_object_name=_T("apl_product_definition_formation");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Type].name_attr=_T(".formation_type");
		ArrName[TFO_Code].name_attr=_T(".code");
		ArrName[TFO_Source].name_attr=_T(".make_or_buy");
		ArrName[TFO_Descr].name_attr=_T(".description");
		ArrName[TFO_Ver].name_attr=_T(".id");
		ArrName[TFO_CodeVer1].name_attr=_T(".code1");
		ArrName[TFO_CodeVer2].name_attr=_T(".code2");
		ArrName[TFO_CodeIzd].name_attr=_T(".code");
		break;
	case FindObject_Document: // Doc
		m_object_name=_T("apl_document_revision.of_document->apl_document");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Type].name_attr=_T(".kind");
		ArrName[TFO_Descr].name_attr=_T(".description");
		ArrName[TFO_Code].name_attr=_T(".active->apl_document_revision.access_form->apl_stored_document.file_name");
		break;
	case FindObject_Lot: // Lot
		m_object_name=_T("apl_lot");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_ProductInst: // Product Inst
		m_object_name=_T("apl_product_instance");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".serial_number");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_BPInst: // Product Inst
		m_object_name=_T("apl_business_process_instance");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_BP: // Action
		m_object_name=_T("apl_business_process_version.process->apl_business_process");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Type].name_attr=_T(".type");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Project: // Project
		m_object_name=_T("apl_project");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Type].name_attr=_T(".type");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Category: // 
		m_object_name=_T("product_related_product_category");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Organization: // 
		m_object_name=_T("organization");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Person: // 
		m_object_name=_T("person");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".last_name");
		ArrName[TFO_Descr].name_attr=_T(".first_name");
		ArrName[TFO_Ver].name_attr=_T(".middle_names");
		break;
	case FindObject_Folder: // 
		m_object_name=_T("apl_folder");
		ArrName[TFO_Id].name_attr=_T(".name");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Find: // 
		m_object_name=_T("apl_query");
		ArrName[TFO_Id].name_attr=_T(".name");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_CombinedTable: // 
		m_object_name=_T("apl_combined_table");
		ArrName[TFO_Id].name_attr=_T(".name");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Change: // 
		m_object_name=_T("apl_change");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		break;
	case FindObject_ClassifSystem: // 
		m_object_name=_T("apl_classifier_system");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_ClassifLevel: // 
		m_object_name=_T("apl_classifier_level");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Process:
		m_object_name=_T("apl_process");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Task:
		m_object_name=_T("apl_task");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".description");
		break;
	case FindObject_Requirement:
		m_object_name=_T("apl_requirement");
		ArrName[TFO_Id].name_attr=_T(".id");
		ArrName[TFO_Name].name_attr=_T(".name");
		ArrName[TFO_Descr].name_attr=_T(".html");
		//ArrName[TFO_Descr].name_attr=_T(".description");
		break;

	}

	
	// 
	m_object_condition=_T("");
	
	int size_prd=ListAttr.GetSize();
	int size_pdf=ListAttrPdf.GetSize();
	if(m_mode==FindObject_ProductVer){
		if(size_prd+size_pdf>0 )
		{
			if(size_prd>1 || (size_prd>0 && size_pdf>0))m_object_condition+=_T("(");
			if(size_pdf>=1)m_object_condition+=_T(".of_product->product");
			if(size_pdf==2)m_object_condition+=_T("(");
			for(i=0;i<size_pdf;i++)
			{
				m_object_condition+=ArrName[ListAttrPdf.GetAt(i)].name_attr +
					_T(" ")+ArrName[ListAttrPdf.GetAt(i)].sql;
				if(i+1<size_pdf){m_object_condition+=_T(" AND ");}
			}
			if(size_pdf==2)m_object_condition+=_T(")");
			if((size_prd>=2 || size_prd>=1) && size_pdf>0)m_object_condition+=_T(" AND ");
			for(i=0;i<size_prd;i++)
			{
				m_object_condition+=ArrName[ListAttr.GetAt(i)].name_attr +
					_T(" ")+ArrName[ListAttr.GetAt(i)].sql;
				if(i+1<size_prd){m_object_condition+=_T(" AND ");}
			}
			if(size_prd>1 || (size_prd>0 && size_pdf>0))m_object_condition+=_T(")");
			
		}else{
			m_object_condition=_T(".of_product->product.id LIKE ''");
			//m_object_condition=ArrName[TFO_Id].name_attr+_T(" LIKE ''");
			//m_object_condition=_T("");
		}
	}else{
		if(size_prd>=1){
			if(size_prd>=2){m_object_condition=_T("(");}else{m_object_condition=_T("");}
			for(i=0;i<size_prd;i++){
				m_object_condition+=ArrName[ListAttr.GetAt(i)].name_attr + 
					_T(" ")+ArrName[ListAttr.GetAt(i)].sql;
				if(i+1<size_prd){m_object_condition+=_T(" AND ");}
			}
			if(size_prd>=2)m_object_condition+=_T(")");
		}else{
			m_object_condition=ArrName[TFO_Id].name_attr+_T(" LIKE ''");
			//m_object_condition=_T("");
		}
	}
	
	return true;
}// bool CFindQueryDlg::MakeObjectIdentify(){



// Формирует массив QLэкстентов для поиска по статусам
bool CFindQueryDlg::MakeQueryAppr()
{
	ElValApproval* el_apr;

	CString condition,buf;
	CaplInstance* inst=0;
	bool is_second=false;

	int i;
//	int year,month,day;

	// ветки с условиями на атрибуты самого обхекта

	for(i=0;i<m_list_approval.Size;i++){
		is_second=false;
		
		if(m_mode==FindObject_All){
			condition=_T("");
		}else{
			condition=_T(" AND ");
		}
		el_apr=m_list_approval.GetAt(i);
		if(el_apr==0)continue;
		if(el_apr->IsEmpty())
		{
			continue;
		}
		m_descrtiption+=(el_apr->is_exist)? APL_T("Есть статус "): APL_T("Нет статуса ");
		if(!el_apr->is_exist && m_mode==FindObject_All){
			AfxMessageBox( APL_T("Нельзя искать все объекты по отсутствующему статусу!"));
			return false;
		}

		// Формируем (<=пять) веток pathelement для отмеченых полей
		if(el_apr->status!=0){
			buf.Format(_T(" .status = #%i"),el_apr->status->GetId());
			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;
			apidata.GetAttr(el_apr->status,m_api->m_appr_mgr.a_appr_status_name,buf);
			m_descrtiption+=_T("'")+buf+_T("'; ");
		}
		if(el_apr->descr != _T(""))
		{
			buf = _T(" .notes ");
			buf += CaplQLQuery::LogOp2String(el_apr->descr_relation, false);
			buf += _T(" '") + el_apr->descr+_T("' ");

			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;

			m_descrtiption+=_T(" описание ");
			m_descrtiption += CaplQLQuery::LogOp2String(el_apr->descr_relation, true);
			m_descrtiption += _T(" '") + el_apr->descr+_T("'; ");

		}
		if(el_apr->person!=0)
		{
			if(apidata.IsKindOf(el_apr->person,m_api->m_appr_mgr.e_pers_org))
			{
				apidata.GetAttr(el_apr->person,m_api->m_appr_mgr.a_po_the_pers,inst);
			}
			else if(apidata.IsKindOf(el_apr->person,m_api->m_appr_mgr.e_person))
			{
				inst = el_apr->person;
			}
			else
			{
				inst = 0;
			}
			if(inst!=0)
			{
				buf.Format(_T(" (.person_organization->person_and_organization.the_person = #%i OR .person_organization = #%i )"),inst->GetId(),inst->GetId());
				if(is_second)condition+=_T(" AND ");
				condition+=buf;
				is_second=true;
				apidata.GetAttr(inst,m_api->m_appr_mgr.a_pers_last_name,buf);
				m_descrtiption+= APL_T("сотрудника ")+buf+_T("; ");
			}
		}
		if(el_apr->pers_org_role!=_T("")){
			if(el_apr->pers_org_role_eq){
				buf.Format(_T(" .role = '%s'"),el_apr->pers_org_role);
			}else{
				buf.Format(_T(" .role LIKE '%s'"),el_apr->pers_org_role);
			}
			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;
			m_descrtiption+= APL_T("в роли '")+	el_apr->pers_org_role+_T("'; ");
		}
		if(el_apr->is_single_date){
			if(el_apr->date_time_beg!=0){
				buf=FillDateCompare(_T("approval_date_time_s"),CaplQLQuery::aplEQUAL,el_apr->date_time_beg);
				if(is_second)condition+=_T(" AND ");
				condition+=buf;
				is_second=true;
				buf=el_apr->date_time_beg->Format(_T("%d.%m.%Y %H:%M:%S"));
				m_descrtiption+= APL_T("точно ")+	buf+_T("; ");
				
			}
		}else{
			if(el_apr->date_time_beg!=0){
				buf=FillDateCompare(_T("approval_date_time_s"),CaplQLQuery::aplBIGEQUAL,el_apr->date_time_beg);
				if(is_second)condition+=_T(" AND ");
				condition+=buf;
				is_second=true;
				buf=el_apr->date_time_beg->Format( APL_T("с %d.%m.%Y %H:%M:%S"));
				m_descrtiption+=buf;
			}
			if(el_apr->date_time_end!=0){
				buf=FillDateCompare(_T("approval_date_time_s"),CaplQLQuery::aplSMALLEQUAL,el_apr->date_time_end);
				if(is_second)condition+=_T(" AND ");
				condition+=buf;
				is_second=true;
				buf=el_apr->date_time_end->Format( APL_T(" по %d.%m.%Y %H:%M:%S"));
				m_descrtiption+=buf;
			}
		}
		if(el_apr->revoc_date_time_beg!=0){
			buf=FillDateCompare(_T("revocation_date_time"),CaplQLQuery::aplBIGEQUAL,el_apr->revoc_date_time_beg);
			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;
			buf=el_apr->revoc_date_time_beg->Format( APL_T("с %d.%m.%Y %H:%M:%S"));
			m_descrtiption+=buf;
		}
		if(el_apr->revoc_date_time_end!=0){
			buf=FillDateCompare(_T("revocation_date_time"),CaplQLQuery::aplSMALLEQUAL,el_apr->revoc_date_time_end);
			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;
			buf=el_apr->revoc_date_time_end->Format( APL_T(" по %d.%m.%Y %H:%M:%S"));
			m_descrtiption+=buf;
		}
		if(el_apr->is_dig_sign==0){
			buf.Format(_T(" .digital_sign = ''"),el_apr->pers_org_role);
			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;
			m_descrtiption+=APL_T("ЭЦП отсутствует");
		}else if(el_apr->is_dig_sign==1){
			buf.Format(_T(" .digital_sign != ''"),el_apr->pers_org_role);
			if(is_second)condition+=_T(" AND ");
			condition+=buf;
			is_second=true;
			m_descrtiption+=APL_T("ЭЦП есть");
		}
		m_descrtiption+=_T("; ");
		
		// Создаем экстент(ы), и заносим в поле выбора точку входа
		MakeExtAndField(m_api->m_appr_mgr.e_apl_appr_pers_org,m_api->m_appr_mgr.a_appr_item,condition,el_apr->is_exist);
	}
	return true;
/**/
}

// Формирует массив QLэкстентов для поиска по характеристикам
bool CFindQueryDlg::MakeQueryChar()
{
	int i=0;
	ElValChar* el_ch;
	CaplEntity* base_entity;
	CString condition,buf,buf1;

	for(i=0;i<m_list_char.Size;i++){
		if(m_mode==FindObject_All){
			condition=_T("");
		}else{
			condition=_T(" AND ");
		}
		// Элемент из панельки достаем и проверяем
		el_ch=m_list_char.GetAt(i);
		if(el_ch==0)continue;
		if(el_ch->apl_char==0)continue;
		
		if(!el_ch->is_exist && m_mode==FindObject_All){
			AfxMessageBox( APL_T("Нельзя искать все объекты по отсутствующей характеристике!"));
			return false;
		}

		m_descrtiption+=(el_ch->is_exist)? APL_T("Есть характеристика \'"): APL_T("Нет характеристики \'");
		apidata.GetAttr(el_ch->apl_char,m_api->m_charact_mgr.a_apl_charact_name,buf);
		m_descrtiption+=buf+_T("\' ");
		if(el_ch->type!=0)
		{
			m_descrtiption+= APL_T("задан тип; ");
		}
		if(el_ch->b_max || el_ch->b_min || el_ch->b_val|| el_ch->dtt!=0)
		{
			m_descrtiption+= APL_T("задано значение; ");
		}
		
			// Объединение AND веток к инстансе характеристики и к ее значению
		// ветка к инстансе характеристики
		buf.Format(_T(" .characteristic = #%i "),el_ch->apl_char->GetId());
		if(el_ch->type!=0){
			buf1.Format(_T(" AND .assignment_type = #%i"),el_ch->type->GetId());
		}else{
			buf1=_T("");
		}
		condition+=buf+buf1;
		base_entity=m_api->m_charact_mgr.e_apl_charact_value;
		if(el_ch->b_max || el_ch->b_min || el_ch->b_val){
				// ветка к значению характеристики 
			condition+=FillCharValue(el_ch,&base_entity);
		}
		MakeExtAndField(base_entity,m_api->m_charact_mgr.a_apl_charact_val_item,condition,el_ch->is_exist);
	}
	return true;
}


// Формирует ветку QLпути к значению характеристики
CString CFindQueryDlg::FillCharValue(ElValChar* el_ch,CaplEntity** base_entity)
{
	CString result,s_val,s_max,s_min,buf;

	CaplInstance * unit;
	int num_field=0;
	if(base_entity==0)return _T("");

	if(el_ch->log_relation!=CaplQLQuery::aplEXIST){
//		result=_T(" AND .val->"); переход с 27 на 28 словарь
		result=_T(" AND ");
	}else{
		result=_T("");
		return result;
	}
	
	apidata.GetAttrBN(el_ch->apl_char,_T("unit"),unit);
	if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_step_unit) ||
		apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_descript_unit) ||
		apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_enum_unit) || 
		apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_monetary_unit))
	{
		// Формируем условия для значений
		if(el_ch->b_val){
			s_val=_T(".val ")+
				CaplQLQuery::LogOp2String(el_ch->log_relation,false)+
				el_ch->val;
			num_field++;
		}
		if(el_ch->b_max){
			s_max=_T(".max_deviation ")+
				CaplQLQuery::LogOp2String(el_ch->log_relation_max,false)+
				el_ch->val_max;
			num_field++;
		}
		if(el_ch->b_min){
			s_min=_T(".min_deviation ")+
				CaplQLQuery::LogOp2String(el_ch->log_relation_min,false)+
				el_ch->val_min;
			num_field++;
		}

		// Для этих типов характеристик определение значения однотипное
		// Определяем атрибут у наследника apl_characterictic_value
		if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_step_unit)){
//			result+=_T("apl_measured_characteristic_value"); переход с 27 на 28 словарь
			*base_entity=m_api->m_charact_mgr.e_meas_value;
			switch(num_field){
			case 1:
				if(el_ch->b_val){result+=s_val;}
				else if(el_ch->b_max){result+=s_max;}
				else if(el_ch->b_min){result+=s_min;}
				break;
			case 2:
				result+=_T("(");
				if(el_ch->b_val&&el_ch->b_max){
					result+=s_val+_T(" AND ")+s_max;
				}
				if(el_ch->b_val&&el_ch->b_min){
					result+=s_val+_T(" AND ")+s_min;
				}
				if(el_ch->b_max&&el_ch->b_min){
					result+=s_max+_T(" AND ")+s_min;
				}
				result+=_T(")");
				break;
			case 3:
				result+=_T("(")+s_val+_T(" AND ")+s_max+_T(" AND ")+s_min+_T(")");
				break;
			default:
				return CString(_T(""));
			}

		}else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_descript_unit)){
			if(!el_ch->b_val)return CString(_T(""));
//			result+=_T("apl_descriptive_characteristic_value")+s_val; переход с 27 на 28 словарь
			*base_entity=m_api->m_charact_mgr.e_descr_value;
			result+=s_val;
		}else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_enum_unit)){
			if(!el_ch->b_val)return CString(_T(""));
//			result+=_T("apl_enumeration_characteristic_value")+s_val; переход с 27 на 28 словарь
			*base_entity=m_api->m_charact_mgr.e_enum_value;
			result+=s_val;
		}else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_monetary_unit)){
			if(!el_ch->b_val)return CString(_T(""));
//			result+=_T("apl_monetary_characteristic_value")+s_val; переход с 27 на 28 словарь
			*base_entity=m_api->m_charact_mgr.e_monet_value;
			result+=s_val;
		}
	}else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_time_unit)){
		// для даты ветка пути специфичная
		if(el_ch->b_val){
//			result+=_T("apl_point_in_time_characteristic_value")+ переход с 27 на 28 словарь
			*base_entity=m_api->m_charact_mgr.e_time_val;
			result+=
				FillDateCompare(_T("val_s"),el_ch->log_relation,el_ch->dtt);
		}
	}
	else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_reference_unit))
	{
		if(el_ch->b_val){
			if(el_ch->m_cur_ref_val==0)return _T("");
			s_val.Format(_T(" #%i "),el_ch->m_cur_ref_val->GetId());
//			result+=_T("apl_reference_value.val ")+ переход с 27 на 28 словарь
			*base_entity=m_api->m_charact_mgr.e_apl_reference_value;
			result+=_T(".val ")+
				CaplQLQuery::LogOp2String(el_ch->log_relation,false)+
				s_val;
		}
	}
	return result;
}

// Формирует массив QLэкстентов для поиска по документам
bool CFindQueryDlg::MakeQueryDoc()
{
	ElValDoc* el_doc;
	CString condition,part_id,part_name,part_type,buf;
	int i,count;
	for(i=0;i<m_list_doc.Size;i++){
		if(m_mode==FindObject_All){
			condition=_T(" .assigned_document->document");
		}else{
			condition=_T(" AND .assigned_document->document");
		}
		count=0;
		// Элемент из панельки достаем и проверяем
		el_doc=m_list_doc.GetAt(i);
		if(el_doc==0)continue;
		if(!el_doc->is_exist && m_mode==FindObject_All){
			AfxMessageBox( APL_T("Нельзя искать все объекты по отсутствующему документу!"));
			return false;
		}
		m_descrtiption+=(el_doc->is_exist)? APL_T("Есть документ: "): APL_T("Нет документа: ");
		
		if(el_doc->id != _T("")){
			// Объединение AND веток к инстансе характеристики и к ее значению
			// ветка к инстансе характеристики
			if(el_doc->is_eq_id){
				part_id.Format(_T(".id = '%s' "),el_doc->id);
				m_descrtiption+= APL_T("обозначение = '")+el_doc->id+_T("'; ");
			}else{
				part_id.Format(_T(".id LIKE '%s' "),el_doc->id);
				m_descrtiption+= APL_T("обозначение содержит '")+el_doc->id+_T("'; ");
			}
			count++;
			
		}
		if(el_doc->name != _T("")){
			// Объединение AND веток к инстансе характеристики и к ее значению
			// ветка к инстансе характеристики
			if(el_doc->is_eq_name){
				part_name.Format(_T(".name = '%s' "),el_doc->name);
				m_descrtiption+= APL_T("наименоване = '")+el_doc->name+_T("'; ");
			}else{
				part_name.Format(_T(".name LIKE '%s' "),el_doc->name);
				m_descrtiption+= APL_T("наименование содержит '")+el_doc->name+_T("'; ");
			}
			count++;
		}
		if(el_doc->type != 0){
			// Объединение AND веток к инстансе характеристики и к ее значению
			// ветка к инстансе характеристики
			part_type.Format(_T(".kind = #%i "),el_doc->type->GetId());
			count++;
			apidata.GetAttr(el_doc->type,m_api->m_doc_mgr.a_dt_pdt,buf);
			m_descrtiption+= APL_T("тип = '")+buf+_T("'; ");
			
		}
		if(count==0){continue;}
		else if(count==1){
			if(el_doc->type != 0){condition+=part_type;}
			else if(el_doc->id != _T("")){condition+=part_id;}
			else if(el_doc->name != _T("")){condition+=part_name;}
		}else{
			condition+=_T("(");
			if(el_doc->type != 0){condition+=part_type;}
			if(el_doc->type != 0 && el_doc->id != _T("")){condition+=_T(" AND ");}
			if(el_doc->id != _T("")){condition+=part_id;}
			if(el_doc->name != _T("")){condition+=_T(" AND ")+part_name;}
			condition+=_T(")");
		}
		MakeExtAndField(m_api->m_doc_mgr.e_apl_doc_ref,
			m_api->m_doc_mgr.a_apl_doc_ref_item,condition,el_doc->is_exist);
	}
	return true;
}

bool CFindQueryDlg::MakeQueryBlob()
{
	ElValBLOB* el_blob;
	CString prefix,middle,postfix;
	CString ext_eq=_T(""),ext_like=_T("");
	int i,count;
	if(m_ctrl_find_version.GetCheck()){
		// ищем только в активных версиях документов
		prefix=_T("apl_document(")+m_object_condition+_T(" AND .active->");
		middle=_T("");
		postfix=_T("))}\r\n");
	}else{
		prefix=_T("");
		middle=_T("(.of_document->apl_document")+m_object_condition+_T(" AND ");
		postfix=_T("))}.of_document->apl_document\r\n");
	}
	if(m_list_blob.Size>0)m_descrtiption+= APL_T(" в теле документа есть слова");
	for(i=0;i<m_list_blob.Size;i++){
		count=0;
		// Элемент из панельки достаем и проверяем
		el_blob=m_list_blob.GetAt(i);
		if(el_blob==0)continue;
		if(el_blob->word.FindOneOf(_T(",.;:?!\"'\\/%"))!=-1){
			AfxMessageBox( APL_T("Нельзя использовать в строке знаки препинания"));
			return false;
		}
		m_descrtiption+=_T(" ")+el_blob->word;
		if(el_blob->is_equal){
			if(ext_eq==_T("")){
				ext_eq=_T("Ext_BLOB_q{")+prefix+
					_T("apl_document_revision")+middle+_T(".access_form->apl_stored_document(.source = @BLOB_CONSIST('")+
					el_blob->word+_T("')\r\n");
			}else{
				ext_eq+=_T(" AND .source = @BLOB_CONSIST('")+el_blob->word+_T("')\r\n");
			}
		}else{
			if(ext_like==_T("")){
				ext_like=_T("Ext_BLOB_l{")+prefix+
					_T("apl_document_revision")+middle+_T(".access_form->apl_stored_document(.source LIKE @BLOB_CONSIST('")+
					el_blob->word+_T("')\r\n");
			}else{
				ext_like+=_T(" AND .source = @BLOB_CONSIST('")+el_blob->word+_T("')\r\n");
			}
		}
	}
	if(ext_eq!=_T("")){
		ext_eq+=postfix;
		if(m_fields!=_T(""))m_fields+=_T(" AND ");
		m_fields+=_T(" Ext_BLOB_q ");
	};
	if(ext_like!=_T("")){
		ext_like+=postfix;
		if(m_fields!=_T(""))m_fields+=_T(" AND ");
		m_fields+=_T(" Ext_BLOB_l ");
	};
	if(m_fields!=_T("")){m_fields+=_T(" \r\n ");m_cur_ext_num++;}
	m_extents+=ext_eq+ext_like;
	return true;
}


// Формирует массив QLэкстентов для поиска по ресурсам
bool CFindQueryDlg::MakeQueryRes()
{
	ElValRes* el_res;
	CString condition,part_id,part_name,part_type,buf;
	int i,count;
	for(i=0;i<m_list_res.Size;i++){
		if(m_mode==FindObject_All){
			condition=_T(" ");
		}else{
			condition=_T(" AND ");
		}
		count=0;
		// Элемент из панельки достаем и проверяем
		el_res=m_list_res.GetAt(i);
		if(el_res==0)continue;
		if(!el_res->is_exist && m_mode==FindObject_All){
			AfxMessageBox( APL_T("Нельзя искать все объекты по отсутствующему ресурсу!"));
			return false;
		}
		m_descrtiption+=(el_res->is_exist)? APL_T("Есть ресурс: "): APL_T("Нет ресурса: ");
		
		if(el_res->id_res != _T("")){
			// Объединение AND веток к инстансе характеристики и к ее значению
			// ветка к инстансе характеристики
			if(el_res->is_eq_id_res){
				part_id.Format(_T(".id = '%s' "),el_res->id_res);
				m_descrtiption+= APL_T("обозначение = '")+el_res->id_res+_T("'; ");
			}else{
				part_id.Format(_T(".id LIKE '%s' "),el_res->id_res);
				m_descrtiption+= APL_T("обозначение содержит '")+el_res->id_res+_T("'; ");
			}
			count++;
			
		}
		if(el_res->name_res != _T("")){
			// Объединение AND веток к инстансе характеристики и к ее значению
			// ветка к инстансе характеристики
			if(el_res->is_eq_name_res){
				part_name.Format(_T(".name = '%s' "),el_res->name_res);
				m_descrtiption+= APL_T("наименоване = '")+el_res->name_res+_T("'; ");
			}else{
				part_name.Format(_T(".name LIKE '%s' "),el_res->name_res);
				m_descrtiption+= APL_T("наименование содержит '")+el_res->name_res+_T("'; ");
			}
			count++;
		}
		if(el_res->type_res != 0){
			// Объединение AND веток к инстансе характеристики и к ее значению
			// ветка к инстансе характеристики
			part_type.Format(_T(".type = #%i "),el_res->type_res->GetId());
			count++;
			apidata.GetAttr(el_res->type_res,m_api->m_doc_mgr.a_dt_pdt,buf);
			m_descrtiption+= APL_T("тип = '")+buf+_T("'; ");
			
		}
		if(count==0){continue;}
		else if(count==1){
			if(el_res->type_res != 0){condition+=part_type;}
			else if(el_res->id_res != _T("")){condition+=part_id;}
			else if(el_res->name_res != _T("")){condition+=part_name;}
		}else{
			condition+=_T("(");
			if(el_res->type_res != 0){condition+=part_type;}
			if(el_res->type_res != 0 && el_res->id_res != _T("")){condition+=_T(" AND ");}
			if(el_res->id_res != _T("")){condition+=part_id;}
			if(el_res->name_res != _T("")){condition+=_T(" AND ")+part_name;}
			condition+=_T(")");
		}
		MakeExtAndField(m_api->m_bp_mgr.e_bp_res,m_api->m_bp_mgr.a_bp_res_process,condition,el_res->is_exist);
	}
	return true;
}

// "Собирает" QLэкстент (для продукта - два) для базовой ентити из 
// определенных ранее веток и дополняет массив полей выбора 
// резльтатов из результата экстента
void CFindQueryDlg::MakeExtAndField(CaplEntity *base_entity,CaplAttr *attr,CString conditions,bool is_exist)
{
	CString ext_name1,ext_name2,ext_name3,ext_name4,ext_name5,buf,fields;
	if(base_entity==0)
		return;
	if(attr==0)
		return;
	if(conditions==_T(""))
		return;
	//первый экстент...
	ext_name1.Format(_T("Ext_%i "),m_cur_ext_num);
	ext_name2.Format(_T("Ext_%i_a "),m_cur_ext_num);
	
	//ext_name.Format(_T("\n Ext_%i"),m_cur_ext_num);
	
	if(m_mode==FindObject_Document){
		ext_name3.Format(_T("Ext_%i_b "),m_cur_ext_num);
		ext_name4.Format(_T("Ext_%i_x "),m_cur_ext_num);
		ext_name5.Format(_T("Ext_%i_z "),m_cur_ext_num);

		m_extents+=ext_name1+_T(" {")+ base_entity->name+_T("(\n\t\t")+
			_T(".")+attr->name+_T("->")+m_object_name+m_object_condition+conditions+_T(")}.")+attr->name+_T("->apl_document_revision\n");
		fields=_T("(");
		if(m_ctrl_find_version.GetCheck()){
			// ищем только в активных версиях документов
			m_extents+=ext_name2+_T(" {apl_document(")+m_object_condition + _T(" AND .active ");
			if(is_exist){m_extents+=_T(" IN ");}else{m_extents+=_T(" NOT_IN ");}
			m_extents+=_T(" #")+ext_name1+ _T(" )}\n");
			fields+=ext_name2;
		}else{
			// Ищем во всех версиях
			if(is_exist){
				fields+=ext_name1+_T(".of_document->apl_document");
			}else{
				m_extents+=ext_name2+_T(" {apl_document_revision.# IN #")+
									ext_name1 +_T("}.of_document->apl_document\n");
				m_extents+=ext_name3+_T(" {apl_document(")+
					m_object_condition + _T(" AND .# NOT_IN #")+ext_name2+_T(" )}\n");
				fields+=ext_name3;
			}
		}
		m_extents+=ext_name4+_T(" {")+ base_entity->name+_T("(\n\t\t")+
			_T(".")+attr->name+_T("->apl_document")+m_object_condition+conditions+_T(")}.")+attr->name+_T("->apl_document\n");
		if(is_exist){
			fields+=_T(" OR ")+ext_name4+_T(" )\n\t");
		}else{
			m_extents+=ext_name5+_T(" {apl_document (")+m_object_condition+
					_T(" AND .# NOT_IN #")+ ext_name4 +_T(")}\n");
			fields+=_T(" AND ")+ext_name5+_T(" )\n\t");
		}
		
	}else if(m_mode==FindObject_BP){
		ext_name3.Format(_T("Ext_%i_b "),m_cur_ext_num);
		ext_name4.Format(_T("Ext_%i_x "),m_cur_ext_num);
		ext_name5.Format(_T("Ext_%i_z "),m_cur_ext_num);

		m_extents+=ext_name1+_T(" {")+ base_entity->name+_T("(\n\t\t")+
			_T(".")+attr->name+_T("->")+m_object_name+m_object_condition+conditions+_T(")}.")+attr->name+_T("\n");
		fields=_T("(");
		if(m_ctrl_find_version.GetCheck()){
			// ищем только в активных версиях документов
			m_extents+=ext_name2+_T(" {apl_business_process(")+m_object_condition + _T(" AND .active_version ");
			if(is_exist){m_extents+=_T(" IN ");}else{m_extents+=_T(" NOT_IN ");}
			m_extents+=_T(" #")+ext_name1+ _T(" )}\n");
			fields+=ext_name2;
		}else{
			// Ищем во всех версиях
			if(is_exist){
				fields+=ext_name1+_T(".")+attr->name+_T("->apl_business_process_version.process->apl_business_process");
			}else{
				m_extents+=ext_name2+_T(" {apl_business_process_version.# IN #")+
					ext_name1 +_T("}.process->apl_business_process\n");
				m_extents+=ext_name3+_T(" {apl_business_process(")+
					m_object_condition + _T(" AND .# NOT_IN #")+ext_name2+_T(" )}\n");
				fields+=ext_name3;
			}	
		}
		m_extents+=ext_name4+_T(" {")+ base_entity->name+_T("(\n\t\t")+
			_T(".")+attr->name+_T("->apl_business_process")+m_object_condition+conditions+_T(")}.")+attr->name+_T("->apl_business_process\n");
		if(is_exist){
			fields+=_T(" OR ")+ext_name4+_T(" )\n\t");
		}else{
			m_extents+=ext_name5+_T(" {apl_business_process (")+m_object_condition+
				_T(" AND .# NOT_IN #")+ ext_name4 +_T(")}\n");
			fields+=_T(" AND ")+ext_name5+_T(" )\n\t");
		}
		
	}else if(m_mode==FindObject_All){
		m_extents+=ext_name1+_T(" {")+ base_entity->name+_T("(\n\t\t")+
			conditions+_T(")}.item \n");
		if(is_exist){
			fields=ext_name1;
		}else{
			m_extents+=ext_name2+_T(" {")+m_object_name +_T("(")+
				m_object_condition + _T(" AND .# NOT_IN #")+ext_name1+_T(" )}\n");
			fields=ext_name2;
		}	
	}else{
		m_extents+=ext_name1+_T(" {")+ base_entity->name+_T("(\n\t\t")+
			_T(".")+attr->name+_T("->")+m_object_name+m_object_condition+conditions+_T(")}.")+attr->name+_T("->")+m_object_name+_T("\n");
		if(is_exist){
			fields=ext_name1;
		}else{
			m_extents+=ext_name2+_T(" {")+m_object_name +_T("(")+
				m_object_condition + _T(" AND .# NOT_IN #")+ext_name1+_T(" )}\n");
			fields=ext_name2;
		}	
	}
	if(m_fields!=_T("")){
		m_fields+=_T(" AND \n");
	}
	m_fields+=fields;
	m_cur_ext_num++;
}//void CFindQueryDlg::MakeExtAndField(CaplEntity *base_entity,CString conditions,bool is_exist){


static int rec_num=0;

// Формирует строку с условиями для сравнения двух дат
CString CFindQueryDlg::FillDateCompare(CString name_attr,CaplQLQuery::aplQLLogRelation log_relation,COleDateTime* dtt){
//										int year,int month,int day){
	CString result,buf,buf1,log_op_str;
	if(dtt==0)return _T("");
/*	rec_num++;
	if(rec_num==1){
		result=_T("->apl_date_and_time");
	}*/
	
	// Проверка на <= и >=
	if(log_relation==CaplQLQuery::aplSMALLEQUAL){
		result+=_T("(")+FillDateCompare(name_attr,CaplQLQuery::aplSMALL,dtt)+
			_T(" OR ")+FillDateCompare(name_attr,CaplQLQuery::aplEQUAL,dtt)+
			_T(")");
//		rec_num--;
		return result;
	}else if(log_relation==CaplQLQuery::aplBIGEQUAL){
//		result+=_T("(")+FillDateCompare(CaplQLQuery::aplBIG,year,month,day)+
		result+=_T("(")+FillDateCompare(name_attr,CaplQLQuery::aplBIG,dtt)+
//			_T(" OR ")+FillDateCompare(CaplQLQuery::aplEQUAL,year,month,day)+
			_T(" OR ")+FillDateCompare(name_attr,CaplQLQuery::aplEQUAL,dtt)+
			_T(")");
//		rec_num--;
		return result;
	}

	log_op_str=CaplQLQuery::LogOp2String(log_relation,false);
	aplDate2String(*dtt,buf1);
	buf.Format(_T(".%s %s '%s' "),name_attr,log_op_str,buf1);
	result+=buf;
	
	/*	if(log_relation==CaplQLQuery::aplEQUAL){
	buf.Format(_T("(.year_component = %i AND .month_component = %i AND .day_component =%i)\n"),year,month,day);
	result+=buf;
	}else{
	CString log_op_str=CaplQLQuery::LogOp2String(log_relation,false);
	buf.Format(_T("		((.year_component %s %i) OR ")
	_T("		(.year_component = %i AND .month_component %s %i) OR\n")
	_T("		(.year_component = %i AND .month_component = %i AND .day_component %s %i))\n"),
	log_op_str,year,
	year,log_op_str,month,
	year,month,log_op_str,day);
	result+=buf;
}*/
	//	rec_num--;
	return result;
}

///////////////////////////////////////////////////////////////////////
// сохранение в буфер - чтение из буфера

// сохранение в буфер строки основного атрибута
bool CFindQueryDlg::SaveDataToBufBaseString(CString str_par)
{
#ifdef _UNICODE
	// для юникода - типовая запись строки в буфер
	m_dbuf->AddStrBuf(str_par);
#else
	// для совместимости со старыми ANSI буферами - длина строки в одном байте
	BYTE b_len;
	int length=str_par.GetLength()+1;
	if(length>250)length=250;
	b_len=(BYTE)length;
	m_dbuf->Add(&b_len,1);
	m_dbuf->Add(str_par.GetBuffer(length),length);
#endif
	return true;
}

// сохранение в буфер основного атрибута
bool CFindQueryDlg::SaveDataToBufBaseAttr(BYTE &count, BYTE type1, BYTE type2, CString &str_par)
{
	count++;
	m_dbuf->Add(&type1,1);
	m_dbuf->Add(&type2,1);
	return SaveDataToBufBaseString(str_par);
}


// сохранение в буфер списка требуемых характеристик
bool CFindQueryDlg::Save2BufListQChar()
{
	BYTE type;
	int i;
	ElValChar* el_ch;
	bool flag;
	BYTE count =0;
	int id;
	CaplInstance* unit;
	DATE dt1;
	
	if(m_api==0)return false;
	if(m_dbuf==0)return false;

	// 1 байт - количество
	type=(BYTE)m_list_char.Size;
	m_dbuf->Add(&type,1);

	//в цикле для каждой характеристики
	for(i=0;i<m_list_char.Size;i++)
	{
		// Элемент из панельки достаем и проверяем
		el_ch=m_list_char.GetAt(i);
		flag=false;
		count=0;
		if(el_ch==0)flag=true;
		if(el_ch->apl_char==0)flag=true;
		if(!flag)
		{
			if(el_ch->apl_char!=0)count++;
			if(el_ch->type!=0)count++;
			if(el_ch->b_val!=0)count++;
			if(el_ch->b_max!=0)count++;
			if(el_ch->b_min!=0)count++;
			if(count==0)flag=true;
		}
		if(flag)
		{
			//1 байт - наличие (1 задана/0 не задана)
			type=0;
			m_dbuf->Add(&type,1);
			// 1 байт - количество атрибутов характеристики
			// то есть толком нет
			type=0;
			m_dbuf->Add(&type,1);
			continue;
		}
		//1 байт - наличие (1 задана/0 не задана)
		type=el_ch->is_exist?1:0;
		m_dbuf->Add(&type,1);
		// 1 байт - количество атрибутов характеристики
		m_dbuf->Add(&count,1);
		if(el_ch->apl_char!=0)
		{
			// 1 - характеристика (instance_id - 4 байта)
			type=1;
			m_dbuf->Add(&type,1);
			id=el_ch->apl_char->GetId();
			m_dbuf->Add(&id,4);
			apidata.GetAttrBN(el_ch->apl_char,_T("unit"),unit);
		}
		if(el_ch->type!=0){
			// 2 - тип характеристики (instance_id - 4 байта)
			type=2;
			m_dbuf->Add(&type,1);
			id=el_ch->type->GetId();
			m_dbuf->Add(&id,4);
		}
		if(el_ch->b_val!=0)
		{
			// 3 - значение характеристики. Для значения:
			type=3;
			m_dbuf->Add(&type,1);
			// 1 байт  - тип отношения в соответствии с CaplQLQuery::aplQLLogRelation
			type=(BYTE)el_ch->log_relation;
			m_dbuf->Add(&type,1);
			if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_step_unit) ||
				apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_descript_unit) ||
				apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_enum_unit) || 
				apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_monetary_unit))
			{
				// 1 - значение (1 байт длина строки + сама строка)
				type=1;
				m_dbuf->Add(&type,1);
				SaveDataToBufBaseString(el_ch->val);
			}
			else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_time_unit))
			{
				// 4 - дата (строка 8 байт)
				type=4;
				m_dbuf->Add(&type,1);
				dt1=(DATE)(*el_ch->dtt);
				m_dbuf->Add(&dt1,8);
			}
			else if(apidata.IsKindOf(unit,m_api->m_charact_mgr.e_apl_reference_unit))
			{
				// 5 - ссылочная (4 байта - instance_id)
				type=5;
				m_dbuf->Add(&type,1);
				id=(el_ch->m_cur_ref_val==0)?0:el_ch->m_cur_ref_val->GetId();
				m_dbuf->Add(&id,4);
			}   
		}
		if(el_ch->b_max!=0)
		{
			// 3 - значение характеристики. Для значения:
			type=3;
			m_dbuf->Add(&type,1);
			// 1 байт  - тип отношения в соответствии с CaplQLQuery::aplQLLogRelation
			type=(BYTE)el_ch->log_relation_max;
			m_dbuf->Add(&type,1);
			// 2 - значение max (1 байт длина строки + сама строка)
			type=2;
			m_dbuf->Add(&type,1);
			SaveDataToBufBaseString(el_ch->val_max);
		}
		if(el_ch->b_min!=0)
		{
			// 3 - значение характеристики. Для значения:
			type=3;
			m_dbuf->Add(&type,1);
			// 1 байт  - тип отношения в соответствии с CaplQLQuery::aplQLLogRelation
			type=(BYTE)el_ch->log_relation_min;
			m_dbuf->Add(&type,1);
			// 3 - значение min (1 байт длина строки + сама строка)
			type=3;
			m_dbuf->Add(&type,1);
			SaveDataToBufBaseString(el_ch->val_min);
		}
	}
	return true;
}


bool CFindQueryDlg::SaveDataToBuf()
{
	aplExtent ext;
	CString buf;
	CString str_par;
	CaplDataBuf dbuf_temp;
	ElValDoc* el_doc;
	ElValApproval* el_apr;
	ElValBLOB* el_blob;
	CaplInstance *inst;
	DATE dt1,dt2;
	
	BYTE type;
	BYTE count=0;
	bool flag;
	int i,k,id;
	if(!m_changed)return true;
	if(m_dbuf==0)m_dbuf=new CaplDataBuf();
	
	m_dbuf->Clear();
	// заголовок
#ifdef _UNICODE
	m_dbuf->Add(STD_HEADER_FIND_QUERY_DLG_U,strlen(STD_HEADER_FIND_QUERY_DLG_U)+1);
#else
	m_dbuf->Add(STD_HEADER_FIND_QUERY_DLG_A,strlen(STD_HEADER_FIND_QUERY_DLG_A)+1);
#endif
	// что ищем
	type=m_mode;
	m_dbuf->Add(&type,1);
	count=0;
	// атрибуты искомого объекта
	if(m_state_id!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_name!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_descr!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_type!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_code_ver!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_code_izd!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_source!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	if(m_state_ver!=CaplQLQuery::aplNOLOGREL)
			count++;
	
	m_dbuf->Add(&count,1);
	if(m_state_id!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditId.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_Id, (BYTE) m_state_id, str_par);
	}
	if(m_state_name!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditName.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_Name, (BYTE) m_state_name, str_par);
	}
	if(m_state_descr!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditDescr.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_Descr, (BYTE) m_state_descr, str_par);
	}
	if(m_state_type!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditType.GetWindowText(str_par);

		k=m_EditType.GetCurSel();
		count++;
		type=TFO_Type;
		m_dbuf->Add(&type,1);
		type=(BYTE)m_state_type;
		m_dbuf->Add(&type,1);

		if(m_state_type!=CaplQLQuery::aplNOLOGREL && m_state_type!=CaplQLQuery::aplNOTEXIST)
		{
			if(m_mode==FindObject_ProductVer)
			{
				SaveDataToBufBaseString(str_par);
			}
			if(m_mode==FindObject_Document || m_mode==FindObject_BP || m_mode==FindObject_Project)
			{
				// Для типа документа/БП/проекта нужно перевести имя типа в номер инстансы
				if(k!=-1){
					inst=(CaplInstance*)m_EditType.GetItemData(k);
					if(inst!=0){k=inst->GetId();}else{k=0;}
				}else{
					k=0;
				}
				m_dbuf->Add(&k,4);
			}
		}
		
	}
	if(m_state_code_ver!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditCodeVer.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_Code, (BYTE) m_state_code_ver, str_par);
	}
	if(m_state_code_ver1!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditCodeVer1.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_CodeVer1, (BYTE) m_state_code_ver1, str_par);
	}
	if(m_state_code_ver2!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditCodeVer2.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_CodeVer2, (BYTE) m_state_code_ver2, str_par);
	}
	if(m_state_code_izd!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditCodeIzd.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_CodeIzd, (BYTE) m_state_code_izd, str_par);
	}
	if(m_state_source!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditSource.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_Source, (BYTE) m_state_source, str_par);
	}
	if(m_state_ver!=CaplQLQuery::aplNOLOGREL)
	{
		m_EditVer.GetWindowText(str_par);
		SaveDataToBufBaseAttr(count, TFO_Ver, (BYTE) m_state_ver, str_par);
	}	




	// статусы искомого объекта
	type=(BYTE)m_list_approval.Size;
	m_dbuf->Add(&type,1);
	for(i=0;i<m_list_approval.Size;i++)
	{
		el_apr=m_list_approval.GetAt(i);
		flag=false;
		count=0;
		if(el_apr==0)flag=true;
		if(!flag)
		{
			if(el_apr->status!=0)count++;
			if(el_apr->descr!=_T(""))count++;
			if(el_apr->person!=0)count++;
			if(el_apr->pers_org_role!=_T(""))count++;
			if(el_apr->date_time_beg!=0 || el_apr->date_time_end!=0)count++;
			if(el_apr->revoc_date_time_beg!=0 || el_apr->revoc_date_time_end!=0)count++;
			if(el_apr->is_dig_sign!=-1)count++;
			if(count==0)flag=true;
		}
		if(flag)
		{
			type=0;
			m_dbuf->Add(&type,1);
			// то есть статуса толком нет
			type=0;
			m_dbuf->Add(&type,1);
			continue;
		}
		type=el_apr->is_exist?1:0;
		m_dbuf->Add(&type,1);
		m_dbuf->Add(&count,1);
		
		if(el_apr->status!=0)
		{
			type=1;
			m_dbuf->Add(&type,1);
			id=el_apr->status->GetId();
			m_dbuf->Add(&id,4);
		}
		if(el_apr->person!=0)
		{
			type=2;
			m_dbuf->Add(&type,1);
			if(el_apr->person!=0)
				id=el_apr->person->GetId();
			else
				id=0;

			m_dbuf->Add(&id,4);
		}
		if(el_apr->pers_org_role!=_T(""))
		{
			type=3;
			m_dbuf->Add(&type,1);
			type=(el_apr->pers_org_role_eq)?1:0;
			m_dbuf->Add(&type,1);
			SaveDataToBufBaseString(el_apr->pers_org_role);
		}
		if(el_apr->date_time_beg!=0 || el_apr->date_time_end!=0)
		{
			type=4;
			m_dbuf->Add(&type,1);
			if(el_apr->is_single_date)
			{
				type=0;
				m_dbuf->Add(&type,1);
				if(el_apr->date_time_beg!=0)
					dt1=*el_apr->date_time_beg;
				else
					dt1=0;
				
				m_dbuf->Add(&dt1,8);
			}
			else
			{
				type=1;
				m_dbuf->Add(&type,1);
				if(el_apr->date_time_beg!=0)
					dt1=(DATE)(*el_apr->date_time_beg);
				else
					dt1=0;
				
				if(el_apr->date_time_end!=0)
					dt2=(DATE)(*el_apr->date_time_end);
				else
					dt2=0;
				
				m_dbuf->Add(&dt1,8);
				m_dbuf->Add(&dt2,8);
			}		
		}
		if(el_apr->revoc_date_time_beg!=0 || el_apr->revoc_date_time_end!=0)
		{
			type=5;
			m_dbuf->Add(&type,1);
			if(el_apr->revoc_date_time_beg!=0)
				dt1=(DATE)(*el_apr->revoc_date_time_beg);
			else
				dt1=0;
			
			if(el_apr->revoc_date_time_end!=0)
				dt2=(DATE)(*el_apr->revoc_date_time_end);
			else
				dt2=0;
			
			m_dbuf->Add(&dt1,8);
			m_dbuf->Add(&dt2,8);
		}		
		if(el_apr->is_dig_sign!=-1)
		{
			type=6;
			m_dbuf->Add(&type,1);
			id = el_apr->is_dig_sign;
			m_dbuf->Add(&id,4);
		}		
		if(el_apr->descr!=_T(""))
		{
			type=7;
			m_dbuf->Add(&type,1);
			m_dbuf->AddStrBuf((LPCTSTR)el_apr->descr);
			type=(BYTE)el_apr->descr_relation;
			m_dbuf->Add(&type,1);
		}
	}
	// характеристики искомого объекта
	Save2BufListQChar();

	// документы искомого объекта
	type=(BYTE)m_list_doc.Size;
	m_dbuf->Add(&type,1);
	
	for(i=0;i<m_list_doc.Size;i++)
	{
		flag=false;
		count=0;
		// Элемент из панельки достаем и проверяем
		el_doc=m_list_doc.GetAt(i);
		if(el_doc==0)flag=true;
		if(!flag)
		{
			if(el_doc->id!=_T(""))count++;
			if(el_doc->name!=_T(""))count++;
			if(el_doc->type!=0)count++;
			if(count==0)flag=true;
		}
		if(flag)
		{
			type=0;
			m_dbuf->Add(&type,1);
			// то есть толком нет
			type=0;
			m_dbuf->Add(&type,1);
			continue;
		}
		type=(el_doc->is_exist)?1:0;
		m_dbuf->Add(&type,1);
		m_dbuf->Add(&count,1);
		if(el_doc->id != _T(""))
		{
			type=1;
			m_dbuf->Add(&type,1);
			type=(el_doc->is_eq_id)?1:0;
			m_dbuf->Add(&type,1);
			SaveDataToBufBaseString(el_doc->id);
		}
		if(el_doc->name != _T(""))
		{
			type=2;
			m_dbuf->Add(&type,1);
			type=(el_doc->is_eq_name)?1:0;
			m_dbuf->Add(&type,1);
			SaveDataToBufBaseString(el_doc->name);
		}
		if(el_doc->type != 0)
		{
			type=3;
			m_dbuf->Add(&type,1);
			id=el_doc->type->GetId();
			m_dbuf->Add(&id,4);
		}
	}
	// свойства диалога
	// 1 байт - флаг вывода результатов в таблицу (1 - надо, 0 не надо, 255 - флаг заблокирован)
	if(m_can_make_table)
		type=(m_IsMakeTableResult)?1:0;
	else
		type=255;
	
	m_dbuf->Add(&type,1);
	// ver 1_1
	// галочка поиска только активных версий 
	if(m_ctrl_find_version.GetCheck()){type=1;}else{type=0;}
	m_dbuf->Add(&type,1);
	// ver_1_2
	type=(BYTE)m_list_blob.Size;
	m_dbuf->Add(&type,1);
	
	for(i=0;i<m_list_blob.Size;i++)
	{
		flag=false;
		// Элемент из панельки достаем и проверяем
		el_blob=m_list_blob.GetAt(i);
		type=(el_blob->is_equal)?1:0;
		m_dbuf->Add(&type,1);
		SaveDataToBufBaseString(el_blob->word);
	}
	//m_changed=false;
	return true;
}


///////////////////////////////////////////////////////////////////////
// чтение из буфера

// чтение строки основного атрибута
bool CFindQueryDlg::LoadFromBufBaseString(CString &str_par)
{
	if(m_dbuf->m_ansi_string)
	{
		BYTE type;
		m_dbuf->Read(&type,1);
		char* cbuf=new char[type+1];
		m_dbuf->Read(cbuf,type);
		cbuf[type]=0;
		// даже если str_par юникодная строка - опреатор = должен отработать корректно
		str_par=cbuf;
		delete cbuf;
	}
	else
	{
		// для юникодного буфера - типовая запись/чтение строки в буфер
		m_dbuf->ReadStrBuf(str_par);

	}
	return true;
}


bool CFindQueryDlg::LoadFromBufListQChar()
{
	BYTE count =0;
	aplExtent ext1,ext2;
	int i,j,k;
	BYTE type;
	bool flag;
	BYTE count2;
	ElValChar* el_ch;
	int id;
	BYTE type2;
	DATE dt1;

	if(m_api==0)return false;
	if(m_dbuf==0)return false;

	// характеристики искомого объекта
	// 1 байт - количество
	m_dbuf->Read(&count,1);
	apidata.GetEntityExtent(m_api->m_charact_mgr.e_apl_charact,ext1);
	apidata.GetEntityExtent(m_api->m_charact_mgr.e_apl_charact_type,ext2);
	
	for(i=0;i<count;i++)
	{
		//1 байт - наличие (1 задана/0 не задана)
		m_dbuf->Read(&type,1);
		flag=type==1;
		//1 байт - количество атрибутов характеристики
		m_dbuf->Read(&count2,1);
		if(count2==0)continue;
		el_ch=new ElValChar();
		el_ch->is_exist=flag;
		
		for(k=0;k<count2;k++)
		{
			//1 байт - id атрибута (тип значения - длина значения):
			m_dbuf->Read(&type,1);
			switch(type)
			{
			case 1:
				//1 - характеристика (instance_id - 4 байта)
				m_dbuf->Read(&id,4);
				// поиск инстанса
				el_ch->apl_char=0;
				for(j=0;j<ext1.GetSize();j++)
				{
					if(id==ext1.GetAt(j)->GetId())
					{
						el_ch->apl_char=ext1.GetAt(j);
						break;
					}
				}
				break;
			case 2:
				//2 - тип характеристики (instance_id - 4 байта)
				m_dbuf->Read(&id,4);
				// поиск инстанса
				el_ch->type=0;
				for(j=0;j<ext2.GetSize();j++)
				{
					if(id==ext2.GetAt(j)->GetId())
					{
						el_ch->type=ext2.GetAt(j);
						break;
					}
				}
				break;
			case 3:
				//3 - значение характеристики. Для значения:
				// 1 байт  - тип отношения в соответствии
				m_dbuf->Read(&type2,1);
				//1 байт - тип значения (длина значения Y):
				m_dbuf->Read(&type,1);
				switch(type)
				{
				case 1:
					//1 - значение (1 байт длина строки + сама строка)
					LoadFromBufBaseString(el_ch->val);
					el_ch->b_val=true;
					el_ch->log_relation=(CaplQLQuery :: aplQLLogRelation)type2;
					break;
				case 2:
					//2 - значение max (1 байт длина строки + сама строка)
					LoadFromBufBaseString(el_ch->val_max);
					el_ch->b_max=true;
					el_ch->log_relation_max=(CaplQLQuery :: aplQLLogRelation)type2;
					break;
				case 3:
					//3 - значение min (1 байт длина строки + сама строка)
					LoadFromBufBaseString(el_ch->val_min);
					el_ch->b_min=true;
					el_ch->log_relation_min=(CaplQLQuery :: aplQLLogRelation)type2;
					break;
				case 4:
					//4 - дата (строка 8 байт)
					m_dbuf->Read(&dt1,8);
					if(dt1!=0)
					{
						if(el_ch->dtt==0)el_ch->dtt=new COleDateTime();
						*(el_ch->dtt)=dt1;
						el_ch->b_val=true;
						el_ch->log_relation=(CaplQLQuery :: aplQLLogRelation)type2;
					}
					break;
				case 5:
					//5 - ссылочная (4 байта - instance_id)
					m_dbuf->Read(&id,4);
					aplQFindInstIdInExtent(
						*((aplExtent*)(&(apidata.instances))),id,-1,true,&(el_ch->m_cur_ref_val));
					el_ch->b_val=true;
					el_ch->log_relation=(CaplQLQuery :: aplQLLogRelation)type2;
					break;
				}
			}	
		}
		if(el_ch->apl_char!=0){
			m_list_char.Add(el_ch);
		}
	}	
	return true;
}


bool CFindQueryDlg::LoadDataFromBuf()
{
	char* cbuf;
	aplExtent ext1,ext2,ext3;
	CString buf;
	CString str_par;
	CaplDataBuf dbuf_temp;
	ElValDoc* el_doc;
	ElValApproval* el_apr;
	ElValBLOB* el_blob;
	DATE dt1,dt2;
	
	BYTE type;
	BYTE count=0,count2;
	bool flag;
	bool flag_ver_1_0 = false;
	bool flag_ver_1_1 = false;
	bool flag_ver_1_2 = false;
	bool flag_ver_1_3 = false;
	bool flag_ver_1_4 = false;
	bool flag_ver_1_5 = false;
	bool flag_ver_1_6 = false;
	bool flag_ver_1_7 = false;
	bool flag_ver_1_8 = false;
	bool flag_ver_1_9 = false;

	int i, j, k, id, pos;	

	if(m_dbuf==0)return true;
	m_dbuf->Reset();
	if(m_dbuf->m_Size==0)return true;

	m_list_char.Clear();
	m_list_doc.Clear();
	m_list_approval.Clear();
	m_list_blob.Clear();
	
	// заголовок
	k=strlen(STD_HEADER_FIND_QUERY_DLG_A)+1;
	cbuf=new char[k];
	if(!m_dbuf->Read(cbuf,k))return true;

	if(CStringA(cbuf)==STD_HEADER_FIND_QUERY_DLG_U)
	{
		m_dbuf->m_ansi_string = false;
	}
	else if(CStringA(cbuf)==STD_HEADER_FIND_QUERY_DLG_A)
	{
		m_dbuf->m_ansi_string = true;
	}
	else
	{
		AfxMessageBox( APL_T("Параметры диалога сохранены в буфере неизвестного формата.\nОбновите версию программы!"));
		delete cbuf;
		return false;
	}
	if(CStringA(cbuf).Mid(14) == "v1.0")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_0
		flag_ver_1_0 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.1")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_1)
		flag_ver_1_1 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.2")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_2)
		flag_ver_1_2 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.3")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_3)
		flag_ver_1_3 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.4")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_4)
		flag_ver_1_4 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.5")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_5)
		flag_ver_1_5 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.6")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_6)
		flag_ver_1_6 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.7")
	{
		// STD_HEADER_FIND_QUERY_DLG_1_7)
		flag_ver_1_7 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.8")
	{
		// #define STD_HEADER_FIND_QUERY_DLG_A_1_8	"FindQueryData v1.8\0"
		// #define STD_HEADER_FIND_QUERY_DLG_U_1_8 "FindQueryDatU v1.8\0"
		flag_ver_1_8 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v1.9")
	{
		// #define STD_HEADER_FIND_QUERY_DLG_A_1_9	"FindQueryData v1.9\0"
		// #define STD_HEADER_FIND_QUERY_DLG_U_1_9 "FindQueryDatU v1.9\0"
		flag_ver_1_9 = true;
	}
	else if(CStringA(cbuf).Mid(14) == "v2.0")
	{
		// #define STD_HEADER_FIND_QUERY_DLG_A		"FindQueryData v2.0\0"
		// #define STD_HEADER_FIND_QUERY_DLG_U		"FindQueryDatU v2.0\0"
		//flag_ver_2_0 = true; - это на будущее. Менять в двух диалогах поиска, в новом и в старом!
	}
	else
	{
		delete cbuf;
		AfxMessageBox( APL_T("Параметры диалога сохранены в буфере неизвестной версии.\nОбновите версию программы!"));
		return false;
	}

	delete cbuf;
	// что ищем
	m_dbuf->Read(&type,1);
	m_mode=(TypeFindObject)type;

	// атрибуты искомого объекта
	m_dbuf->Read(&count,1);
	for(j=0;j<count;j++)
	{
		m_dbuf->Read(&type,1);
		str_par=_T("");
		switch(type)
		{
		case TFO_Id:
			m_dbuf->Read(&type,1);
			//m_state_id=(type==1)?1:2;
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_id=CaplQLQuery::aplEQUAL;}else{m_state_id=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_id=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);

			m_EditId.SetWindowText(str_par);
			break;

		case TFO_Name:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_name=CaplQLQuery::aplEQUAL;}else{m_state_name=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_name=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			m_EditName.SetWindowText(str_par);
			break;

		case TFO_Descr:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_descr=CaplQLQuery::aplEQUAL;}else{m_state_descr=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_descr=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			m_EditDescr.SetWindowText(str_par);
			break;

		case TFO_Type:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_type=CaplQLQuery::aplEQUAL;}else{m_state_type=CaplQLQuery::aplNOTEXIST;}
			}
			else
			{
				m_state_type=(CaplQLQuery::aplQLLogRelation)type;
			}
			m_EditType.ResetContent();
			if(m_state_type!=CaplQLQuery::aplNOLOGREL && m_state_type!=CaplQLQuery::aplNOTEXIST)
			{
				if(m_mode==FindObject_ProductVer)
				{
					LoadFromBufBaseString(str_par);
					k=0;
					for(i=0;i<m_api->m_prd_mgr.m_list_pdf_types.GetSize();i++)
					{
						m_EditType.AddString(m_api->m_prd_mgr.m_list_pdf_types.GetAt(i));
						if(m_api->m_prd_mgr.m_list_pdf_types.GetAt(i)==str_par)
						{
							k=i;
						}
					}
				}
				else if(m_mode==FindObject_Document)
				{
					str_par=_T("");
					k=0;
					m_dbuf->Read(&id,4);
					CaplInstance* inst;
					for(i=0;i<m_list_document_types.Size;i++)
					{
						inst = m_list_document_types.GetAt(i);
						if(inst==0)continue;
						if(inst->GetAccessmode()==aplNO) continue;

						apidata.GetAttr(inst,m_api->m_doc_mgr.a_dt_pdt,buf);
						pos=m_EditType.AddString(buf);
						m_EditType.SetItemData(pos,(DWORD)m_list_document_types.GetAt(i));
						if(m_list_document_types.GetAt(i)->GetId()==id)
						{
							str_par=buf;
							k=i;
						}
					}
				}
				else if(m_mode==FindObject_BP)
				{
					k=0;
					str_par=_T("");
					m_dbuf->Read(&id,4);
					for(i=0;i<m_list_action_types.Size;i++)
					{
						apidata.GetAttr(m_list_action_types.GetAt(i),m_api->m_bp_mgr.a_bp_type_name,buf);
						pos=m_EditType.AddString(buf);
						m_EditType.SetItemData(pos,(DWORD)m_list_action_types.GetAt(i));
						if(m_list_action_types[i]->GetId()==id)
						{
							str_par=buf;
							k=i;
						}
					}
				}
				else if(m_mode==FindObject_Project)
				{
					k=0;
					str_par=_T("");
					m_dbuf->Read(&id,4);
					for(i=0;i<m_list_project_types.Size;i++)
					{
						apidata.GetAttr(m_list_project_types.GetAt(i),m_api->m_project_mgr->a_project_type_name,buf);
						pos=m_EditType.AddString(buf);
						m_EditType.SetItemData(pos,(DWORD)m_list_project_types.GetAt(i));
						if(m_list_project_types[i]->GetId()==id)
						{
							str_par=buf;
							k=i;
						}
					}
				}			
			}

			//m_EditType.SetWindowText(str_par);
			//m_EditType.SetCurSel(k);
			m_EditType.SelectString(0,str_par);
			k=m_EditType.GetCount();
			break;

		case TFO_Code:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_code_ver=CaplQLQuery::aplEQUAL;}else{m_state_code_ver=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_code_ver=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			m_EditCodeVer.SetWindowText(str_par);
			break;
			
		case TFO_CodeVer1:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_code_ver1=CaplQLQuery::aplEQUAL;}else{m_state_code_ver1=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_code_ver1=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
						
			m_EditCodeVer1.SetWindowText(str_par);
			break;
			
		case TFO_CodeVer2:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_code_ver2=CaplQLQuery::aplEQUAL;}else{m_state_code_ver2=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_code_ver2=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			m_EditCodeVer2.SetWindowText(str_par);
			break;
			
		case TFO_CodeIzd:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_code_izd=CaplQLQuery::aplEQUAL;}else{m_state_code_izd=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_code_izd=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			m_EditCodeIzd.SetWindowText(str_par);
			break;
			
		case TFO_Source:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_source=CaplQLQuery::aplEQUAL;}else{m_state_source=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_source=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			// ищем выделенный
			k=0;
			if( APL_T("Не известно")==str_par)k=0;
			if( APL_T("Покупное")==str_par)k=1;
			if( APL_T("Изготовляемое")==str_par)k=2;
			if( APL_T("По кооперации")==str_par)k=3;
			if( APL_T("Назначается")==str_par)k=4;
			m_EditSource.SetCurSel(k);
			break;

		case TFO_Ver:
			m_dbuf->Read(&type,1);
			if(flag_ver_1_2 || flag_ver_1_1 || flag_ver_1_0)
			{
				if(type==1){m_state_ver=CaplQLQuery::aplEQUAL;}else{m_state_ver=CaplQLQuery::aplLIKE;}
			}
			else
			{
				m_state_ver=(CaplQLQuery::aplQLLogRelation)type;
			}
			LoadFromBufBaseString(str_par);
			
			m_EditVer.SetWindowText(str_par);
			break;
		}
	}


	// статусы искомого объекта
	m_dbuf->Read(&count,1);
	
	apidata.GetEntityExtentBN(_T("approval_status"),ext1);
	apidata.GetEntityExtentBN(_T("person_and_organization"),ext2);
	apidata.GetEntityExtentBN(_T("person"),ext3);
	for(i=0;i<count;i++)
	{
		m_dbuf->Read(&type,1);
		flag=type==1;
		m_dbuf->Read(&count2,1);
		if(count2==0)continue;
		el_apr=new ElValApproval();
		el_apr->is_exist=flag;

		for(j=0;j<count2;j++)
		{
			m_dbuf->Read(&type,1);
			switch(type){
			case 1:
				// 1 - статус (instance_id - 4 байта)
				m_dbuf->Read(&id,4);
				for(k=0;k<ext1.Size;k++)
				{
					if(ext1[k]->GetId()==id){
						el_apr->status=ext1[k];
						break;
					}
				}
				break;
			case 2:
				// 2 - сотрудник (instance_id - 4 байта)
				m_dbuf->Read(&id,4);
				for(k=0;k<ext3.Size;k++)
				{
					if(ext3[k]->GetId()==id){
						el_apr->person=ext3[k];
						break;
					}
				}
				if(el_apr->person==0)
				{
					// это может быть старый способ, когда использовался person_and_organization
					for(k=0;k<ext2.Size;k++)
					{
						if(ext2[k]->GetId()==id){
							el_apr->person=ext2[k];
							break;
						}
					}
				}
				break;
			case 3:
				// 3 - роль (1 байт:1 равно,0 включает; строка - 1 байт длина строки + сама строка)
				m_dbuf->Read(&type,1);
				el_apr->pers_org_role_eq=type==1;
				LoadFromBufBaseString(el_apr->pers_org_role);
				break;
			case 4:
				// 4 - дата (сложное значение:
				// 1 байт - тип даты: 0 - точная дата, 1 - диапазон; 
				m_dbuf->Read(&type,1);
				if(type==0)
				{
					el_apr->is_single_date=true;
					m_dbuf->Read(&dt1,8);
					if(el_apr->date_time_beg==0)
					{
						el_apr->date_time_beg=new COleDateTime();
					}
					*(el_apr->date_time_beg)=(DATE)dt1;
				}
				else
				{
					el_apr->is_single_date=false;
					m_dbuf->Read(&dt1,8);
					m_dbuf->Read(&dt2,8);
					if(el_apr->date_time_beg==0 && dt1!=0)
					{
						el_apr->date_time_beg=new COleDateTime();
						*(el_apr->date_time_beg)=(DATE)dt1;
					}
					if(el_apr->date_time_end==0 && dt2!=0)
					{
						el_apr->date_time_end=new COleDateTime();
						*(el_apr->date_time_end)=(DATE)dt2;
					}
				}
				break;
			case 5:
				// 5 - дата аннулирования. Два 8-байтовых числа с "сырой" датой
				m_dbuf->Read(&dt1,8);
				m_dbuf->Read(&dt2,8);
				if(el_apr->revoc_date_time_beg==0 && dt1!=0)
				{
					el_apr->revoc_date_time_beg=new COleDateTime();
					*(el_apr->revoc_date_time_beg)=(DATE)dt1;
				}
				if(el_apr->revoc_date_time_end==0 && dt2!=0)
				{
					el_apr->revoc_date_time_end=new COleDateTime();
					*(el_apr->revoc_date_time_end)=(DATE)dt2;
				}
				break;
			case 6:
				// 6 - наличие /отсутствие ЭЦП. 4 байта, int
				m_dbuf->Read(&id,4);
				el_apr->is_dig_sign=id;
				break;
			case 7:
				//flag_ver_1_9
				// 7 - наличие /отсутствие описания. 4 байта длина строки + строка
				m_dbuf->ReadStrBuf(el_apr->descr);
				m_dbuf->Read(&type,1);
				el_apr->descr_relation=(CaplQLQuery::aplQLLogRelation)type;
				break;
			}
				
		}
		m_list_approval.Add(el_apr);
		
	}
	LoadFromBufListQChar();
		
	// документы искомого объекта
	// 1 байт - количество
	m_dbuf->Read(&count,1);
	apidata.GetEntityExtent(m_api->m_doc_mgr.e_dt,ext1);
//	apidata.GetEntityExtent(m_api->m_charact_mgr.e_apl_charact_type,ext2);
	
	for(i=0;i<count;i++)
	{
		//1 байт - наличие (1 задана/0 не задана)
		m_dbuf->Read(&type,1);
		flag=type==1;
		//1 байт - количество атрибутов документа
		m_dbuf->Read(&count2,1);
		if(count2==0)continue;
		el_doc=new ElValDoc();
		el_doc->is_exist=flag;
		for(k=0;k<count2;k++)
		{
			//1 байт - id атрибута (тип значения - длина значения):
			m_dbuf->Read(&type,1);
			switch(type){
			case 1:
				//1 - обозначение (1 байт: 1 равен/0 содержит; 1 байт длина строки + сама строка)
				m_dbuf->Read(&type,1);
				el_doc->is_eq_id=type==1;
				LoadFromBufBaseString(el_doc->id);
				break;
			case 2:
				//2 - наименование (1 байт: 1 равен/0 содержит; 1 байт длина строки + сама строка)
				m_dbuf->Read(&type,1);
				el_doc->is_eq_name=type==1;
				LoadFromBufBaseString(el_doc->name);
				break;
			case 3:
				//3 - тип (4 байта - instance_id)
				m_dbuf->Read(&id,4);
				for(j=0;j<ext1.GetSize();j++)
				{
					if(ext1.GetAt(j)->GetId()==id)
					{
						el_doc->type=ext1.GetAt(j);
						break;
					}
				}
				break;
				
			}
		}
		m_list_doc.Add(el_doc);
	}
	
	// свойства диалога
	// 1 байт - флаг вывода результатов в таблицу (1 - надо, 0 не надо, 255 - флаг заблокирован)
	m_dbuf->Read(&type,1);
	switch(type){
	case 0:
		//m_IsMakeTableResult=FALSE;
		m_can_make_table=true;
		break;
	case 1:
		//m_IsMakeTableResult=TRUE;
		m_can_make_table=true;
		break;
	case 252:
		//m_IsMakeTableResult=FALSE;
		m_can_make_table=false;
		m_CtrlMakeTableResult.EnableWindow(FALSE);
		break;
	}
	m_changed=false;
	if(flag_ver_1_0)return true;

	// ver 1_1

	// галочка поиска только активных версий 
	m_dbuf->Read(&type,1);
	if(type==1)m_ctrl_find_version.SetCheck(1);

	if(flag_ver_1_1)return true;

	// ver_1_2

	// поиск по телам документов
	// 1 байт - количество
	m_dbuf->Read(&count,1);
	for(i=0;i<count;i++)
	{
		el_blob=new ElValBLOB();
		m_dbuf->Read(&type,1);
		flag=type==1;
		el_blob->is_equal=flag;
		LoadFromBufBaseString(el_blob->word);
		m_list_blob.Add(el_blob);
	}
	
	return true;
}

bool CFindQueryDlg::SetDataBuf(CaplDataBuf &dbuf)
{
	if(m_dbuf==0){
		m_dbuf=new CaplDataBuf();
		if(m_dbuf==0)return false;
	}
	m_dbuf->Clear();
	m_dbuf->Add(dbuf.GetBuffer(),dbuf.m_Size);
	return true;
}

bool CFindQueryDlg::GetDataBuf(CaplDataBuf &dbuf)
{
	if(m_dbuf==0)
		return false;
	dbuf.Clear();
	dbuf.Add(m_dbuf->GetBuffer(),m_dbuf->m_Size);
	return true;
}


void CFindQueryDlg::OnChangeEdit() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CResizableDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	m_changed=true;
	
}

void CFindQueryDlg::OnChangeEditNameQuery() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CResizableDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	m_changed=true;	
}


void CFindQueryDlg::OnBtnType() 
{
	// TODO: Add your control notification handler code here
	CaplInstance *inst=0;
	CString buf;
	int k=m_EditType.GetCurSel();
	m_changed=true;
	if(m_mode==FindObject_Document || m_mode==FindObject_BP /*|| m_mode==FindObject_Project*/){
		// Для типа документа/БП/проекта нужно перевести имя типа в номер инстансы
		if(k!=-1){
			inst=(CaplInstance*)m_EditType.GetItemData(k);
		}else{
			inst=0;
		}
	}else{
		return;
	}
	if(m_mode==FindObject_Document)
	{
		inst = m_api->m_doc_mgr.SelectDocType(inst,0,true);
		if(inst==0)return;
		apidata.GetAttr(inst,m_api->m_doc_mgr.a_dt_pdt,buf);
		
	}
	else if(m_mode==FindObject_BP)
	{
		inst = m_api->m_bp_mgr.SelectBpType(inst,0);
		if(inst==0)return;
		apidata.GetAttr(inst,m_api->m_bp_mgr.a_bp_type_name,buf);
	}
	else if(m_mode==FindObject_Project)
	{
		//m_api->m_
	}
	k=m_EditType.SelectString(0,buf);
}
