//1) Выкладываю не доделаную версию конвертера.
// в ближайшее время постараюсь доделать.
// так что заранее извеняюсь.
// а) сделано только получение нужных даных и частичное построение запроса.
// расматриваеться только часть запроса отвечающая за пути.
//краткое описание
ТЗ_Запрос или ТаблицаПЗ_Под- таблица содержащая начальную информацию при разбиении путей
ТЗ_ИменаПеременых- таблица содержащая итоговую информацию
Постараюсь по возможности довести обработку до состаяния автоматом
перевести отчеты типа Отчет по продажам ТМЦ ТИС.
Всем кто может помочь помогите.
Мне кажеться что объекты типа смысловых переводчиков со временем появяься для многих связок.
Наиболее вероятно Количество языков одной среды возрастет.(частично это и так простходит).
В настоящий момент для меня осоменно интерсны:
1С++--->1C,
1С++--->1C8,
1С8--->1С++,
1С8--->1С
Также мне кажеться перспектвным переводчик.
1С-->EXCEL+VBA.
Возможно интересна и связка
1С-->C++,ASM(+ разпаралеливание).
Но это связка пока мне кажеться менее перспективной.
Но это все в большей степени сказки,
а пока нет времени сделать
не такую уж и сложную задачу, ничего все еще только начинаеться.
Возможно стоит создать раздел посвященый переводчикам 1С-->1C++.
Его возможные части:
а) общая логика перевода.
б) разделы по специфики для компонент,
г) конкретные сложные примеры
//2 Подсчет итогов для групп в иерархическом справочнике
//а) получим группы для справочника
Справ="$Справочник.Номенклатура";
Grup="
|SELECT "+Справ+".ID, ase when ("+Справ+".ID=Grup2.ID) then Grup2.rod3 else "+Справ+".ID end
|FROM "+Справ+",
| (SELECT "+Справ+".ID, "+Справ+".PARENTID,"+Справ+".DESCR,
|rod0=case when ("+Справ+".ID=Grup1.ID) then 0 else 1 end,
|rod1=Grup1.rod1,
|rod2=case when ("+Справ+".ID=Grup1.ID) then Grup1.rod2 else "+Справ+".ID end,
|rod3=' 0'
| FROM "+Справ+",
| (SELECT "+Справ+".ID, "+Справ+".PARENTID,"+Справ+".DESCR,
| rod0=0,
| rod1="+Справ+".ID,rod2=' 0',rod3=' 0'
| FROM "+Справ+" WHERE ltrim("+Справ+".PARENTID)='0') as Grup1
| WHERE (("+Справ+".PARENTID=Grup1.ID) and (Grup1.rod0=0) ) OR ("+Справ+".ID=Grup1.ID )) as Grup2
|WHERE ("+Справ+".PARENTID=Grup2.ID and (Grup2.rod0=1)) OR ("+Справ+".ID=Grup2.ID)";
////|Order by 5,6,7
//б) получим исходную таблицу
vt_ПродажыТов="
|select
| /* Переменные запроса (группировки)*/
| Тов,
| /* Функции запроса */
| Колво=Sum(case when vt_Продажы.Количество>0 then vt_Продажы.Количество else 0 end),
| СумРуб=Sum(case when vt_Продажы.Количество>0 then vt_Продажы.СуммаРуб else 0 end),
| СумВал=Sum(case when vt_Продажы.Количество>0 then vt_Продажы.СуммаДол else 0 end),
| СумПок=Sum(case when vt_Продажы.Количество>0 then vt_Продажы.ПокрытиеДол else 0 end)
|from("+vt_Продажы+") as vt_Продажы
| group by
| Тов
|";
// добавлять группы лучше после подсчета итогов так быстрей!!!
// в)сперва добавим столбец с родителеми
ТекстSELECT="
|select
// | Тов [Тов $Справочник.Товар],
| Тов,
|Колво,СумРуб,СумВал,СумПок,
|rod0,rod1,rod2,rod3
|from("+vt_ПродажыТов+") as vt_ПродажыТов
|Left outer join ("+Grup+") Grup on (Grup.id=vt_ПродажыТов.Тов)";
// г) потом добавим родителей у наших элементов
ТекстSELECT="
|select
| Тов=case when (Det.Тов=Rod.Id) then Тов else Rod.Id end,
|Колво,СумРуб,СумВал,СумПок,
// |Nrod3=case when (Det.Тов=Rod.Id) then rod3 else Rod.rod3 end)
|Rod.rod1,
|Rod.rod2,
|Rod.rod3
|from ("+ТекстSELECT+") Det
//|Left outer join ("+Grup+") as Rod on ((Det.Тов=Rod.Id) or (Det.rod1=Rod.Id) or (Det.rod2=Rod.Id) or (Det.rod3=Rod.Id))";
|Left outer join ("+Grup+") as Rod on ((Det.Тов=Rod.Id) or (Det.rod1=Rod.Id) or (Det.rod2=Rod.Id) or (Det.rod3=Rod.Id))";
// д) потом подсчитаем итоги и сортируем
ТекстSELECT="
|select
| /* Переменные запроса (группировки)*/
| Тов [Тов $Справочник.Товар],
| Колво=Sum(Колво),
| СумРуб=Sum(СумРуб),
| СумВал=Sum(СумВал),
| СумПок=Sum(СумПок)
| ,rod1,rod2,rod3
| from("+ТекстSELECT+") as vt_ПродажыИтог
| group by
| rod1,rod2,rod3,Тов
|";
//3 обрботка списка в котором есть группы
// хотя и не оптимально (некоторые элементы могут повторяться, зато просто)
Процедура СписокСГруппами1(СписокНач,СписокКон,ВидСправочника)
СписокКон=СоздатьОбъект("СписокЗначений");
КолЭлемент=СписокНач.РазмерСписка();
Если КолЭлемент>0 Тогда
Для х=1 По КолЭлемент Цикл
ТоварЭлем=СписокНач.ПолучитьЗначение(х);
Если ТоварЭлем.ЭтоГруппа()=1 Тогда
//Сообщить(ТоварЭлем);
ТекстЗапроса = "
|SELECT
| Val [Элемент $Справочник."+ВидСправочника+"]
|FROM #Группа";
Query.УложитьСписокОбъектов(ТоварЭлем, "#Группа",ВидСправочника);
//ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ = Query.ВыполнитьИнструкцию(ТекстЗапроса);
//Сообщить(ТЗ.КоличествоСтрок());
//ТЗ.Выгрузить(ТЗПров);
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
СписокКон.ДобавитьЗначение(ТЗ.Элемент);
КонецЦикла;
Иначе
СписокКон.ДобавитьЗначение(ТоварЭлем);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры