Имя: Пароль:
1C
1С v8
УПП 1,3 свойства номенклатуры. Как программно получить?
0 Gray776
 
16.03.16
10:37
В общем у номенклатуры имеются несколько свойств. Для внешней печатной формы документа нужно получить некоторые из них, для номенклатуры из таблицы документа.
Может есть штатная функция какая для этого? Я просто поискал не нашел, наверно не там или не так искал...
1 mistеr
 
16.03.16
10:41
(0) Нету. Точнее функции есть, но привязаны к форме редактирования свойств.
2 Gray776
 
16.03.16
10:43
(1) тоесть поискать в формах функцию? а как называется?
3 Одинесю
 
16.03.16
10:56
Функция ПолучитьСвойстваОбъекта(Ссылка = Неопределено)

    // данные из свойств документа
    СтруктураПараметров = Новый Структура;
    СтруктураСвойств = Новый Структура;
    ЗаполнитьСписокСвойств(СтруктураСвойств, СтруктураПараметров);

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

КонецФункции // ПолучитьСвойстваОбъекта()
Вот такая функция у меня в обработке.
4 Gray776
 
16.03.16
11:12
(3) Поковырялся я уже в справочнике номенклатура. Нашел функцию она в обработках... жесть конечно сколько наворочено. Как то все изподвыподверта всё...
Просто не хотел запрос в цикле пускать: печатная форма жеж  и в каждой строке штук по пять свойств надо вытащить из номенклатуры...
Но вот
   Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапросаПоСвойствамОбъекта(СтруктураСвойств);
самое интересное место будет ли оно работать в УПП?
5 Gray776
 
16.03.16
11:14
(4) +  тоесть сам текст запроса глянуть бы я вот о чем... ото выдаст ошибку не поймет где текст этот брать...
6 Strogg
 
16.03.16
11:14
(0) все доп. свойства хранятся в РС ЗначенияСвойствОбъектов. Их тока запросом получать, где Объект = номенклатура, свойство = выбСвойство.
7 Gray776
 
16.03.16
11:15
(6) та в курсе я что запросом буду попробую штатной обработкой.
8 Gray776
 
16.03.16
11:17
(6) + я даже уже несколько вариантов этих запросов напридумывал... но чтот мне не нравятся такие решения вот и заговорил о штатных методах... нравятся мне они или нет лучше их пользовать... ото и так уже затянул я с этими свойствами...
9 Одинесю
 
16.03.16
15:05
(5) Функция ТекстЗапросаПоСвойствамОбъекта(СтруктураСвойств) Экспорт
    
    ТипОбъекта = "";
    Если Метаданные.Справочники.Содержит(СсылкаНаОбъект.Метаданные()) Тогда
        ТипОбъекта = "Справочник";
    ИначеЕсли Метаданные.Документы.Содержит(СсылкаНаОбъект.Метаданные()) Тогда
        ТипОбъекта = "Документ";
    КонецЕсли;
    
    ТекстЗапросаПоля = "";
    ТекстЗапросаСоединения = "";
    ТекстЗапросаПакеты = "";
    Для каждого Свойство Из СтруктураСвойств Цикл
        ТекстЗапросаПакеты = ТекстЗапросаПакеты+
        "
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ЗначенияСвойствОбъектов.Объект,
        |    ЗначенияСвойствОбъектов.Значение КАК Значение
        |ПОМЕСТИТЬ Свойство"+Свойство.Ключ+"
        |ИЗ
        |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        |ГДЕ
        |    ЗначенияСвойствОбъектов.Объект = &ТекущийОбъект
        |    И ЗначенияСвойствОбъектов.Свойство.Наименование = """+Свойство.Ключ+"""
        |;";
        
        Если ТипЗнч(Свойство.Значение) = Тип("Булево") Тогда
            ЗначениеПоУмолчанию = ?(Свойство.Значение, "ИСТИНА", "ЛОЖЬ");
        ИначеЕсли  ТипЗнч(Свойство.Значение) = Тип("Число") Тогда
            ЗначениеПоУмолчанию = Строка(Свойство.Значение);
        ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
            Если Найти(Свойство.Значение, "&") Тогда // это параметр
                ЗначениеПоУмолчанию = Свойство.Значение;
            Иначе
                ЗначениеПоУмолчанию = """"+Свойство.Значение+"""";
            КонецЕсли;
        Иначе
            ЗначениеПоУмолчанию = """"+Строка(Свойство.Значение)+"""";
        КонецЕсли;
        
        ТекстЗапросаПоля = ТекстЗапросаПоля+",
        |    ЕСТЬNULL(Свойство"+Свойство.Ключ+".Значение, "+ЗначениеПоУмолчанию+") КАК "+Свойство.Ключ;
        
        ТекстЗапросаСоединения = ТекстЗапросаСоединения+"
        |        ЛЕВОЕ СОЕДИНЕНИЕ Свойство"+Свойство.Ключ+" КАК Свойство"+Свойство.Ключ+"
        |        ПО ДанныеОбъекта.Ссылка = Свойство"+Свойство.Ключ+".Объект";
    КонецЦикла;
    
    ТекстЗапросаЦиклом = ТекстЗапросаПакеты+"
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ДанныеОбъекта.Ссылка" + ТекстЗапросаПоля +
    "
    |//ВременнаяТаблица//
    |ИЗ
    |    "+ТипОбъекта+"."+СсылкаНаОбъект.Метаданные().Имя+" КАК ДанныеОбъекта" + ТекстЗапросаСоединения +
    "
    |ГДЕ
    |    ДанныеОбъекта.Ссылка = &ТекущийОбъект";
    
    Возврат ТекстЗапросаЦиклом;

КонецФункции // ТекстЗапросаПоСвойствам()
10 Gray776
 
16.03.16
15:42
(9) Я так понимаю если всё это прикрутить и запустить то можно будет к свойству через точку обращаться? Ну типа: номенклатура.Свойство.Значение
Основная теорема систематики: Новые системы плодят новые проблемы.