Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Проверить значение на План Видов Характеристик

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

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

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

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

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

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

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

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

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

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

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

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

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

Может есть костыли на примете? Например трай кетчем (попытка/исключение), или еще как-то... Я пока попробую реализовать что-то подобное, отпишу потом в тему.
   тарам пам пам
 
27 - 31.07.18 - 14:25
(26) ты бы лучше написал, на кой черт тебе знать, что в реквизите именно характеристика, а не просто составной тип. Все запросы ведь должны совпадать в любом случае.
   PaulMuller
 
28 - 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>
   PaulMuller
 
29 - 31.07.18 - 14:40
Суть задачи свел к 

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует