Имя: Пароль:
1C
1С v8
Как передать в реквизит объекта значение дополнительного реквизита из результата запроса?
0 dimul_05
 
06.07.18
17:35
Добрый день!
Пытаюсь заполнить поля и табличные части справочника данными, которые уже есть в справочнике "Номенклатура". В заполняемом справочнике, помимо схожих реквизитов, добавлен реквизит "ЗаполнитьНаОсновании", являющийся ссылкой на справочник "Номенклатура". Так же добавлена команда "Заполнить", для которой и пишу функцию, выполняемую на сервере. Возникла проблема с получением значений, которые хранятся в таблице "ДополнительныеРеквизиты" справочника "Номенклатура". Просто не знаю как их вытянуть. Цикл нужен? Подскажите пожалуйста, или ссылкой в меня киньте, так как нагуглить не смог. Может быть я не правильно пытаюсь получить данные и это надо делать отдельным запросом?
(Управление торговлей для Украины 3.0)
http://prntscr.com/k3ccs8
1 almar
 
06.07.18
17:40
Можно, конечно, и циклом, но запросом лучше
2 polosov
 
06.07.18
17:56
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель,
        |    Номенклатура.ВидНоменклатуры,
        |    Номенклатура.Качество
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    НоменклатураДополнительныеРеквизиты.Свойство,
        |    НоменклатураДополнительныеРеквизиты.Значение
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        |ГДЕ
        |    НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура";
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
    РезультатЗапроса = Запрос.ВыполнитьПакет();
    
    ТЗОсновныеРеквизиты = РезультатЗапроса[0].Выгрузить();
    ТЗДопРеквизиты = РезультатЗапроса[0].Выгрузить();

    
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    ЗаполнитьЗначенияСвойств(ТЗОсновныеРеквизиты[0]);
    
    Для Каждого СтрокаТЗ ИЗ ТЗДопРеквизиты Цикл
        НоваяСтрока = НовыйЭлемент.ДополнительныеРеквизиты.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЗ);
    КонецЦикла;
    
    НовыйЭлемент.Записать();
3 polosov
 
06.07.18
17:56
ТЗДопРеквизиты = РезультатЗапроса[1].Выгрузить();
4 polosov
 
06.07.18
17:58
Реквизиты от балды брал, так что пробовать работоспособность примера не нужно. Делай на его основе.
5 dimul_05
 
06.07.18
17:59
Спасибо!
Такое не пробовал. Попробую - отпишусь.
6 dimul_05
 
07.07.18
23:51
Попробовал.

Для Каждого СтрокаТЗ ИЗ ТЗДопРеквизиты Цикл
        НоваяСтрока = НовыйЭлемент.ДополнительныеРеквизиты.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЗ);
    КонецЦикла;

Приведенный кусок кода, как я понимаю, должен в какой-то таблице заполняемого справочника создать строки, аналогичные строкам ТЗ.

Дело в том, что в обоих справочниках, дополнительные реквизиты являются строками (не табличной части).

Попробовал получать значения по индексу, но столкнулся с тем, что у разных позиций номенклатуры может быть заполнено разное количество реквизитов, а значит по одному и тому же индексу получаю разные реквизиты. Да и если какие-то реквизиты не заполнены, то запрашиваемый реквизит может быть за границами массива. Вот так:

    Объект.ЗаголовокТовара = ТЗДопРеквизиты[3].Значение;
    Объект.ОписаниеТовара = ТЗДопРеквизиты[4].Значение;
    Объект.ПоисковыеСинонимы = ТЗДопРеквизиты[5].Значение;

Нельзя ли вытянуть из ТЗ значение строки с определенным свойством? Сказать что-то вида: Объект.ЗаголовокТовара = Значение строки ТЗДопРеквизиты у которой Свойство "seo_title_russian"?
Закон Брукера: Даже маленькая практика стоит большой теории.