Заполнение таб части из регистра

1. Дожа 20.08.14 23:16 Сейчас в теме
Добрый день.
Подскажите пожалуйста.
Нужно подставить цену из регистра сведений "цены номенклатуры" во все строки табличного документа.
Сам смог написать только следующее:

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

&НаСервере
Функция ПолучитьЦены(номенклатура, ВидЦен)

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

Возврат Данные;

КонецЦикла;

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

Данный код заполняет только текушую строку. Что нужно сделать, что бы заполнить сразу все строки?
Заранее спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Prikum 3 20.08.14 23:48 Сейчас в теме
(1) aobikmametov, ну наверное передать в процедуру массив строк из Номенклатуры и получить цены для каждой номенклатуры, а потом уже обработать полученный результат
3. AlexInqMetal 77 21.08.14 00:27 Сейчас в теме
(1) aobikmametov, вот это
Функция ПолучитьЦены
конечно зря - в любой конфе есть уже готовые функции получения цены, лишняя работа. Если нужно просто обработать всю табличную часть то написать что то вроде:

Для Каждого Стр из Товары Цикл
Стр.Цена = ПолучитьЦену(Стр.Номенклатура,ВидЦен);
.....
4. odin777 21.08.14 10:04 Сейчас в теме
(1) aobikmametov, может процедура на сервере с использование методов ЗначениеФормыВРеквизит и обратного преобразования, получить запросом данные для заполнения ТЧ(в запросе получить все поля и объединить с условием по номенклатуре и виду цены из таблицы регистра хранения цены) и загрузить в ТЧ результат запроса.
5. hairman 21.08.14 14:29 Сейчас в теме
&НаКлиенте 
Процедура ВидЦеныПриИзменении(Элемент) 
	ЗаполнитьЦеныНаСервере();
КонецПроцедуры 

&НаСервере
Процедура ЗаполнитьЦеныНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТЗ.Номенклатура,
		|	ТЗ.Количество,
		|   ...
		|ПОМЕСТИТЬ ТЧ
		|ИЗ
		|	&ТЗ КАК ТЗ
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	ТЧ.Номенклатура,
		|	ТЧ.Количество,
		|	...,
		|	ЦеныНоменклатурыПоставщиковСрезПоследних.Цена
		|ИЗ
		|	ТЧ КАК ТЧ
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыПоставщиковСрезПоследних
		|		ПО ТЧ.Номенклатура = ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура";
	
	Запрос.УстановитьПараметр("ТЗ", Объект.Товары.Выгрузить());
	Запрос.УстановитьПараметр("ВидЦены", Объект.ВидЦены);
	
	Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
	
КонецПроцедуры
Показать
6. odin777 21.08.14 15:01 Сейчас в теме
(5) hairman, а как же
использование методов ЗначениеФормыВРеквизит и обратного преобразования
а так в принципе то что я имел ввиду ) может вместо параметра ТЗ передавать Ссылку на документ будет правильнее, т.к. ТЧ получаем в запросе а нам необходимо знать какого документа ТЧ.
7. hairman 21.08.14 16:56 Сейчас в теме
(6) odin777, РеквизитФормыВЗначение? В данном случае можно не использовать.
Запрос к данным документа по Ссылке возможен только после записи. Поэтому в моем примере используется выгрузка табличной части.
8. Дожа 21.08.14 17:43 Сейчас в теме
Спасибо. Получилось.
Если кому интересно, реализовал вот так:

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

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

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

&НаСервере
Функция ПолучитьЦены(номенклатура, ВидЦен)

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

Возврат Данные;

КонецЦикла;

КонецФункции
9. hairman 21.08.14 18:45 Сейчас в теме
(8) aobikmametov, запрос в цикле - не очень хорошее решение. Точнее очень плохое.
Вызов сервера (причем с контекстом) на каждую строку ТЧ + запрос к регистру...
Хорошо если у в документе всего несколько строк. А если несколько тысяч? А несколько десятков или сотен тысяч?

зы
А чем обусловлено использование структуры для возврата значения?
10. Дожа 21.08.14 21:31 Сейчас в теме
hairman
Я только учусь писать код. Еще мало что знаю. Нашёл в интернете такой вид кода для получения данных из базы. Пока что пользуюсь им. Как только научусь делать что то большее, буду думать об оптимизации.
11. WalterMort 242 21.08.14 22:08 Сейчас в теме
(10) Главное, страничку себе эту сохрани, чтобы посмотреть через пару лет насколько лютый песец ты напилил.
12. WalterMort 242 21.08.14 22:11 Сейчас в теме
А по теме алгоритм следующий

1. Сразу вызываем процедуру на сервере
2. В ней выгружаем табличную часть в ТЗ
3. ТЗ пихаем в запрос, левым соединением ставим цены
4. Грузим обратно в ТЧ
5. ?
6. Profit!
13. Дожа 21.08.14 22:16 Сейчас в теме
WalterMort
Я уже представляю, на сколько мой код не верен))) Особенно как я понимаю все функции должны быть в общем модуле, а не в каждом документе кучи одинаковых функций)))
Ну чтож, со временем всему научусь. В данные момент пока что учусь что как можно написать.
14. Дожа 21.08.14 23:32 Сейчас в теме
WalterMort
А можно продемонстрировать как выглядит этот код?
Понимать я понимаю что нужно сделать, а вот написать сам пока не могу это...
15. hairman 22.08.14 18:42 Сейчас в теме
(14) aobikmametov,
А можно продемонстрировать как выглядит этот код?

Сообщение под номером (5).
16. allgorhythm 26.08.14 13:54 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот