Добрый день!

Нужно в документ реализации подставить цены из регистра.
Если по номенклатуре одна цена - тогда подставить ее, а если несколько тогда не подставлять, а иметь возможность по кнопке выбирать из нескольких значений. Просто на складе ведется учет номенклатуры по разным ценам. Кто сталкивался с такой проблемой?
Картинку и базу прилагаю.

```1c
    &НаКлиенте
    Процедура ПроставитьЦеныНоменклатуре(Команда)

    ПроставитьЦеныНоменклатуреНаСервере();

    КонецПроцедуры

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

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

    КонецПроцедуры
```
---
qqwweerrttyy160679,
ну как то так...

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

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

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

    &НаКлиенте
    Процедура ТоварыЦенаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ТекСтр = Объект.Товары.Получить(Элементы.Товары.ТекущаяСтрока);
    ТекСтр.Цена = ВыбранноеЗначение.Значение;
    КонецПроцедуры
```

Ну и конечно добавить реквизит табличной части объекта "СписокЦен" типа список значений. т.е. Объект.Товары.СписокЦен
плюс обработчики событий на форме выбрать
---
qqwweerrttyy160679, по-моему вы пытаетесь переизобрести партионный учет
---
qqwweerrttyy160679,
ну как то так...

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

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

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

    &НаКлиенте
    Процедура ТоварыЦенаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ТекСтр = Объект.Товары.Получить(Элементы.Товары.ТекущаяСтрока);
    ТекСтр.Цена = ВыбранноеЗначение.Значение;
    КонецПроцедуры
```

Ну и конечно добавить реквизит табличной части объекта "СписокЦен" типа список значений. т.е. Объект.Товары.СписокЦен
плюс обработчики событий на форме выбрать
---
ЧерныйКот,
Я извиняюсь, немного не так надо.
Не нужно добавлять никаких полей дополнительных. Немного надо упростить.
Нужно просто в табличной части товары номенклатуре проставить цену если в запросе она у этой номенклатуры одна, а если для этой номенклатуры цен несколько тогда просто ничего не заполнять.
Я потом сама допишу,если ячейка цена пустая, то при нажатии будет вылетать форма где будут указаны список этой номенклатуры с ценами и количеством.
---
qqwweerrttyy160679,
```1c
    &НаКлиенте
    Процедура ПроставитьЦеныНоменклатуре(Команда)

    ПроставитьЦеныНоменклатуреНаСервере();

    КонецПроцедуры

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

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

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

    КонецПроцедуры

    &НаКлиенте
    Процедура ТоварыЦенаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    Если ТипЗнч(ВыбранноеЗначение) <> Тип("Число") Тогда
    СтандартнаяОбработка = Ложь;
    ТекСтр = Объект.Товары.Получить(Элементы.Товары.ТекущаяСтрока);
    ТекСтр.Цена = ВыбранноеЗначение.Значение;
    КонецЕсли;
    КонецПроцедуры

    &НаСервереБезКонтекста
    Функция ПолучитьЦены(ДатаСреза, Номенклатура)

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

    Запрос.УстановитьПараметр("МоментВремени", ДатаСреза);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Цена");
    КонецФункции
```

Реквизит табличной части "СписокЦен" можно удалить. в этом случае он не нужен
---
Добавить на форму новый реквизит табличной части "СписокЦен".
Реквизиту табличной части формы поставить "Режим выбора из списка" = Истина;
При событии начала выбора , если цена одна - проставлять ее, если цен много - тогда заполнять списоквыбора из списка цен.
надеюсь помидорами не закидают)))
---
Да, согласна, напоминает партионный учет, но учет самих партий не ведется. :)
---
???
---
Так что тогда мешает сделать так?
Вместо

```1c
    Если МассивЦен.Количество() = 1 Тогда
    Эл.Цена = МассивЦен.Получить(0).Цена;
    Эл.СписокЦен.Добавить(Эл.Цена);
    ИначеЕсли МассивЦен.Количество() > 1 Тогда
    Для Каждого ТекЦена из МассивЦен Цикл
    Эл.СписокЦен.Добавить(ТекЦена.Цена);
    КонецЦикла;
    КонецЕсли;
```

сделать

```1c
    Если МассивЦен.Количество() = 1 Тогда
    Эл.Цена = МассивЦен[0].Цена;
    Иначе
    Эл.Цена = 0;
    КонецЕсли;
```