Имя: Пароль:
1C
1С v8
Проверить значение на План Видов Характеристик
0 PaulMuller
 
30.07.18
17:50
Формирую текст запроса в цикле. Для правильного формирования мне нужно заранее знать, является ли реквизит документа (или каталога, или ТЧ того или иного, неважно) типом План Видов Характеристик. Если в конфигураторе явно задать реквизиту тип "ПХВТакойТо", и проверить тот же реквизит на тип программно, то выдаст Описание типов, со всеми прописанными в Плане Характеристик типами, когда все что мне нужно, это знание, что вот этот реквизит имеет тип ПХВ, а в идеале и название Плана видов характеристик. Повторюсь, заранее я не знаю мой реквизит имеет просто ссылочный тип, составной тип или ПХВ, поэтому для правильного формирования запроса это мне и нужно узнать. С радостью привел бы код, но он уж совсем не информативен для поставленного вопроса.

Пытался так:
Метаданные.Документы.ДокТакойТО.ТабличныеЧасти.НазваниеТЧ.Реквизиты.НужныйРеквизитДляПРоверки.Тип

Возвращает Описание типов, а мне нужно получить "План видов характеристик такой - то".
1 Lexey_
 
30.07.18
17:54
(0) Метаданные.Документы.ДокТакойТО.ТабличныеЧасти.НазваниеТЧ.Реквизиты.НужныйРеквизитДляПРоверки.Тип.Типы()
2 PaulMuller
 
30.07.18
17:56
Зачем мне типы? Мне нужен именно тот контейнер ПХВ в котором эти типы прописаны.
3 PaulMuller
 
30.07.18
17:57
Грубо говоря увидеть объект метаданных ПХВТакойТо, а не типы которые он содержит.
4 hhhh
 
30.07.18
18:04
(3) ну там и будет тип пхв.
5 hhhh
 
30.07.18
18:06
(3) или ты думаешь, что метаданные на ходу расшифровываются, ты у реквизита задал тип пвх, а у тебя вдруг возникли 70 типов неизвестно откуда? Там точно будет один тип, без вариантов.
6 ДНН
 
30.07.18
18:13
(0) Метаданные.ПланыВидовХарактеристик.Содержит(Метаданные.Документы.ДокТакойТО.ТабличныеЧасти.НазваниеТЧ.Реквизиты.НужныйРеквизитДляПРоверки)
7 PaulMuller
 
30.07.18
19:50
(1) Не то, выдает список типов прописанных в указанном ПХВ, а мне нужно само ПХВ, в котором эти типы прописаны.

(4) Тип "План видов характеристик" ? Сомневаюсь (+ проверил, правильно сомневался) Там типы, которые данный ПХВ сохержит, а не сам ПХВ.

(5) Нет, не думаю. Там 1 уже выбранный тип, но мне нужен не он, а ПХВ в котором он прописан

(6) Хорошая идея, но нет. Если у меня в документе реквизит назван как "Реквизит1", с типом "ПХВТакойТо", то в Метанные.ПланыВидовХарактеристик у меня набор типов, и нет атрибутов никаких. "Реквизит1" оно не найдет у меня ни при каких условиях, и будет выдавать false.
8 PaulMuller
 
30.07.18
19:52
ПХВ - я имею ввиду ПВХ, очепятка
9 youalex
 
30.07.18
20:36
У ОписанияТипов - есть метод Типы()
У Метаданных - есть Метаданные.НайтиПоТипу()
Еще есть Метаданные.ПланыВидовХарактеристик.Содержит()

как вариант
10 Cyberhawk
 
30.07.18
20:41
Метод "Метаданные" от значения реквизита даст тебе объект МД = ПВХ
11 PaulMuller
 
31.07.18
12:39
(10) Блин, возможно это и работает, пытался применить, но в моем случае, значение реквизита у меня на данном этапе нету, я его честно говоря и пытаюсь вытянуть этим запросом, который формирую. Неужели нет возможности узнать тип реквизита "ПВХ" через метаданные?
12 Вафель
 
31.07.18
12:40
(11) нельзя.
Но без этого можно и обойтись
13 Cyberhawk
 
31.07.18
12:41
"узнать тип реквизита "ПВХ" через метаданные?" // Покажи на картинке, что это за реквизит (где он в метаданных)
14 Вафель
 
31.07.18
12:42
(13) посмотри регистр "ДопСвойства" измерение "Значение"
15 PaulMuller
 
31.07.18
12:46
(13) https://drive.google.com/file/d/1PTMPdZVItTh5zCgP3Dw7a5EA3_m1qOb5/view?usp=sharing

Ну вот, это то что я хочу получить
16 Cyberhawk
 
31.07.18
13:15
Все равно не ясно, что автор хочет получить. То ли то, что в дереве метаданных, то ли тип конкретного значения в реквизите объекта БД?
17 Lexey_
 
31.07.18
13:27
(15) так это не ПВХ, а Характеристика
18 PaulMuller
 
31.07.18
13:48
(16) Тип конкретного значения меня на данном этапе не интересует. Только коллекция в которой этот тип находится. (17) А характеристику можно узнать через метаданные? Возможно я действительно по незнанию не правильно назвал то что я хочу получить.
19 Мыш
 
31.07.18
13:56
(18) Свойство ПВХ.

ОбъектМетаданных: ПланВидовХарактеристик (MetadataObject: ChartOfCharacteristicTypes)
Характеристики (Characteristics)

Использование:
Только чтение.

Описание:
Тип: ОписанияХарактеристик.

Содержит описания характеристик плана видов характеристик.
20 youalex
 
31.07.18
13:59
(18) ну, типа ты можешь сравнить типы в твоем реквизите с типами из (19)
21 RomanYS
 
31.07.18
14:02
Попробую "расшифровать" проблему ТС.
В конфигураторе у реквизита стоит тип, например, Характеристика.ВидыСубконтоХозрасчетные, но когда вы этот тип проверяете через метаданные, то возвращается составной тип состоящих из типов доступных для ПВХ.
ТС не знает как это обойти.
22 youalex
 
31.07.18
14:05
сравнить два описания типа, из Метаданные.Док.ТЧ.Рек.Тип
И Метаданные.ПланВидовХарактеристик.ПВХ.Тип

больше, вроде никак, то что можно  выбрать   в свойстве реквизита "Характеристика." - это не тип, а описание типов, аналог (предтеча) определяемых типов
23 PaulMuller
 
31.07.18
14:07
(21) <3
24 Вафель
 
31.07.18
14:09
Это ты так субконто чтоли проверяешь?
Задай через массив имена реквизитов
25 RomanYS
 
31.07.18
14:09
(22) похоже, что так. При этом совпадении типов никак не гарантирует, что в конфигураторе выбран "тип" характеристика.... Возможно просто выбран (вручную) совпадающий составной тип.
26 PaulMuller
 
31.07.18
14:14
(25) Согласен, в теории это может произойти и создаст кучу проблем.

Может есть костыли на примете? Например трай кетчем (попытка/исключение), или еще как-то... Я пока попробую реализовать что-то подобное, отпишу потом в тему.
27 тарам пам пам
 
31.07.18
14:25
(26) ты бы лучше написал, на кой черт тебе знать, что в реквизите именно характеристика, а не просто составной тип. Все запросы ведь должны совпадать в любом случае.
28 PaulMuller
 
31.07.18
14:34
(27) Формируя запрос, в отбор мне нужно подставлять мой реквизит, и сравнивать его с нужным мне значением. Но заранее я реквизит не знаю. И если этот реквизит имеет тип ПВХ, то мне нужно сравнивать через .Value, иначе без.

Вот, пример кода, даже вся функция, если разберетесь. Спрашивайте что не понятно, постараюсь разъяснить.

