МногострочнаяЧасть+Дерево

SeverBap

Well-known member
18.09.2007
451
0
#1
:rolleyes:
У меня возникла ситуация в которой надо реализовать связь между МногострочнойЧастью и деревом групп!
В этом справочнике уровень только один (тоесть вообще без групп), но он подчиненный справочник...
Суть кострукции:
Имеется справочник который двух-уровневый группа обозначает год (ну надо!!!!), второй (элементы) сообственно налог ... этому справочнику подчинен другой справочник одно-уровневый (в котором надо реализовать связь многострочнаяЧасть+Дерево) ... вот подчиненный это месяц (коротко год->налоги->месяцы в которых появляется налог) ... мне необходимо реализовать Год->Месяц->Налог (данное я реализовал в обычной обработке но из-за того что необходим отбор/подбор - надо ...)

кто нибудь цыплял связь такую??? (у меня есть FormEx)

:blink:

и вообще стоит мне заморачиватся с этим????
 

SeverBap

Well-known member
18.09.2007
451
0
#2
народ ИспользоватьСписокЭлементов() - список элементов именно этого справочника или можно элементы с другого справочника (и на кройняк составные ввиде кода и наименования???) кто ковырялся??? (я работал с этим но не эксперементировал тупо делал отбор) :blink:
 

SeverBap

Well-known member
18.09.2007
451
0
#3
Нет нельзя устанавливать значения с другого справочника элементы!!! Получается что только после месяца можно поставить значения ... :blink:
 

SeverBap

Well-known member
18.09.2007
451
0
#4
Вообщем так ковырялся долго так и не чегоне понял;
Создал форму "ФормаСписка" в ней кинул таблицуЗначений "ДеревоГрупп" - расположил как положено ... заполнил как надо все три уровня .. вот не задача нужно второй уровень "месеца" по аналогу что это группа была - тоесть когда я в поле ("Столбец - следующийуровень") кидаю ссылку на таблицузначений (со списком налогов - третий уровень - элементы справочника) она нормально все ставит крестик открываю и видны в дереве элементы которые мне не нужны я их буду светить в многострочной части ... пробовал пересвоение с пере остановкой ... может оставить два уровня ????
 
K
#5
Слабо понял, то есть вы хотите чтобы при перемещении курсора отображалась группа с владельцем, если да то повесте функцию которая через реквезит владелец и будет заполнять вашу таблицу значений, или видимость колонок как удобнее
 

SeverBap

