Имя: Пароль:
1C
1С v8
Проблема с автоподстановкой значений в ТЧ Документа.
0 kep12377
 
12.11.21
21:18
Задача такова: При Изменении Реквизита "ВидЦены" в ТЧ Документа должна автоматически подставляться Цена из регистра. Проблема в том, что цена подставляется  только в 1 строке ТЧ, а остальные остаются неизменчивы. Help me, please)

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

&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)    
    ВидЦены = Объект.ВидЦены;
    ТД = Элементы.Товары.ТекущиеДанные;
    ТД.Цена = ВидЦеныПриИзмененииНаСервере(ТД.Номенклатура,ВидЦены);    
КонецПроцедуры
1 asady
 
12.11.21
21:49
(0) молодец!
Особенно порадовало
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Возврат ВыборкаДетальныеЗаписи.Цена;
            КонецЦикла;    

Как ты думаешь твой цикл обхода выборки сколько раз обернется?
2 asady
 
12.11.21
21:52
(0) запросом получи цены по всем товарам по выбранному типу цен
потом циклом беги выборке и ищи в таблице товаров строки с номенклатурой
и устанавливай в этих строках цену.
3 vicof
 
12.11.21
23:01
+(2) Только не по всем товарам, а по товарам в ТЧ
4 серый КТУЛХУ
 
13.11.21
00:00
по одной номенклатуре попросил - по одной и получил.
5 kep12377
 
13.11.21
19:33
Вроде бы получил цены по всем товарам по выбранному типу цен. Дальше не подъёмно. Объясните, пожалуйста


&НаСервере
Функция ВидЦеныПриИзмененииНаСервере(ВидЦены,Номенклатура)
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
            |ИЗ
            |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
            |
            |СГРУППИРОВАТЬ ПО
            |    ЦеныНоменклатурыСрезПоследних.Цена";
        
        Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.Закупочная);
            
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Возврат ВыборкаДетальныеЗаписи.Цена;
        КонецЦикла;    
КонецФункции

&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)    
    ВидЦены = Объект.ВидЦены;
    ТД = Элементы.Товары.ТекущиеДанные;
    ТД.Цена = ВидЦеныПриИзмененииНаСервере(ВидЦены,ТД.Номенклатура);    
КонецПроцедуры
6 серый КТУЛХУ
 
13.11.21
21:04
1) добавь в запрос реквизит Товар виртуальной таблицы регистра типа "ЦеныНоменклатурыСрезПоследних.Товар КАК Товар,"
2) собери товары в массив - и передай в запрос в параметр Товары для фильтре для виртуальной таблицы регистра, из которой выбраешь типа "ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены И Товар В (&Товары)) КАК ЦеныНоменклатурыСрезПоследних"
3) при выборке результатов по каждому(!) ВыборкаДетальныеЗаписи.Товар находи в ТЧ строку с таким товаром - и в этой строке(!!) устанавливай .Цена = ВыборкаДетальныеЗаписи.Цена
и эцсамое. изучи наконец любой язык программирования и что такое вообще "алгоритмы".
7 серый КТУЛХУ
 
13.11.21
23:42
п.2: "собери Товары табличной части в массив"
8 Droning1C
 
14.11.21
00:58
Почитай в синтакс-помощнике про Возврат. Твой код отрабатывает ровно так, как ты заказал) Ты должен вернуть не только первую строку из выборки, а всю коллекцию.
9 SuperMario
 
14.11.21
09:46
(1) а меня вот это все  совсем не радует.
Автору нужно идти учить мат. чась. А он , вместо этого, в каком-то решение подобный код пошел писать.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс