```1c
    ТЧДок = Ссылка.ПолучитьОбъект();
    Для Каждого Стр из ТЧДок.Товары Цикл
    Если стр.Цена = 0 Тогда
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура);
    Запрос.УстановитьПараметр("ХарактеристикиНоменклатуры", Стр.ХарактеристикаНоменклатуры);

    Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000270"));

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

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    ВалютаТекущая = Выборка.Валюта;

    Стр.Цена = Выборка.Цена;
    Стр.Сумма = Стр.Количество *Выборка.Цена;
    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

    ТЧДок.Записать();
```

добрый день, ребята подскажите плж. Есть тип цен Розничный там проставлены все цены на все номенклатуры. И есть типы цен для каждого клиента но на определенный товар. Я добавил на форму кнопку по нажатию которой цены заполняются на тот товар который с нулевой ценой. Все получилось но приходится закрывать документ и открывать заного а можно програмно обновить табличную часть? Конфигурация КА 1.1 Платформа 8.2
---
Ну и тогда решение - переписать первую строчку на
ТЧДок = ЭтотОбъект;

И на всяк убрать строку записи документа в конце. А вместо этого написать
Модифицированность = Истина; // не совсем уверен, но вроде так
---
Запрос в цикле? Мэсье знает толк в извращениях!
---
Обновить открытую форму не предлагать? Хотя надо смотреть, что там наваял, потому как и так должно обновляться.
---
Неа, как раз и не должно обновляться. Мэсье еще тот...;) Он сбоку получил объект по ссылке и в него занес данные. НЕ в сам открытый объект.
---
Да согласен, проще было сразу использовать ТЧ Товары.
---
Ну и тогда решение - переписать первую строчку на
ТЧДок = ЭтотОбъект;

И на всяк убрать строку записи документа в конце. А вместо этого написать
Модифицированность = Истина; // не совсем уверен, но вроде так
---
спасибо большое
---
Мда..Такие запросы делать нельзя. Надо как то так:

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

НУ и в том же духе. Добавить еще один регистр в соединение, нужные условия и так далее.
---
Ребята не судите строго опыта мало.
---
Щас попробую по вашему совету сделать
---
Как надо было лучше? в отдельную функцию запрос вытащить?
---
Ну надо было сделать через внешнюю обработку табличный частей вместо добавления кнопки на форму. Но там еще куча заморочек с РеквизитФормыВЗначение и так далее. А Запросы сразу старайтесь делать правильно. Смысл в том чтобы все данные вытащить одним запросом. А еще лучше если вся логика в запросе будет, а вам только останется

```1c
    Выборка=Запрос.Выполнить().Выгрузить();
    ТабличнаяЧасть.Загрузить(Выбора);
```

В запросе через параметр Ссылка = Ссылке на текущий документ вы получаете список Номенклатуры и помещаете его во временную таблицу, что избовляет вас от необходимости перебирать ее в цикле. А далее просто связываете этот список с двумя другими таблицами.

Основное программное время тратится даже не на выполнение запросов. А на само обращение к базе. Чем их меньше - тем быстрее.
---
Спасибо, но смотрите у меня из 10 позиций может только на 2 быть цена не установлена а загружу и заменю я все по вашему методу, или я не так понял?
---
Сделайте отбор в запросе в том месте где формируете временную таблицу со списком номенклатуры.

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

Во временной таблице будет только то что соответствует отбору и потом в СОЕДИНЕНИЕ пойдет только по той номенклатуре что попала в отбор.
И компактно и более быстро и более удобно к написанию и обработке результата.
---
Хорошо, попадет через отбор 2. Выгрузим в Таблицу значений их, и загрузим в ТЧ документа. а не затрутся остальные?