Имя: Пароль:
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)  Смену родителя можно выявить перед записью - после чего либо выдавать запрет, либо учинять перезапись всех элементов, где родитель не соответствует.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший