Имя: Пароль:
1C
1С v8
как найти 1-го родителя в справочнике номенклатуры?
, ,
0 ddd2005
 
10.10.14
21:56
как найти 1-го родителя в справочнике номенклатуры?
1 Banned
 
10.10.14
21:59
цмклом
2 ddd2005
 
10.10.14
22:08
пытаюсь сделать так в УТ 10.3

Функция ДатьРодителя1(Элем)
    Рез="";
    Если ПустаяСтрока(Элем.Родитель)=0 Тогда
        Рез=ДатьРодителя1(Элем.Родитель);
    Иначе
        Если Элем.ЭтоГруппа()=1 Тогда
            Рез=Элем;
        Иначе
            Рез="Нет родителя";
        КонецЕсли;
    КонецЕсли;
    
    Возврат Рез;
КонецФункции
3 ddd2005
 
10.10.14
22:08
роцедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ДанныеСтроки);
    

    ОформлениеСтроки.ЦветФона    = WebЦвета.Белый;
        Если НЕ ПустаяСтрока(ДанныеСтроки) Тогда
        //СостояниеДокумента        = ДанныеСтроки.Ссылка.ВозвращениеДокумента;
                    //разукрашиваем в зависимости от состояния
            
            Если ДатьРодителя1(ДанныеСтроки.Ссылка) = "TDM" Тогда
                ОформлениеСтроки.ЦветФона    = WebЦвета.Желтый;        
            КонецЕсли;
        
    КонецЕсли;

    
КонецПроцедуры
4 ddd2005
 
10.10.14
22:08
ругается
{Справочник.Номенклатура.Форма.ФормаВыбора.Форма(848)}: Метод объекта не обнаружен (ЭтоГруппа)
        Если Элем.ЭтоГруппа()=1 Тогда
5 snegovik
 
10.10.14
22:10
(4) Кажись, это семерочный синтаксис...
6 ddd2005
 
10.10.14
22:13
(4) да с 7 назеркалил
7 hhhh
 
10.10.14
22:13
(4) УТ 10.3 написана на восьмерке
8 ОчкарикСлава
 
10.10.14
22:15
Элемент.родитель не катит?
9 hhhh
 
10.10.14
22:19
Родитель никогда не будет равен  "TDM", потому что "TDM" это же текст, а родитель - это же справочник.
10 XLife
 
10.10.14
22:23
Расширение табличного поля списка справочника (Catalog list table box extension)
РодительВерхнегоУровня (TopLevelParent)
Использование:

Чтение и запись.
Описание:

Тип: СправочникСсылка.
Содержит родителя верхнего уровня.

Доступность:

Толстый клиент.
11 ddd2005
 
10.10.14
22:26
пошел таким путем
12 ddd2005
 
10.10.14
22:26
Функция ПолучитьРодителя(ЭлементНоменклатура)
  ТекущийЭлементНоменклатуры = ЭлементНоменклатура;

Запрос = Новый Запрос("ВЫБРАТЬ
                     | Номенклатура.Родитель,
                     | Номенклатура.Родитель.Родитель,
                     | Номенклатура.Родитель.Родитель.Родитель,
                     | Номенклатура.Родитель.Родитель.Родитель.Родитель,
                     | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
                     |ИЗ
                     | Справочник.Номенклатура КАК Номенклатура
                     |
                     |ГДЕ
                     | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры");

Пока Истина Цикл
   Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры);
   Результат = Запрос.Выполнить();
   Если Результат.Пустой() Тогда
       Прервать;
   КонецЕсли;
   Выборка = Результат.Выбрать();
   Выборка.Следующий();
   Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
       ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
       Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
           Прервать;
       Иначе
           Сообщить(ТекущийЭлементНоменклатуры);
       КонецЕсли;
   КонецЦикла;

   Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
       Прервать;
   КонецЕсли;
КонецЦикла;
КонецФункции
//изм___________________
// при выводе строки списка
Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ДанныеСтроки);
    
    ОформлениеСтроки.ЦветФона    = WebЦвета.Белый;
        Если НЕ ПустаяСтрока(ДанныеСтроки) Тогда
        //СостояниеДокумента        = ДанныеСтроки.Ссылка.ВозвращениеДокумента;
                    //разукрашиваем в зависимости от состояния
            
            Если ПолучитьРодителя(ДанныеСтроки.Ссылка) = "TDM" Тогда
                ОформлениеСтроки.ЦветФона    = WebЦвета.Желтый;        
            КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры
13 zulu_mix
 
10.10.14
22:29
ну и жесть...
14 zulu_mix
 
