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

Тема в разделе "1C и всё что с ней связано", создана пользователем SeverBap, 9 сен 2008.

  1. SeverBap

    SeverBap Well-Known Member

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

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

    :blink:

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

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    народ ИспользоватьСписокЭлементов() - список элементов именно этого справочника или можно элементы с другого справочника (и на кройняк составные ввиде кода и наименования???) кто ковырялся??? (я работал с этим но не эксперементировал тупо делал отбор) :blink:
     
  3. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Нет нельзя устанавливать значения с другого справочника элементы!!! Получается что только после месяца можно поставить значения ... :blink:
     
  4. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Вообщем так ковырялся долго так и не чегоне понял;
    Создал форму "ФормаСписка" в ней кинул таблицуЗначений "ДеревоГрупп" - расположил как положено ... заполнил как надо все три уровня .. вот не задача нужно второй уровень "месеца" по аналогу что это группа была - тоесть когда я в поле ("Столбец - следующийуровень") кидаю ссылку на таблицузначений (со списком налогов - третий уровень - элементы справочника) она нормально все ставит крестик открываю и видны в дереве элементы которые мне не нужны я их буду светить в многострочной части ... пробовал пересвоение с пере остановкой ... может оставить два уровня ????
     
  5. kaa

    kaa Гость

    Слабо понял, то есть вы хотите чтобы при перемещении курсора отображалась группа с владельцем, если да то повесте функцию которая через реквезит владелец и будет заполнять вашу таблицу значений, или видимость колонок как удобнее
     
  6. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Повторяю: В ТаблицеЗначений - дерево (реализовано спомощью внешней компаненыт FormEX) и многострочная часть формы списка справочника (в которой будет взависимости от выбранной группы в таблице значений отображатся данные)....
    :)
    мой корявый код в форме списка справочника
    Код (Text):
    //////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////ПЕРЕМЕННЫЕ
    Перем ДеревоГрупп_Реквизиты[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:
     
  7. SeverBap

    SeverBap Well-Known Member

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

Поделиться этой страницей