Приветствую! Думаю все задавались вопросом как вывести в отчет элементы в соответствии с иерархией справочника, я этим вопросом мучился давно и вот разродился! смотрим, критикуем, копируем!
Функция ИнитТбУзла() тбУзла = СоздатьОбъект("ТаблицаЗначений"); тбУзла.НоваяКолонка("родитель", "справочник.Товар"); тбУзла.НоваяКолонка("Группа","справочник.Товар"); тбУзла.НоваяКолонка("Уровень", "Число"); тбУзла.НоваяКолонка("тбДети"); Возврат тбУзла; КонецФункции
//================================================================= Процедура ОбрТекУровень(знач текУровень, тбИсходная, тбБуферВходящий, тбБуферИсходящий, текСтрока, тбУзлаПустая); колСтрок = тбИсходная.КоличествоСтрок(); тбБуфер = СоздатьОбъект("ТаблицаЗначений"); тбУзлаПустая.Выгрузить(тбБуфер); колСтрокБуфВход = тбБуферВходящий.КоличествоСтрок(); Пока текСтрока <= колСтрок Цикл тбИсходная.ПолучитьСтрокуПоНомеру(текСтрока); Если тбИсходная.Уровень <> текУровень Тогда Прервать КонецЕсли; текГруппа = тбИсходная.Группа; тбБуфер.НоваяСтрока(); тбБуфер.родитель = тбИсходная.Родитель; тбБуфер.Группа = текГруппа; тбБуфер.Уровень = тбИсходная.Уровень; тбБуфер.тбДети = СоздатьОбъект("ТаблицаЗначений") ; тбУзлаПустая.Выгрузить(тбБуфер.тбДети); тбДетиБуфера = тбБуфер.тбДети; счБуферВходящий = 0; Если тбБуферВходящий.НайтиЗначение(текГруппа, счБуферВходящий, "Родитель") > 0 Тогда тбБуферВходящий.ПолучитьСтрокуПоНомеру(счБуферВходящий); Пока счБуферВходящий <= колСтрокБуфВход Цикл Если тбБуферВходящий.Родитель <> текГруппа Тогда Прервать КонецЕсли; тбДетиБуфера.НоваяСтрока(); тбДетиБуфера.родитель = текГруппа; тбДетиБуфера.Группа = тбБуферВходящий.Группа; тбДетиБуфера.Уровень = тбБуферВходящий.Уровень; тбДетиБуфера.тбДети = тбБуферВходящий.тбДети; тбБуферВходящий.УдалитьСтроку(); колСтрокБуфВход = колСтрокБуфВход - 1; КонецЦикла; тбДетиБуфера.Сортировать("Группа"); КонецЕсли; текСтрока = текСтрока + 1; КонецЦикла; тбБуфер.Сортировать("родитель"); тбБуферИсходящий = тбБуфер; КонецПроцедуры
//******************************************* Процедура Сформировать() RecordSet = СоздатьОбъект("ODBCRecordset"); текстСКЛ = " |WITH Parts(ParentID, ID, goodsLevel) as |( | SELECT mainGoods.ParentID, mainGoods.ID, 0 goodsLevel | FROM SC14 mainGoods | WHERE mainGoods.ISFolder = 1 AND mainGoods.ParentID = $ПустойИД | UNION ALL | SELECT childGoods.ParentID, childGoods.ID, goodsLevel + 1 | FROM SC14 childGoods | INNER JOIN Parts p | ON childGoods.ParentID = p.ID AND childGoods.ISFolder = 1 | ) |SELECT ParentID [родитель $справочник.Товар], ID [Группа $справочник.Товар], goodsLevel Уровень |FROM Parts |ORDER BY goodsLevel DESC"; тбРодителиИДети= RecordSet.ВыполнитьИнструкцию(текстСКЛ); тбРодителиИДети.НоваяКолонка("тбДети"); тбРодителиИДети.ПолучитьСтрокуПоНомеру(1); МаксУровень = тбРодителиИДети.Уровень; тбУзлаПустая = ИнитТбУзла(); тбБуферВходящий = СоздатьОбъект("ТаблицаЗначений"); тбУзлаПустая.Выгрузить(тбБуферВходящий); тбБуферИсходящий = СоздатьОбъект("ТаблицаЗначений"); тбУзлаПустая.Выгрузить(тбБуферИсходящий); текСтрока = 1; сч = МаксУровень; Пока сч > -1 Цикл ОбрТекУровень(сч, тбРодителиИДети, тбБуферВходящий, тбБуферИсходящий, текСтрока, тбУзлаПустая); тбБуферВходящий = тбБуферИсходящий; сч = сч - 1; КонецЦикла; тбПечать = СоздатьОбъект("ТаблицаЗначений"); тбПечать.НоваяКолонка("Группа"); тбБуферИсходящий.Сортировать("Группа"); ПечатьГрупп(тбБуферИсходящий,тбПечать); //тбПечать.ВыбратьСтроку(); КонецПроцедуры
|