/// <summary>
        /// Упрощает группировку и проверят существование колонок в SELECT и пронумеровывает группировки
        /// </summary>
        /// <param name="select">Массив колонок</param>
        /// <param name="array">Массив ValueGroup</param>
        /// <returns></returns>
		public bool Siplify(SelectClass select, ArrayList array)
		{
			for (int i=0; i<array.Count; i++)
			{
				ValueGroup g = (ValueGroup) array[i];
				//g.ColumnName = 
				//Смотрим откуда эта колонка.
				bool Ok = false;
				for (int j=0;j<select.Count;j++)
				{
					if (select.isString(j))
					{
						//проверям имя на совпадение
						if (select[j] == g.ColumnName)
						{
							Ok = true;
							//Далее проверяем есть ли в текущем group
							bool ok2= false;
							for (int k=0;k<this.Count;k++)
							{
								if (g.ColumnName == this[k])
									ok2 = true;
							}
							if (!ok2 && (g.Func == null || g.Func == ""))
							{
								//Значит в текущем гроупе этого не найдено,надо искать в предыдущих.
								int idGroup = baseGroup.GetIdGroup(g.ColumnName);
								if (idGroup == -1)
								{
									throw new Exception("Ошибка, в синтаксисе, не найдено колонки:" + g.ColumnName);
								}
								g.idGroup = idGroup;
							}
						}
					}
				}
				if (!Ok)
				{
					//Значит не совпало, т.е. это имя не из этого Select
					//Проверяем из какого select-а она
					//Пробегаем все родительские :)
					string fullname = GetFullName(this.baseGroup.baseSql.parentSQL, g.ColumnName);
					if (fullname == null)
					{
						throw new NotExistException("GroupClassOne, GetFullName: Ошибка в синтаксисе - не найдено колонки '" + g.ColumnName+ "'");
					}
					//g.ColumnName = fullname;
					g.FullName = fullname;
				}
				
			}
			return true;
		}
		/// <summary>
		/// Пишет SELECT
		/// </summary>
		/// <param name="select">SELECT-класс</param>
		/// <param name="sql">SQL - схема</param>
		private void WriteSelect(SelectClass select, SQLStruct sql)
		{
			//Пишем условие, если у нас стоит тэг ONCE - одна запись
			for (int i=0;i< select.Count; i++)
			{
				if (select.isString(i))
				{
					string node = select[i];
					if (select.isKey(node))
						continue;
					string tablename = select.Table(i);//sql.GetTableName(select[i]);
					
					string val = "$var_"+ tablename + "/" +  select[i];
					

					if (sql.alias.GetColumnAlias(node) != null)
					{
						string Col = "$var_"+ tablename + "/" + sql.alias.GetColumnAlias(node).name;
						//string var_new = "$var_"+ tablename + "/" +  select[i];
						tw.WriteLine("<" + node + "><xsl:value-of select=\"" + Col + "\"/></" + node + ">");
					}else
					{
						tw.WriteLine("<" + node + "><xsl:value-of select=\"" + val + "\"/></" + node + ">");
					}

					if (select.IsUsedInChild(i))
					{
						string Col = val;
						if (sql.alias.GetColumnAlias(node) != null)
							Col = "$var_"+ tablename + "/" + sql.alias.GetColumnAlias(node).name;

						tw.WriteLine("<xsl:variable name=\"" + sql.GetSQLUniqueName() +"_select_" + node +"\" select=\"" + Col + "\"/>");
					}
				}
				else
				{
					WriteXSL(select.GetSQL(i), sql.group.Count);
				}
			}
			/*if (select.selectType == SELECTTYPE.ONCE)
				tw.WriteLine("</xsl:if>");*/
		}