Добрый день.
Подскажите пожалуйста.
Нужно подставить цену из регистра сведений "цены номенклатуры" во все строки табличного документа.
Сам смог написать только следующее:
&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)
ТекСтрока = Элементы.Товары.ТекущиеДанные;
ВидЦен = объект.ВидЦены;
Данные = ПолучитьЦены(ТекСтрока.Номенклатура, ВидЦен);
ТекСтрока.ЦеныНоменклатуры = Данные.ЦеныНоменклатуры;
обновитьотображениеданных();
КонецПроцедуры
&НаСервере
Функция ПолучитьЦены(номенклатура, ВидЦен)
Данные = Новый Структура;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена как ЦеныНоменклатуры,
| ЦеныНоменклатурыСрезПоследних.ВидЦены,
| ЦеныНоменклатурыСрезПоследних.Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
| ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
| И ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("ВидЦены", ВидЦен);
Запрос.УстановитьПараметр("Номенклатура", номенклатура);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Данные.Вставить("ЦеныНоменклатуры", ВыборкаДетальныеЗаписи.ЦеныНоменклатуры);
Возврат Данные;
КонецЦикла;
КонецФункции
Данный код заполняет только текушую строку. Что нужно сделать, что бы заполнить сразу все строки?
Заранее спасибо.
Подскажите пожалуйста.
Нужно подставить цену из регистра сведений "цены номенклатуры" во все строки табличного документа.
Сам смог написать только следующее:
&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)
ТекСтрока = Элементы.Товары.ТекущиеДанные;
ВидЦен = объект.ВидЦены;
Данные = ПолучитьЦены(ТекСтрока.Номенклатура, ВидЦен);
ТекСтрока.ЦеныНоменклатуры = Данные.ЦеныНоменклатуры;
обновитьотображениеданных();
КонецПроцедуры
&НаСервере
Функция ПолучитьЦены(номенклатура, ВидЦен)
Данные = Новый Структура;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена как ЦеныНоменклатуры,
| ЦеныНоменклатурыСрезПоследних.ВидЦены,
| ЦеныНоменклатурыСрезПоследних.Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
| ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
| И ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("ВидЦены", ВидЦен);
Запрос.УстановитьПараметр("Номенклатура", номенклатура);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Данные.Вставить("ЦеныНоменклатуры", ВыборкаДетальныеЗаписи.ЦеныНоменклатуры);
Возврат Данные;
КонецЦикла;
КонецФункции
Данный код заполняет только текушую строку. Что нужно сделать, что бы заполнить сразу все строки?
Заранее спасибо.
По теме из базы знаний
- Заполнение табличной части "Товары" документа "Резервирование товаров" остатками (УПП 1.3)
- Заполнение табличной части Товары документа Поступление товаров и услуг из MS Excel (УТ 10.3)
- Заполнение табличной части Инвентарь и хозяйственные принадлежности документа Списание материалов из эксплуатации (БП 2.0)
- Заполнение табличной части Материалы документа Требование-накладная сериями материалов (по методу FIFO) (УТ 10.3, КА 1.1, УПП 1.3)
- Заполнение табличной части "Этапы и графики оплат" в документах Реализация по соглашениям
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) aobikmametov, вот это конечно зря - в любой конфе есть уже готовые функции получения цены, лишняя работа. Если нужно просто обработать всю табличную часть то написать что то вроде:
Функция ПолучитьЦены
Для Каждого Стр из Товары Цикл
Стр.Цена = ПолучитьЦену(Стр.Номенклатура,ВидЦен);
.....
(1) aobikmametov, может процедура на сервере с использование методов ЗначениеФормыВРеквизит и обратного преобразования, получить запросом данные для заполнения ТЧ(в запросе получить все поля и объединить с условием по номенклатуре и виду цены из таблицы регистра хранения цены) и загрузить в ТЧ результат запроса.
&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)
ЗаполнитьЦеныНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьЦеныНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.Номенклатура,
| ТЗ.Количество,
| ...
|ПОМЕСТИТЬ ТЧ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТЧ.Номенклатура,
| ТЧ.Количество,
| ...,
| ЦеныНоменклатурыПоставщиковСрезПоследних.Цена
|ИЗ
| ТЧ КАК ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыПоставщиковСрезПоследних
| ПО ТЧ.Номенклатура = ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура";
Запрос.УстановитьПараметр("ТЗ", Объект.Товары.Выгрузить());
Запрос.УстановитьПараметр("ВидЦены", Объект.ВидЦены);
Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Показать
(5) hairman, а как же
использование методов ЗначениеФормыВРеквизит и обратного преобразования
а так в принципе то что я имел ввиду ) может вместо параметра ТЗ передавать Ссылку на документ будет правильнее, т.к. ТЧ получаем в запросе а нам необходимо знать какого документа ТЧ.
Спасибо. Получилось.
Если кому интересно, реализовал вот так:
&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)
ТекСтрока = Элементы.Товары.ТекущиеДанные;
ВидЦен = объект.ВидЦены;
Данные = ПолучитьЦены(ТекСтрока.Номенклатура, ВидЦен);
ТекСтрока.ЦеныНоменклатуры = Данные.ЦеныНоменклатуры;
обновитьотображениеданных();
для Каждого строкатч из Объект.Товары цикл
ооро = ПолучитьЦены(строкатч.Номенклатура, ВидЦен);
строкатч.ЦеныНоменклатуры = ооро.ценыноменклатуры
;;;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьЦены(номенклатура, ВидЦен)
Данные = Новый Структура;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена как ЦеныНоменклатуры,
| ЦеныНоменклатурыСрезПоследних.ВидЦены,
| ЦеныНоменклатурыСрезПоследних.Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
| ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
| И ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("ВидЦены", ВидЦен);
Запрос.УстановитьПараметр("Номенклатура", номенклатура);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Данные.Вставить("ЦеныНоменклатуры", ВыборкаДетальныеЗаписи.ЦеныНоменклатуры);
Возврат Данные;
КонецЦикла;
КонецФункции
Если кому интересно, реализовал вот так:
&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)
ТекСтрока = Элементы.Товары.ТекущиеДанные;
ВидЦен = объект.ВидЦены;
Данные = ПолучитьЦены(ТекСтрока.Номенклатура, ВидЦен);
ТекСтрока.ЦеныНоменклатуры = Данные.ЦеныНоменклатуры;
обновитьотображениеданных();
для Каждого строкатч из Объект.Товары цикл
ооро = ПолучитьЦены(строкатч.Номенклатура, ВидЦен);
строкатч.ЦеныНоменклатуры = ооро.ценыноменклатуры
;;;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьЦены(номенклатура, ВидЦен)
Данные = Новый Структура;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена как ЦеныНоменклатуры,
| ЦеныНоменклатурыСрезПоследних.ВидЦены,
| ЦеныНоменклатурыСрезПоследних.Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
| ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
| И ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("ВидЦены", ВидЦен);
Запрос.УстановитьПараметр("Номенклатура", номенклатура);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Данные.Вставить("ЦеныНоменклатуры", ВыборкаДетальныеЗаписи.ЦеныНоменклатуры);
Возврат Данные;
КонецЦикла;
КонецФункции
(8) aobikmametov, запрос в цикле - не очень хорошее решение. Точнее очень плохое.
Вызов сервера (причем с контекстом) на каждую строку ТЧ + запрос к регистру...
Хорошо если у в документе всего несколько строк. А если несколько тысяч? А несколько десятков или сотен тысяч?
зы
А чем обусловлено использование структуры для возврата значения?
Вызов сервера (причем с контекстом) на каждую строку ТЧ + запрос к регистру...
Хорошо если у в документе всего несколько строк. А если несколько тысяч? А несколько десятков или сотен тысяч?
зы
А чем обусловлено использование структуры для возврата значения?
WalterMort
Я уже представляю, на сколько мой код не верен))) Особенно как я понимаю все функции должны быть в общем модуле, а не в каждом документе кучи одинаковых функций)))
Ну чтож, со временем всему научусь. В данные момент пока что учусь что как можно написать.
Я уже представляю, на сколько мой код не верен))) Особенно как я понимаю все функции должны быть в общем модуле, а не в каждом документе кучи одинаковых функций)))
Ну чтож, со временем всему научусь. В данные момент пока что учусь что как можно написать.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот