Имя: Пароль:
1C
1С v8
УПП.Заполнение реквизита ТЧ результатом запроса.
0 d_monah
 
15.05.13
11:01
Здравствуйте! Помогите плиз.Есть документ "Передача товаров" с табличной частью "Товары",нужно заполнить реквизит "Цена" результатом запроса регистра "Цены номенклатуры".
Сделал внешнюю обработку заполнения ТЧ,прицепил к ней процедуру(код ниже),проверил запрос в консоли,все ок, только цена все равно не заполняется, что не так?Спасиб!
Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПоле = Неопределено) Экспорт
   
       
   Для каждого СтрокаТЧ Из Объект.Товары Цикл
       Запрос = Новый Запрос;
       Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);


      Запрос.Текст =  "ВЫБРАТЬ
                      |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
                      |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
                      |ИЗ
                      |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                      |ГДЕ
                      |    ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура"   ;
                               
       Выборка = Запрос.Выполнить().Выбрать();
         
                           
       СтрокаТЧ.Цена = Выборка.Цена;
       СтрокаТЧ.Сумма=СтрокаТЧ.Количество*СтрокаТЧ.Цена;
       
   КонецЦикла;    
       
КонецПроцедуры
1 BlueSky
 
15.05.13
11:05
(0) ЗапросВЦикле = Расстрел;
2 NcSteel
 
15.05.13
11:06
Судя по тексту  - нормально.

Но алгоритм надо переписать, так как (1)
3 Maxus43
 
15.05.13
11:08
Выборка = Запрос.Выполнить().Выбрать();
         
       Если Выборка.Следующий() Тогда                  
       СтрокаТЧ.Цена = Выборка.Цена;
КонецЕсли;
4 palpetrovich
 
15.05.13
11:14
если возможна читуация, что док не записан, делай так примерно

   ТЗТовары =  Объект[ИмяТабличнойЧасти].Выгрузить();
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ТЗТовары.Номенклатура КАК Номенклатура,
   //|    Остальные нужные поля
   |    ПОМЕСТИТЬ ВТТовары
   |ИЗ
   |    &ТЗТовары КАК ТЗТовары
   |;
   |ВЫБРАТЬ  
   |    ВТ.Номенклатура,
   //|    Остальные нужные поля
   |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
   |ИЗ ВТТовары КАК ВТТовары
   |ЛЕВОЕ СОЕДИНЕНИЕ
   |РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
   |ПО
   |  ВТТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
   |";
   Запрос.УстановитьПараметр("ТЗТовары", ТЗТовары);
   Результат = Запрос.Выполнить();    
   ТЗТовары = Результат.Выгрузить();
   Объект[ИмяТабличнойЧасти].Очистить();
   Объект[ИмяТабличнойЧасти].Загрузить(ТЗТовары);

зы: ну и параметры для СрезаПоследних наверное неплохо-бы дать
5 palpetrovich
 
15.05.13
11:16
*
ВТ.Номенклатура = ВТТовары.Номенклатура,
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ОбъектДата, ) КАК ЦеныНоменклатурыСрезПоследних
6 d_monah
 
15.05.13
11:21
Всем спасиб,особенно Maxsus43!

Совсем забыл про: Если Выборка.Следующий() Тогда  ..

Остальное доточим.
7 palpetrovich
 
15.05.13
11:33
(6) пипец, как раз Maxsus43 оказывает тебе медвежью услугу, ибо - читай (1)
8 d_monah
 
15.05.13
11:42
(7) Я все понял,тупил по поводу того, почему простейшая процедура не дает результат.Сказывается длительное отсутствие программирования.
9 palpetrovich
 
15.05.13
11:45
(8) "Я все понял..." везет :)
10 d_monah
 
15.05.13
11:50
(9) А что непонятного? Конечно не оптимально делать отдельный запрос для каждой строки ,в приличном обществе за это канделябром бьют.Правильно?
11 palpetrovich
 
15.05.13
11:52
(10) правильно
ты хоть для прикола (4) попробуй. с учетом (5)
12 d_monah
 
15.05.13
12:00
(11) Попробую,без прикола.
13 palpetrovich
 
15.05.13
12:46
(12) не выдержал, попробовал сам, работает

Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт;
   ТЗТовары =  Объект[ИмяТабличнойЧасти].Выгрузить();
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ТЗТовары.Номенклатура КАК Номенклатура,
   |    ТЗТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
   |    ТЗТовары.Количество КАК Количество,
   |    ТЗТовары.Коэффициент КАК Коэффициент
   |ПОМЕСТИТЬ ВТТовары
   |ИЗ
   |    &ТЗТовары КАК ТЗТовары
   |;
   |ВЫБРАТЬ
   |    ВТТовары.Номенклатура,
   |    ВТТовары.ЕдиницаИзмерения,
   |    ВТТовары.Количество,
   |    ВТТовары.Коэффициент,
   |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
   |ИЗ
   |    ВТТовары КАК ВТТовары
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,  ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
   |        ПО ВТТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
   Запрос.УстановитьПараметр("ТЗТовары", ТЗТовары);
   Запрос.УстановитьПараметр("ТипЦен", Объект.ТипЦен);
   Запрос.УстановитьПараметр("Дата", Объект.Дата);
   Результат = Запрос.Выполнить();    
   ТЗТовары = Результат.Выгрузить();
   ТЗТовары.ВыбратьСтроку();
   Объект[ИмяТабличнойЧасти].Очистить();
   Объект[ИмяТабличнойЧасти].Загрузить(ТЗТовары);
КонецПроцедуры  

Правда еще неплохо-бы посчитать суммы :)

И еще - непонятно зачем все это, ведь в типовых конфигурациях заполнение реквизита цена и так реализовано. Если цены установлены конечно и тип цены выбран
14 palpetrovich
 
15.05.13
12:47
* ТЗТовары.ВыбратьСтроку(); - убрать :)