вторник, 8 октября 2013 г.

Получить полный список родителей ссылки запросом 1с 8.х

1с Запрос пример:

Получим родителей:

Запрос = СоединениеС1С_.NewObject("Запрос");
    Запрос.Текст =
    "
    |ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка,
    |    Номенклатура.Родитель
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Ссылка = &МояСсылка
    |ИТОГИ ПО
    |    Ссылка ИЕРАРХИЯ
    |";
   
    Запрос.УстановитьПараметр("МояСсылка", Номенклатура);
   

    Тз_  = Запрос.Выполнить().Выгрузить();
   
    Если Тз_.количество()>0 Тогда
        Тз_.Удалить(Тз_.Количество()-1);//В конце выборки появляются 2 строки с ссылкой, удалим одну...


        //Создадим родителей
        для Каждого стр из Тз_ Цикл
            Если не стр.Ссылка.этогруппа Тогда Продолжить; КонецЕсли;
            Уи = СоединениеС1С_.string(стр.Ссылка.УникальныйИдентификатор());
            УиПриемник = Новый УникальныйИдентификатор(Уи);
            Найденная = Справочники.Номенклатура.ПолучитьСсылку(УиПриемник);               
            Если ПустаяСтрока(Найденная.Код) Тогда
                ОбР = Справочники.Номенклатура.СоздатьГруппу();
                ОбР.УстановитьСсылкуНового(Найденная);           
            Иначе
                ОбР = Найденная.ПолучитьОбъект();
            КонецЕсли;
            ОбР.Наименование = стр.ссылка.Наименование;       
            Попытка
                ОбР.Записать();
            Исключение
                Сообщить_(ОписаниеОшибки());
            КонецПопытки;
        КонецЦикла;

        //Расставим родителей

        для Каждого стр из Тз_ Цикл
            Если не стр.Ссылка.этогруппа Тогда Продолжить;КонецЕсли;
            Если стр.Ссылка.родитель.пустая() Тогда Продолжить;КонецЕсли;
            Уи = СоединениеС1С_.string(стр.Ссылка.УникальныйИдентификатор());
            УиПриемник = Новый УникальныйИдентификатор(Уи);
            Найденная = Справочники.Номенклатура.ПолучитьСсылку(УиПриемник);               
            Если ПустаяСтрока(Найденная.Код) Тогда
                Предупреждение("Ошибка в поиске группы по УИ");
                Возврат Неопределено;
            Иначе
                ОбС = Найденная.ПолучитьОбъект();
            КонецЕсли;
            Уи = СоединениеС1С_.string(стр.Родитель.УникальныйИдентификатор());
            УиПриемник = Новый УникальныйИдентификатор(Уи);
            Найденная = Справочники.Номенклатура.ПолучитьСсылку(УиПриемник);               
            Если ПустаяСтрока(Найденная.Код) Тогда
                Предупреждение("Ошибка в поиске родителя по УИ");
                Возврат Неопределено;
            Иначе
                ОбС.Родитель = Найденная;
                Попытка
                    ОбС.Записать();
                Исключение
                    Сообщить_(ОписаниеОшибки());
                КонецПопытки;
            КонецЕсли;
           
        КонецЦикла;
    КонецЕсли;