<code>
&AtServer
Function SelectRequiredAttributeInListOfPossiblePlacements(RelatedObjectsList)
    
    _UnionAll = "
        |
        |UNION ALL
        |
        |";
        
    ConfigurationObjectRepresentation ="";    
    ConfigurationObjectNameRepresentation ="";
    ConfigurationObjectAttributeRepresentation ="";
    ConfigurationObjectTabularSectionRepresentation ="";
    ConfigurationObjectRequiredAttributeRepresentation ="";    
    ConfigurationObjectTabularSectionAttributeRepresentation ="";
    
    //--------------------------------------------------------query forming start --------------------------------------------------------\\
    
    RefsVT = new ValueTable;
    RefsVT.Columns.Add("ReferenceToDocOrCatalog", new TypeDescription("String"));
    For Each Row in ItemsToChange do
        if not Row.Check then continue; endif;
        
        Query = New Query;
        Query.Text = "";
        
        For Each Relation in RelatedObjectsList do
            
            if NOT Metadata.Documents[Relation.ObjectName] = undefined then
                MetadataConfigurationObject = "Document";
            elsIf NOT Metadata.Catalogs[Relation.ObjectName] = undefined then
                MetadataConfigurationObject = "Catalog";
            endIf;
            
            IsCharacteristic = ?( IsCharacteristic_(MetadataConfigurationObject, Relation.ObjectName, Relation.TabularSectionAttributeMetaObj, Relation.AttributeMetaObj) ,".Value","");
            
            ConfigurationObjectRepresentation ="";    
            ConfigurationObjectNameRepresentation ="";
            ConfigurationObjectAttributeRepresentation ="";
            ConfigurationObjectTabularSectionRepresentation ="";
            ConfigurationObjectRequiredAttributeRepresentation ="";    
            //ConfigurationObjectTabularSectionAttributeRepresentation ="";
            ConfigurationObjectRequiredTabularSectionAttributeRepresentation ="";
            
            ConfigurationObjectRepresentation                                    = MetadataConfigurationObject;    
            ConfigurationObjectNameRepresentation                                = Relation.ObjectName;
            ConfigurationObjectAttributeRepresentation                            = Relation.AttributeMetaObj;
            ConfigurationObjectTabularSectionRepresentation                        = Relation.TabularSectionAttributeMetaObj;
            ConfigurationObjectRequiredAttributeRepresentation                    = Row.Reference;//REF ON OLD VALUE    
            //ConfigurationObjectTabularSectionAttributeRepresentation            = Relation.TabularSectionAttributeMetaObj;
            ConfigurationObjectRequiredTabularSectionAttributeRepresentation    = Row.Reference;//REF ON OLD VALUE
            
            Template =
            "SELECT
            |    "+ConfigurationObjectNameRepresentation+".Ref
            |FROM
            |    "+ConfigurationObjectRepresentation+"."+ConfigurationObjectNameRepresentation+" AS "+ConfigurationObjectNameRepresentation+"
            |WHERE
            |    "+
            ?(not ValueIsFilled(ConfigurationObjectTabularSectionRepresentation),
            //if true
            ConfigurationObjectNameRepresentation+"."+ConfigurationObjectAttributeRepresentation+IsCharacteristic+" = &ConfigurationObjectRequiredAttributeRepresentation",
            //if false
            ConfigurationObjectNameRepresentation+"."+ConfigurationObjectTabularSectionRepresentation+"."+ConfigurationObjectAttributeRepresentation+IsCharacteristic+" = &ConfigurationObjectRequiredAttributeRepresentation")
            +"";
                                              
            Query.Text = Query.Text + ?(ValueIsFilled(Query.Text),
            //If true
            _UnionAll + Template
            ,//if false
            Template
            );
        endDo;
        
        
        Query.Parameters.Insert("ConfigurationObjectRequiredAttributeRepresentation",Row.Reference);
        SelectionDetailRecords =Query.Execute().Select();
    
        While SelectionDetailRecords.Next() Do
            row = RefsVT.Add();
            row.ReferenceToDocOrCatalog = SelectionDetailRecords.Ref;
        EndDo;
    endDo;
    
    return RefsVT;
endFunction

</code>
29 PaulMuller
 
31.07.18
14:40
Суть задачи свел к

IsCharacteristic = ?( IsCharacteristic_(MetadataConfigurationObject, Relation.ObjectName, Relation.TabularSectionAttributeMetaObj, Relation.AttributeMetaObj) ,".Value","");
30 DomovoiAtakue
 
31.07.18
14:58
Это база в Польше?
31 тарам пам пам
 
31.07.18
14:59
(28) Что-то ты не то пытаешься сделать. В параметре RelatedObjectsList что передается? Понятно что коллекция, что в элементах этой коллекции? Ты случаем не пытаешься руками платформенный механизм характеристик повторить?
32 PaulMuller
 
31.07.18
14:59
(30) нееееисключено!
33 PaulMuller
 
31.07.18
15:05
(31) Мне нужно создать обработку массового заполнения реквизитов, по типу стандартных, но со своими фишками, и от части мне нужно получать ссылки на все документы и справочники в которых присутствует изменяемый реквизит (похожее реализовано в стандартной обработке Удаление помеченных на удаление).

в RelatedObjectsList коллекция "адресов" возможного размещения нужного мне значения в строковом представлении, например:

строка Документ
строка ДокументТакойТо
строка ТЧДокумента (может отсутствовать)
строка НазваниеАтрибута

и так енное кол-во строк
34 PaulMuller
 
31.07.18
15:06
Имеется ввиду одна строка содержит строковые колонки описанные выше.
35 тарам пам пам
 
31.07.18
15:20
Так куда ты там собрался .Value добавлять? Для поиска ссылок тебе просто нужно, чтобы в твоем RelatedObjectsList присутствовала строка с нужным адресом. Например, для ERP и справочника Номенклатура: Relation.ObjectName = "Номенклатура", Relation.TabularSectionAttributeMetaObj = "ДополнительныеСвойства", Relation.AttributeMetaObj = "Значение".  И запрос ничем не будет отличаться от поиска по обычному реквизиту в таб. части.
36 PaulMuller
 
31.07.18
15:33
(35) оу, спасибо, буду вкуривать.