Well-known member
18.09.2007
451
0
#6
Повторяю: В ТаблицеЗначений - дерево (реализовано спомощью внешней компаненыт FormEX) и многострочная часть формы списка справочника (в которой будет взависимости от выбранной группы в таблице значений отображатся данные)....
:)
мой корявый код в форме списка справочника
Код:
//////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////ПЕРЕМЕННЫЕ
Перем ДеревоГрупп_Реквизиты[300];
Перем УровеньМой;
Перем ТаблицаОбработкиДанных;
Перем ТЗ_Реквизиты2[300],х;
Перем ТЗ_Реквизиты3[300],хх;
//////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////ПРОЦЕДУРЫ И ФУНКЦИИ
//************************************************************************
Процедура ЗаполнитьДанными()
СписокЭлементовУстановка=СоздатьОбъект("СписокЗначений");
ТаблицаОбработкиДанных.ВыбратьСтроки();
Пока ТаблицаОбработкиДанных.ПолучитьСтроку()=1 Цикл
СписокЭлементовУстановка.ДобавитьЗначение(ТаблицаОбработкиДанных.Элемент);
КонецЦикла;	
Попытка
УстановитьОтбор("",);
Исключение
КонецПопытки;
ИспользоватьСписокЭлементов(СписокЭлементовУстановка);
КонецПроцедуры	
//************************************************************************
Процедура ПриРазворачиванииУзла(СтрокаОбработкиДерева,Флаг)
Сообщить(СтрокаОбработкиДерева);
КонецПроцедуры	
//************************************************************************
Функция ВернутьТретийУровень(РодительГод,РодительМесяц)
Перем ЗначениеВозврата;
СписокНалоговНаМесяц=СоздатьОбъект("СписокЗначений");
ОтчетныеПериоды=СоздатьОбъект("Справочник.ОтчетныйПериод");
ОтчетныеПериоды.ВыбратьЭлементы(0);
Пока ОтчетныеПериоды.ПолучитьЭлемент()=1 Цикл
Если (Число(ОтчетныеПериоды.Код)=Число(РодительМесяц)) И (ОтчетныеПериоды.Владелец.Родитель=РодительГод) Тогда
СписокНалоговНаМесяц.ДобавитьЗначение(ОтчетныеПериоды.ТекущийЭлемент());
КонецЕсли;	
КонецЦикла;
Если СписокНалоговНаМесяц.РазмерСписка()>0 Тогда
хх=хх+1;
ТЗ_Реквизиты3[хх]=СоздатьОбъект("ТаблицаЗначений");
ТЗ_Реквизиты3[хх].НоваяКолонка("СледУровень");
ТЗ_Реквизиты3[хх].НоваяКолонка("Пиктограмма");
ТЗ_Реквизиты3[хх].НоваяКолонка("Наименование");
ТЗ_Реквизиты3[хх].НоваяКолонка("Элемент");
Для Сч=1 По СписокНалоговНаМесяц.РазмерСписка() Цикл
ТЗ_Реквизиты3[хх].НоваяСтрока();
ТЗ_Реквизиты3[хх].Наименование=СписокНалоговНаМесяц.ПолучитьЗначение(Сч).Владелец.Налог.Наименование;
ТЗ_Реквизиты3[хх].Элемент=СписокНалоговНаМесяц.ПолучитьЗначение(Сч);
ТЗ_Реквизиты3[хх].СледУровень=0;
КонецЦикла;
ЗначениеВозврата=ТЗ_Реквизиты3[хх];
Иначе
ЗначениеВозврата=0;
КонецЕсли;	
Возврат ЗначениеВозврата;
КонецФункции	
//************************************************************************
Функция ВернутьВторойУровень(РодительГод)
Перем ЗначениеВозврата;
НалоговыеПериодыВиртуальные=СоздатьОбъект("Справочник.НалоговыйПериод");
ОтчетныеПериоды=СоздатьОбъект("Справочник.ОтчетныйПериод");
СписокМесяцев=СоздатьОбъект("СписокЗначений");
НалоговыеПериодыВиртуальные.ИспользоватьРодителя(РодительГод);
НалоговыеПериодыВиртуальные.ВыбратьЭлементы();
Пока НалоговыеПериодыВиртуальные.ПолучитьЭлемент()=1 Цикл
ОтчетныеПериоды.ИспользоватьВладельца(НалоговыеПериодыВиртуальные.ТекущийЭлемент());
ОтчетныеПериоды.ВыбратьЭлементы();
Пока ОтчетныеПериоды.ПолучитьЭлемент()=1 Цикл
Если СписокМесяцев.НайтиЗначение(ОтчетныеПериоды.Код)=0 Тогда
СписокМесяцев.ДобавитьЗначение(ОтчетныеПериоды.Код);
КонецЕсли;	
Если СписокМесяцев.РазмерСписка()=12 Тогда
Прервать;
КонецЕсли;
КонецЦикла;	
Если СписокМесяцев.РазмерСписка()=12 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если СписокМесяцев.РазмерСписка()>0 Тогда
х=х+1;
ТЗ_Реквизиты2[х]=СоздатьОбъект("ТаблицаЗначений");
ТЗ_Реквизиты2[х].НоваяКолонка("СледУровень");
ТЗ_Реквизиты2[х].НоваяКолонка("Пиктограмма");
ТЗ_Реквизиты2[х].НоваяКолонка("Наименование");
ТЗ_Реквизиты2[х].НоваяКолонка("Элемент");
Для Сч=1 По СписокМесяцев.РазмерСписка() Цикл
ТЗ_Реквизиты2[х].НоваяСтрока();
ТЗ_Реквизиты2[х].Наименование=ВернутьНазваниеМесяца(Число(СписокМесяцев.ПолучитьЗначение(Сч)));
ТабУстановки=ВернутьТретийУровень(РодительГод,Число(СписокМесяцев.ПолучитьЗначение(Сч)));
ТЗ_Реквизиты2[х].СледУровень=ТабУстановки;
ТЗ_Реквизиты2[х].Элемент=ТабУстановки;
КонецЦикла;
ЗначениеВозврата=ТЗ_Реквизиты2[х];
Иначе
ЗначениеВозврата=0;
КонецЕсли;
Возврат ЗначениеВозврата;
КонецФункции	
//************************************************************************
Процедура ЗаполнитьДеревоБезВладельца()
СправочникНалоговыхПериодов=СоздатьОбъект("Справочник.НалоговыйПериод");
СписокМесяцев=СоздатьОбъект("СписокЗначений");
ДеревоГрупп.НоваяСтрока();
ДеревоГрупп.Наименование="Налоги предприятия";
ДеревоГрупп_Реквизиты[1]=СоздатьОбъект("ТаблицаЗначений");
ДеревоГрупп_Реквизиты[1].НоваяКолонка("СледУровень");
ДеревоГрупп_Реквизиты[1].НоваяКолонка("Пиктограмма");
ДеревоГрупп_Реквизиты[1].НоваяКолонка("Наименование");
ДеревоГрупп_Реквизиты[1].НоваяКолонка("Элемент");
х=0;
хх=0;
СправочникНалоговыхПериодов.ВыбратьЭлементы();
Пока СправочникНалоговыхПериодов.ПолучитьЭлемент()=1 Цикл
Если СправочникНалоговыхПериодов.ЭтоГруппа()=1 Тогда
ДеревоГрупп_Реквизиты[1].НоваяСтрока();
ДеревоГрупп_Реквизиты[1].Наименование=СправочникНалоговыхПериодов.Наименование;
ДеревоГрупп_Реквизиты[1].СледУровень=ВернутьВторойУровень(СправочникНалоговыхПериодов.ТекущийЭлемент());
ДеревоГрупп_Реквизиты[1].Элемент=СправочникНалоговыхПериодов.ТекущийЭлемент();
КонецЕсли;	
КонецЦикла;	
ДеревоГрупп.СледУровень=ДеревоГрупп_Реквизиты[1];
УровеньМой=1;
ТаблицаОбработкиДанных=ДеревоГрупп_Реквизиты[1];
КонецПроцедуры	
//************************************************************************
Процедура ПриОткрытии()
Если ПустоеЗначение(Владелец)=1 Тогда
Сообщить("Без владельца");
ЗаполнитьДеревоБезВладельца();
Иначе
Сообщить("С владельцем");
КонецЕсли;
ЗаполнитьДанными();
КонецПроцедуры	
//************************************************************************
Процедура ПослеОткрытия()
АтрибутФормы_ТЗ=СоздатьОбъект("АтрибутФормы");
АтрибутФормы_ТЗ.УстановитьАтрибут(Форма,"ДеревоГрупп");
АтрибутФормы_ТЗ.ПерехватитьТаблицуЗначений();
РасширениеФормы = СоздатьОбъект("РасширениеФормы");
РасширениеФормы.УстановитьФорму(Форма);
РасширениеФормы.ЦветФона=(11100000); 
КонецПроцедуры
//************************************************************************

//////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////ОСНОВНОЙ МОДУЛЬ
ДеревоГрупп.НоваяКолонка("СледУровень");
ДеревоГрупп.НоваяКолонка("Пиктограмма");
ДеревоГрупп.НоваяКолонка("Наименование");
ДеревоГрупп.НоваяКолонка("Элемент");
ДеревоГрупп.ВидимостьКолонки("Элемент",0);
Написан без учета владельца, с владельцем будет попроще ... :huh:
 

SeverBap

Well-known member
18.09.2007
451
0
#7
По немножку сам иду:
Код:
Процедура ПриРазворачиванииУзла(СтрокаОбработкиДерева,Флаг)
Если СтрЧислоВхождений(СтрокаОбработкиДерева,"/")=2 Тогда
Флаг=0;
СписокЭлементовУстановка=СоздатьОбъект("СписокЗначений");
ВременнаяТаблица=АтрибутФормы_ТЗ.ЗначениеИзДерева(СтрокаОбработкиДерева,1);
ВременнаяТаблица.ВыбратьСтроки();
Пока ВременнаяТаблица.ПолучитьСтроку()=1 Цикл
СписокЭлементовУстановка.ДобавитьЗначение(ВременнаяТаблица.Элемент);
КонецЦикла;	
Попытка
УстановитьОтбор("",);
Исключение
КонецПопытки;
ИспользоватьСписокЭлементов(СписокЭлементовУстановка);
КонецЕсли;
КонецПроцедуры
При разворачивании определися и вывожу на форму последний уровень!!!!
остается определится с отображением данных групп как токовых!!!
:)