Имя: Пароль:
1C
1С v8
Как получить таблицу с определенным набором свойств объекта
,
0 Lekh72
 
17.03.13
15:28
Необходимо получить таблицу в которой отображался бы объект и определенный набор его свойств. Написал такой код:
   Запрос = Новый Запрос();
   ТекстЗапроса=
   "ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ВложенныйЗапрос.Объект,";
   КоличествоСвойств = ВыбранныеСвойства.Количество();
   Для к=1 По ВыбранныеСвойства.Количество() Цикл
       ТекстЗапроса = ТекстЗапроса + "
       |    ВложенныйЗапрос.Уровень"+к;
       Если к <> КоличествоСвойств Тогда
           ТекстЗапроса = ТекстЗапроса + ",";
       КонецЕсли;
   КонецЦикла;
   ТекстЗапроса = ТекстЗапроса +"
       |ИЗ
       |(ВЫБРАТЬ
       |    ЗначенияСвойствОбъектов.Объект,";
   Для к=1 По ВыбранныеСвойства.Количество() Цикл
       ТекстЗапроса = ТекстЗапроса + "
       |    ВЫБОР КОГДА ЗначенияСвойствОбъектов.Свойство = &Свойство"+к+" Тогда
       |   ЗначенияСвойствОбъектов.Значение КОНЕЦ КАК Уровень"+к;
       Если к <> КоличествоСвойств Тогда
           ТекстЗапроса = ТекстЗапроса + ","
       КонецЕсли;
   КонецЦикла;
   ТекстЗапроса = ТекстЗапроса +"
   |ИЗ
   |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов) КАК ВложенныйЗапрос";
   к=1;
   Для Каждого ВыбСвойство Из ВыбранныеСвойства Цикл
       Запрос.УстановитьПараметр("Свойство"+к,ВыбСвойство.ВыбранноеСвойство);
       к = к+1;
   КонецЦикла;
   
   Сообщить(ТекстЗапроса);
   Запрос.Текст = ТекстЗапроса;
   
   Результат = Запрос.Выполнить().Выгрузить();

В результате в таблицу выводятся столько строк по одному объекту, сколько свойств участвует в запросе, т.е. как свернуть запрос чтобы свойства попадали в одну строку с объектом.
1 Lekh72
 
18.03.13
16:43
uppp
2 Reset
 
18.03.13
16:50
Результат запроса циклом перенеси в структуру.
Или если любишь извраты (а судя по запросу, любишь), динамически создавай левые соединения по каждому свойству и список Выбрать.
3 Ёпрст
 
18.03.13
16:54
(0) и нафига там вложенный запрос ?
4 Lekh72
 
18.03.13
19:55
Запрос = Новый Запрос();
   ТекстЗапроса=
   "ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ЗначенияСвойствОбъектов.Объект,";
   КоличествоСвойств = ВыбранныеСвойства.Количество();
   Для к=1 По ВыбранныеСвойства.Количество() Цикл
       ТекстЗапроса = ТекстЗапроса + "
       |    ВЫБОР КОГДА ЗначенияСвойствОбъектов.Свойство = &Свойство"+к+" Тогда
       |   ЗначенияСвойствОбъектов.Значение КОНЕЦ КАК Уровень"+к;
       Если к <> КоличествоСвойств Тогда
           ТекстЗапроса = ТекстЗапроса + ","
       КонецЕсли;
   КонецЦикла;
   ТекстЗапроса = ТекстЗапроса +"
       |ИЗ
       |   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов";
   к=1;
   Для Каждого ВыбСвойство Из ВыбранныеСвойства Цикл
       Запрос.УстановитьПараметр("Свойство"+к,ВыбСвойство.ВыбранноеСвойство);
       к = к+1;
   КонецЦикла;
Результат тотже
5 Lekh72
 
18.03.13
19:57
Не пинайте, я только учусь (
6 SherifSP
 
18.03.13
20:00
(0) Почему просто не выбрать запросом все из регистра сведений? Там же и объект и свойство есть
7 zladenuw
 
18.03.13
20:09
(0) а тебе зачем ?
можно в скд сделать запрос. в настройках вывести свойство и значение в колонки. тогда у тебя будет 1 строка с объектов и куча колонок свойств
8 SherifSP
 
18.03.13
20:11
(7) + 100500
9 SherifSP
 
18.03.13
20:12
+(7) С отбором по свойству и прочему)
10 Lekh72
 
18.03.13
20:40
Мне потом надо справочник перестроить по этим свойствам. Хотя наверное и не надо в таблицу... Обойти запрос по группировкам...
11 zladenuw
 
18.03.13
21:35
и что. у тебя результатом будет тз. почитай про программный вывод скд.
12 Lekh72
 
18.03.13
23:54
да я это не на скд делаю. Всем спасибо за помощь. Надо плотнее  СКД заняться
13 zladenuw
 
19.03.13
00:02
в СКД
запрос.
            ВЫБРАТЬ
   ЗначенияСвойствОбъектов.Объект,
   ЗначенияСвойствОбъектов.Свойство,
   ЗначенияСвойствОбъектов.Значение
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
   ЗначенияСвойствОбъектов.Объект = &Объект
   //И ЗначенияСвойствОбъектов.Свойство В(&Свойство)

создать настройки вывода 2 минуты. вывести это все в тз
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   СхемаКомпоновкиДанныхА = ПолучитьМакет("Макет");
   
   КомпоновщикНастроекА = Новый КомпоновщикНастроекКомпоновкиДанных;
   КомпоновщикНастроекА.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанныхА));
   КомпоновщикНастроекА.ЗагрузитьНастройки(СхемаКомпоновкиДанныхА.НастройкиПоУмолчанию);
   
   КомпоновщикНастроекА.Настройки.ПараметрыДанных.Элементы.Найти("Параметр").Значение = "Параметр";
   
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанныхА,
       КомпоновщикНастроекА.Настройки,
       ,,
       Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
   
   тз = новый ТаблицаЗначений;
   ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
   ПроцессорВывода.ОтображатьПроцентВывода = Истина;
   тз = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший