Здравствуйте! Помогите пжл решить такую задачу. Есть Обработка с табличной частью. В шапке Покупатель, Склад, Вид цены и валюта. В табличной части ОстаткиТоваров Номенклатура, Количество, Цена и Стоимость. Кнопка Заполнить, позволяющая заполнить табличную часть остатками товаров, кнопка Очистить, позволяющая очистить заполненную табличную часть. Можно сделать так, чтобы уже в заполненной табличной части при изменении пользователем Вида цены и/или Валюты менялось значение Цены и, соответственно, пересчитывалась Стоимость. Привожу код из модуля формы обработки:

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

    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
    Запрос.УстановитьПараметр("Валюта", Валюта);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Возврат ВыборкаДетальныеЗаписи;
    КонецФункции

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

    &НаКлиенте
    Процедура ОстаткиТоваровКоличествоЦенаПриИзменении(СтрокаОстаткиТоваров)
    СтрокаОстаткиТоваров = Элементы.ОстаткиТоваров.ТекущиеДанные;
    СтрокаОстаткиТоваров.Стоимость = СтрокаОстаткиТоваров.Количество*СтрокаОстаткиТоваров.Цена;
    КонецПроцедуры
```
---
Нет. Неправильно. Нужно существующую ТЧ выгрузить в ТЗ и в запросе соединяться с ней, заменяя колонку цены.
---
Сделал вот так, все работает. Не знаю насколько это оптимально, но другого решения пока нет. У кого есть комментарии, пишите пожалуйста. Вот код, добавил новые функцию и процедуру к имеющимся:

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

    Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Валюта", Валюта);

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

    &НаКлиенте
    Процедура ВалютаВидЦеныПриИзменении(Элемент)
    Для каждого СтрокаОстаткиТоваров Из Объект.ОстаткиТоваров Цикл
    СтрокаОстаткиТоваров.Цена = ПолучениеЦены (СтрокаОстаткиТоваров.Номенклатура, ВидЦены, Валюта);
    СтрокаОстаткиТоваров.Стоимость = СтрокаОстаткиТоваров.Количество*СтрокаОстаткиТоваров.Цена;
    КонецЦикла;
    КонецПроцедуры
```
---
2 балла на экзамене на специалиста: за запрос в цикле и за вызов сервер в цикле.
---
А как тогда лучше сделать, чтобы все работало также как и сейчас?
---
Перенести выполнение ВалютаВидЦеныПриИзменении на сервер.
 Я стараюсь писать запросы так, что бы заполнение ТЧ происходило таким кодом:

```1c
    Объект.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
```
---
Что-то я поплыл. Вот так переделал. А дальше что-то не знаю как

```1c
    &НаСервере
    Процедура ВалютаПриИзмененииНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК ЦенаПолучаемая
    |ИЗ
    | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    | ,
    | ВидЦены = &ВидЦены
    | И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
    | ПО (ИСТИНА)";

    Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
    Запрос.УстановитьПараметр("Номенклатура", Элементы.ОстаткиТоваров.ТекущаяСтрока);
    Запрос.УстановитьПараметр("Валюта", Валюта);

    РезультатЗапроса = Запрос.Выполнить();
    Объект.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
    КонецПроцедуры

    &НаКлиенте
    Процедура ВалютаПриИзменении(Элемент)
    ВалютаПриИзмененииНаСервере();
    КонецПроцедуры
```
---
Нет. Неправильно. Нужно существующую ТЧ выгрузить в ТЗ и в запросе соединяться с ней, заменяя колонку цены.