10.10.14
22:31
если заранее известно количество уровней вложенности то через несколько вт последовательно собирай родителя и детей
15 AlexITGround
 
10.10.14
22:31
(0) Чем вариант в 10 не устраивает?
16 AlexITGround
 
10.10.14
22:33
Если хочешь достать запросом, то можно воспользоваться конструкцией "Выбор ... когда", сравнивая родителя с пустой ссылкой справочника.
17 zulu_mix
 
10.10.14
22:33
(15) может ему в запросе надо?
18 ddd2005
 
10.10.14
22:34
(15) торможу как проверить тут родителя
   Если ДанныеСтроки.Ссылка.РодительВерхнегоУровня() = "TDM" Тогда
19 zulu_mix
 
10.10.14
22:35
Если ДанныеСтроки.Ссылка.РодительВерхнегоУровня().Наименование = "TDM"
20 ddd2005
 
10.10.14
22:38
{Справочник.Номенклатура.Форма.ФормаВыбора.Форма(892)}: Метод объекта не обнаружен (РодительВерхнегоУровня)
            Если ДанныеСтроки.Ссылка.РодительВерхнегоУровня().Наименование = "TDM" Тогда
21 AlexITGround
 
10.10.14
22:41
(20) Ты пойми, Родитель - это тоже ссылка на этот же справочник, таблицу, он не может быть строкой "".
22 zulu_mix
 
10.10.14
22:41
а что в отладчике для ДанныеСтроки.Ссылка
23 hhhh
 
10.10.14
22:42
(20) это не то, всё таки запросом делай
24 hhhh
 
10.10.14
22:42
(22) по-любому у ссылки нет такого метода.
25 ddd2005
 
10.10.14
22:43
(23) как правильно подскажи
26 ddd2005
 
10.10.14
22:46
мне нужно разукрасить всю номенклатуру у которой родитель 1 уровня TDM

    Если СокрЛП(ДанныеСтроки.Ссылка)= "TDM" Тогда
                ОформлениеСтроки.ЦветФона    = WebЦвета.Желтый;        
            КонецЕсли;

так разукрасил только группу TDM
27 hhhh
 
10.10.14
22:50
ну как в (12) типа

Запрос = Новый Запрос("ВЫБРАТЬ
       | ВЫБОР
            КОГДА  Номенклатура.Родитель = &ПустаяСсылка
               ТОГДА Номенклатура.Родитель
            КОГДА  Номенклатура.Родитель.Родитель = &ПустаяСсылка
               ТОГДА Номенклатура.Родитель
            КОГДА  Номенклатура.Родитель.Родитель.Родитель = &ПустаяСсылка
               ТОГДА Номенклатура.Родитель.Родитель
            КОГДА  Номенклатура.Родитель.Родитель.Родитель.Родитель = &ПустаяСсылка
               ТОГДА Номенклатура.Родитель.Родитель.Родитель
КОНЕЦ КАК РодительВерхнегоУровня

                     |ИЗ
                     | Справочник.Номенклатура КАК Номенклатура
                     |
                     |ГДЕ
                     | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры");
28 zulu_mix
 
10.10.14
22:51
(27) пипец...
29 AlexITGround
 
10.10.14
22:55
ВЫБОР
            КОГДА  Номенклатура.Родитель <> &ПустаяСсылка
                И Номенклатура.Родитель.Наименование = "TDM"
                   Тогда Номенклатура.Родитель
            Когда ....
30 AlexITGround
 
10.10.14
22:59
Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Ссылка = &Ссылка
    |ИТОГИ ПО
    |    Ссылка ТОЛЬКО ИЕРАРХИЯ");
    Запрос.Параметры.Вставить("Ссылка", Ссылка);
31 AlexITGround
 
10.10.14
23:00
СправочникМенеджер.ВыбратьИерархически(<Родитель>,<Владелец>,<Отбор>,<Порядок>)
32 RomanYS
 
10.10.14
23:00
а сегодня пятница была?
33 AlexITGround
 
10.10.14
23:02
...
ГДЕ
    Номенклатура.Родитель В ИЕРАРХИИ(&Родитель)
34 AlexITGround
 
10.10.14
23:02
(32) Не, сегодня пятницы не было :(
35 zulu_mix
 
10.10.14
23:02
выбрать спр.ссылка
поместить первый_уровень
из справочник.номенклатура как спр
где спр.родитель = значение(справочник.номенклатура.пустаяссылка)
;
выбрать
уровень1.ссылка,
дети.ссылка как дитя
из первый_уровень как уровень1
левое соединение справочник.номенклатура как дети
по дети.родитель = уровень1.ссылка


и в таком же духе для всех известных уровней пока не соберем всех детей на уровне 1
36 hhhh
 
10.10.14
23:04
(28) а ваше (19) не пипец?
37 zulu_mix
 
10.10.14
23:05
(36) ай, нашел что вспомнить. у меня и одинца дома нет проверить
38 AlexITGround
 
10.10.14
23:08
Я думаю, что ошибку все исправят в (30):
"Запрос.Параметры.Вставить("Ссылка", Ссылка);"
39 hhhh
 
10.10.14
23:08
(33) это тормоз у вас будет, (27) можно сразу для списка номенклатуры сделать. Не забывайте, автору нужно всю таблицу покрасить, а вы тупо для одной номенклатуры сделали.
40 zulu_mix
 
10.10.14
23:13
(39) при таком раскладе автору проще сделать наследование цвета от родителя
41 ddd2005
 
10.10.14
23:15
(39) (30) да, увы не работает.
мне нужно прокрасить все элементы у которых родитель 1 уровня TDM. в этой группе есть еще подгруппы их тоже закрасить.
(40) как подскажи?
42 hhhh
 
10.10.14
23:19
(40) наверно самое простое во все подгруппы в наименование вставить "ТДМ".
43 zulu_mix
 
10.10.14
23:19
сделай у справочника номенклатура реквизит "цвет". заполняй его только у нужных элементов. перед записью элемента "если не элемент.родитель.пустаяссылка() тогда элемент.цвет = элемент.родитель.цвет;"
44 ddd2005
 
10.10.14
23:23
ОформлениеСтроки.ЦветФона    = WebЦвета.Белый;
        Если НЕ ПустаяСтрока(ДанныеСтроки) Тогда
            Если ДанныеСтроки.Ссылка.НужнаяГруппа= 1 Тогда
                ОформлениеСтроки.ЦветФона    = WebЦвета.Желтый;        
            КонецЕсли;
    КонецЕсли;
    
сделал так только в подборе это не пашет
45 ddd2005
 
10.10.14
23:23
Процедура НоменклатураДляПодбораПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    ОформлениеЯчейки  = ОформлениеСтроки.Ячейки;
    ЯчейкаПиктограмма = ОформлениеЯчейки.Пиктограмма;
    ЯчейкаПиктограмма.ОтображатьКартинку = Истина;

    Если ДанныеСтроки.ЭтоГруппа Тогда

        ЯчейкаПиктограмма.ИндексКартинки = 0; // группа
        Если ДанныеСтроки.ПереходитьВверх Тогда
            ОформлениеСтроки.ЦветФона = ЦветаСтиля.ЦветФонаФормы;
        КонецЕсли;

    Иначе

        Если ДанныеСтроки.Набор Тогда
            Если ДанныеСтроки.ПометкаУдаления Тогда
                ЯчейкаПиктограмма.Картинка = мКартинкаНаборУдален;
            Иначе
                ЯчейкаПиктограмма.Картинка = мКартинкаНабор;
            КонецЕсли;
        Иначе
            ЯчейкаПиктограмма.ИндексКартинки = 1; // элемент
        КонецЕсли;

    КонецЕсли;

    // Выделим цветом те цены, которые заданы особыми условиями поставок
    Если ДанныеСтроки.ФлагУсловийПоставки Тогда
        ОформлениеЯчейки.Цена.ЦветФона = WebЦвета.Лимонный;
    КонецЕсли;

    // Выделим цветом минимальный остаток из свободного остатка и остатка по организации
    Если ДанныеСтроки.КоличествоСвободныйОстаток < ДанныеСтроки.КоличествоОстатокОрганизации Тогда
        ОформлениеЯчейки.КоличествоСвободныйОстаток.ЦветТекста = WebЦвета.ТемноСиний;
    ИначеЕсли ДанныеСтроки.КоличествоСвободныйОстаток > ДанныеСтроки.КоличествоОстатокОрганизации Тогда
        ОформлениеЯчейки.КоличествоОстатокОрганизации.ЦветТекста = WebЦвета.ТемноСиний;
    КонецЕсли;

    // Установка текста ссылочного значения по представлению
    Если мКолонкаНоменклатура.Видимость Тогда
        ОформлениеЯчейки.Номенклатура.УстановитьТекст(ДанныеСтроки.ПредставлениеНоменклатура);
    КонецЕсли;

    Если мКолонкаХарактеристикаНоменклатуры.Видимость Тогда
        ОформлениеЯчейки.ХарактеристикаНоменклатуры.УстановитьТекст(ДанныеСтроки.ПредставлениеХарактеристикаНоменклатуры);
    КонецЕсли;

    Если мКолонкаСерияНоменклатуры.Видимость Тогда
        ОформлениеЯчейки.СерияНоменклатуры.УстановитьТекст(ДанныеСтроки.ПредставлениеСерияНоменклатуры);
    КонецЕсли;

    Если мКолонкаЕдиницаИзмерения.Видимость Тогда
        ОформлениеЯчейки.ЕдиницаИзмерения.УстановитьТекст(ДанныеСтроки.ПредставлениеЕдиницаИзмерения);
    КонецЕсли;

    Если мКолонкаВалюта.Видимость Тогда
        ОформлениеЯчейки.Валюта.УстановитьТекст(ДанныеСтроки.ПредставлениеВалюта);
    КонецЕсли;

    Если мКолонкаСклад.Видимость Тогда
        ОформлениеЯчейки.Склад.УстановитьТекст(ДанныеСтроки.ПредставлениеСклад);
    КонецЕсли;

    Если мКолонкаКачество.Видимость Тогда
        ОформлениеЯчейки.Качество.УстановитьТекст(ДанныеСтроки.ПредставлениеКачество);
    КонецЕсли;
           //изм____________
    ОформлениеСтроки.ЦветФона    = WebЦвета.Белый;
        Если НЕ ПустаяСтрока(ДанныеСтроки) Тогда
            Если ДанныеСтроки.Ссылка.НужнаяГруппа= 1 Тогда
                ОформлениеСтроки.ЦветФона    = WebЦвета.Желтый;        
            КонецЕсли;
    КонецЕсли;
    //изм____________

КонецПроцедуры // НоменклатураДляПодбораПриВыводеСтроки()
46 zulu_mix
 
10.10.14
23:24
я пожалуй умою отсюда руки
47 SeregaMW
 
10.10.14
23:26
(10) Как бы обозвать эту ... уятина вообщем это почти не где не работает, всегда это делалось обратной рекурсией!
48 SeregaMW
 
10.10.14
23:34
Спать хочу, работы до х.. коньяк греется так что на

Функция НайтиВерхнегоРодителя(Элем)
    Если НЕ ЗначениеЗаполнено(Элем.Родитель) Тогда
        Возврат Элем;
    Иначе
        Возврат НайтиВерхнегоРодителя(Элем.Родитель);
    КонецЕсли;
КонецФункции
49 Smallrat
 
10.10.14
23:43
что-то никто мегакод так и не запостил:
Вычислить("Номенклатура" + СтрЗаменить(Формат(0,"ЧЦ=" + Строка(Номенклатура.Уровень()) + "; ЧН=; ЧВН=; ЧГ="), "0", ".Родитель"))
(с) Рупор абсурда
50 SeregaMW
 
10.10.14
23:46
(49) Месье а Вы сильны в извращениях! )))
51 Smallrat
 
10.10.14
23:55
(50) Это не я, я б до такого не додумался. В оригинале он был для 7-ки и еще круче:
ВерхнийРодитель=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));
52 К_Дач
 
10.10.14
23:56
(1) рекурсия

(2) пакетный запрос, вот здесь умный дядя реализовал, рекомендую:

http://infostart.ru/public/158512/

вот поделка Fragstera

http://infostart.ru/public/84547/
53 SeregaMW
 
11.10.14
00:01
(52) Как буду на работе обязательно прочитаю и попытаюсь понять!
54 AlexITGround
 
11.10.14
00:05
чем не устроил вариант в (29)?
55 AlexITGround
 
11.10.14
00:06
(52) "вот поделка Fragstera"
Рассказывается в бесплатном курсе Гилева по СКД.
56 К_Дач
 
11.10.14
00:08
Для понимания еще неплохо прочитать https://ru.wikipedia.org/wiki/Транзитивное_замыкание

а вариант в (30) хорош только для одного элемента справочника
57 romix
 
11.10.14
00:27
Для запросов удобнее создавать реквизит...
А заполнять его в модуле объекта при записи.
58 К_Дач
 
11.10.14
00:33
(57) интересно, и что же тогда хранить в этом реквизите? Родителя верхнего уровня? А если у этого элемента (который у нас родитель верхнего уровня) - если у него у самого появится родитель? Что тогда? Всю цепочку что-ли перезаписывать? Булщит, одним словом
59 AlexITGround
 
11.10.14
00:38
(57) "создавать реквизит"
шикарно живете :)
60 romix
 
11.10.14
01:22
(58)  Смену родителя можно выявить перед записью - после чего либо выдавать запрет, либо учинять перезапись всех элементов, где родитель не соответствует.