Имя: Пароль:
1C
 
как интерактивно пересчитать цены номенклатуры в ТЧ при изменении типа цен?
0 pro3ri
 
07.05.15
08:52
ДОбрый день!
есть док http://savepic.ru/6954961.png
хочу сделать чтобы пересчитывались цены интерактивно при изменении типа цен. Пока сделал, чтобы пересчитывалась 1 строка:

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

клиентОм
Функция ПодстановкаЦены(ТекущиеДанные, ТипЦен, Дата) Экспорт

    ТекущиеДанные.Цена = РаботаСДокументами.ПодстановкаЦеныСервер(ТекущиеДанные.Номенклатура, ТипЦен, Дата);            

КонецФункции

сервер ом
Функция ПодстановкаЦеныСервер(Номенклатура, ТипЦен, Дата) Экспорт

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

КонецФункции

а как сделать чтобы все и сразу? (с минимальн изм конфиг)
1 Oleg_ka
 
07.05.15
08:56
Передавай не Элементы.Товары.ТекущиеДанные, а Элемент.Товары.
2 Oleg_ka
 
07.05.15
08:57
... и обрабатывай его дальше в функциях.
3 pro3ri
 
07.05.15
12:52
(1) наверное имел ввиду Объект.Товары?

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


так работает, изменил только код формы.
4 pro3ri
 
07.05.15
12:53
но не оч оптимально тк запрос в цикле
5 Ненавижу 1С
 
гуру
07.05.15
12:54
(3) ну так сделай не в цикле
6 pro3ri
 
07.05.15
14:10
&НаКлиенте
Процедура ВидПрайсаНоменклатурыПриИзменении(Элемент)
    

    Объект.Товары = ВидПрайсаНоменклатурыПриИзмененииСервер(Объект.Товары);
    
    
КонецПроцедуры

&НаСервере
Функция ВидПрайсаНоменклатурыПриИзмененииСервер(ТЧ)

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

КонецФункции // ВидПрайсаНоменклатурыПриИзменении()


сервер ом:
Функция ПодстановкаЦенПриИзмТипаЦен(ТЗ, ТипЦен, Дата) Экспорт

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

    Возврат РезультатЗапроса;
    
    //ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    //
    //Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    //    // Вставить обработку выборки ВыборкаДетальныеЗаписи
    //КонецЦикла;
    //
    

КонецФункции // ПодстановкаЦенПриИзмТипаЦен()


пишет ошибка {Документ.ПоступлениеТоваров.Форма.ФормаДокумента.Форма(34)}: Ошибка при установке значения атрибута контекста (Товары)
    Объект.Товары = ВидПрайсаНоменклатурыПриИзмененииСервер(Объект.Товары);
по причине:
Нельзя изменять поле, содержащее объект данных формы
Программист всегда исправляет последнюю ошибку.