Имя: Пароль:
1C
1С v8
Родитель элемента
0 antihacker
 
31.03.15
11:31
Всем привет ! Помогите доделать код.

СтрокаТабличнойЧастиДоРеал.СчетУчетаБУ=СчетаУчетаНоменклатуры(СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель).СчетБУ;
      СтрокаТабличнойЧастиДоРеал.СчетУчетаНУ=СчетаУчетаНоменклатуры(СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель).СчетНУ;
      СтрокаТабличнойЧастиДоРеал.СчетДоходовБУ=СчетаУчетаНоменклатуры(СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель).СчетДоходовОтРеализацииБУ;      
      СтрокаТабличнойЧастиДоРеал.СчетДоходовНУ=СчетаУчетаНоменклатуры(СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель).СчетДоходовОтРеализацииНУ;            
      СтрокаТабличнойЧастиДоРеал.СчетСписанияСебестоимостиБУ=СчетаУчетаНоменклатуры(СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель).СчетСебестоимостиПриРеализацииБУ;
      СтрокаТабличнойЧастиДоРеал.СчетСписанияСебестоимостиНУ=СчетаУчетаНоменклатуры(СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель).СчетСебестоимостиПриРеализацииНУ;


-------------------------------

Функция СчетаУчетаНоменклатуры(Знач вхТовар)
    //-----Структура для возвращения результата---------
    СтруктураРезультата = Новый Структура("СчетБУ","СчетНУ","СчетДоходовОтРеализацииБУ","СчетДоходовОтРеализацииНУ","СчетСебестоимостиПриРеализацииБУ","СчетСебестоимостиПриРеализацииНУ");
    //СтруктураРезультата.Вставить("СчетБУ",0);

//---Ищем в регистре счета товара---------      
Запрос=Новый Запрос;
Запрос.УстановитьПараметр("вхТоварКод", вхТовар.Код);
Запрос.УстановитьПараметр("вхОрганизация", Справочники.Организации.НайтиПоКоду("000000001"));

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

    ВыборкаСчета = Запрос.Выполнить().Выбрать();
    //Результат=Запрос.Выполнить().Выгрузить();
    
    Если Запрос.Выполнить().Выбрать().Количество()>0 Тогда
    
        Пока ВыборкаСчета.Следующий() Цикл
         СтруктураРезультата.Вставить("СчетБУ",ВыборкаСчета.СчетУчетаБУ);    
         СтруктураРезультата.Вставить("СчетНУ",ВыборкаСчета.СчетУчетаНУ);
         СтруктураРезультата.Вставить("СчетДоходовОтРеализацииБУ",ВыборкаСчета.СчетДоходовОтРеализацииБУ);
         СтруктураРезультата.Вставить("СчетДоходовОтРеализацииНУ",ВыборкаСчета.СчетДоходовОтРеализацииНУ);
         СтруктураРезультата.Вставить("СчетСебестоимостиПриРеализацииБУ",ВыборкаСчета.СчетСебестоимостиПриРеализацииБУ);
         СтруктураРезультата.Вставить("СчетСебестоимостиПриРеализацииНУ",ВыборкаСчета.СчетСебестоимостиПриРеализацииНУ);
        КонецЦикла;
        
    КонецЕсли;
    
    Возврат СтруктураРезультата;

КонецФункции


Как видите из за строки

СтрокаТабЧастиТек.Номенклатура.Родитель.Родитель

В правочнике номенклатуры надо хранить четко по формату. То есть глубина не должна быть 2 родительских элемента. Можно как то сделать, так что бы плевать было где лежит номенклатура ?
1 antihacker
 
31.03.15
11:33
Мля. Глубина 2 уровня. Папка в папке элмент.
2 butterbean
 
31.03.15
11:34
100500 вызовов СчетаУчетаНоменклатуры() это конечно круто
по сабжу: найти родителя верхнего уровня, рекрсией например, или из полного кода номенклатуры
3 Креатив
 
31.03.15
11:35
(0)Посмотри как в типовой сделано.
4 antihacker
 
31.03.15
11:35
Искал искал запутался
5 Spyke
 
31.03.15
11:36
(0) Для поиска всех родителей можно использовать либо рекурсию либо запрос
|ВЫБРАТЬ РАЗЛИЧНЫЕ
    |
    |    Т1.Ссылка.Родитель КАК Ссылка
    |
    |ИЗ
    |
    |    Справочник.Номенклатура КАК Т1
    |
    |ГДЕ
    |
    |    Т1.Ссылка В ИЕРАРХИИ(&СсылкаНаЭлемент)  
    |
    |ИТОГИ ПО
    |
    |    Ссылка ТОЛЬКО ИЕРАРХИЯ
    |";
6 1Сергей
 
31.03.15
11:37
(0) А почему ты в запрос передаёшь код номенклатуры они ссылку?
7 1Сергей
 
31.03.15
11:37
они = а не
8 antihacker
 
31.03.15
12:46
А что ? Нельзя передавать код ?
9 1Сергей
 
31.03.15
12:47
(8) идеологически неверно
10 kosts
 
31.03.15
12:48
Хороший ход, надо себе оставить


ВыборкаСчета = Запрос.Выполнить().Выбрать();
Если Запрос.Выполнить().Выбрать().Количество()>0 Тогда
    Пока ВыборкаСчета.Следующий() Цикл
    КонецЦикла;
КонецЕсли;
11 antihacker
 
31.03.15
12:50
А ну ок.

   Spyke, твой запрос возвращает самую верхную папку ?
12 1Сергей
 
31.03.15
12:53
(11)

Функция ПолучитьСамогоСтаршегоМатьЕгоРодителя(ЧегоТо)
    Если ЧегоТо.Уровень() = 1 Тогда
        Возврат ЧегоТо;
    Иначе
        Возврат ПолучитьСамогоСтаршегоМатьЕгоРодителя(ЧегоТо.Родитель);
    КонецЕсли;
КонецФункции
13 Spyke
 
31.03.15
12:57
(11) Всю ерархию
Ошибка? Это не ошибка, это системная функция.