|
Получить реквизит элемента справочника по ссылке | ☑ | ||
---|---|---|---|---|
0
neetro
28.05.14
✎
18:09
|
Тестовая конфигурация с нуля. Справочник "Номенклатура" содержит реквизит Цена (Число 15,2). Есть документ "Ввод остатков". В табличной части все банально, Номенклатура, Цена, Количество, Сумма. Пытаюсь в табличную часть документа подставить цену из реквизита Цена, не могу добраться до нее. В модуле формы документа использую событие ОбработкаВыбора(). Вот код
&НаКлиенте Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные; ТекущиеДанныеТовары.Цена = ВыбранноеЗначение.Цена; КонецПроцедуры ВыбранноеЗначение.Цена = недопустимый реквизит, хотя ВыбранноеЗначение Тип СправочникСсылк.Номенклатура и значение есть в "Вычислить выражение" |
|||
1
х86
28.05.14
✎
18:15
|
получай цену на сервере
|
|||
2
Жан Пердежон
28.05.14
✎
18:21
|
чтобы получить цену надо слазить в базу, а базы на клиенте нет
|
|||
3
Господин ПЖ
28.05.14
✎
18:22
|
клиент про реквизиты реквизитов не в курсе...
|
|||
4
neetro
28.05.14
✎
18:23
|
(2) не дает создать обработчик на сервере (только без контекста)
Сделал так &НаКлиенте Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные; ТекущиеДанныеТовары.Цена = ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение); КонецПроцедуры &НаСервереБезКонтекста Функция ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение) Возврат ВыбранноеЗначение.Цена; КонецФункции Заработало )) Спасибо! |
|||
5
neetro
28.05.14
✎
18:23
|
(3),(4) я уловил уже. Спасибо!
|
|||
6
neetro
28.05.14
✎
18:24
|
Или есть способ оптимальнее\красивее? В одну процедуру\функцию?
|
|||
7
Господин ПЖ
28.05.14
✎
18:27
|
>ВыбранноеЗначение.Цена;
весь объект то читать зачем? |
|||
8
neetro
28.05.14
✎
18:29
|
(7) Какой? Цена? Цена это реквизит числовой
|
|||
9
Господин ПЖ
28.05.14
✎
18:30
|
(8) и ради одной цифры ты еретично читаешь весь объект...
|
|||
10
neetro
28.05.14
✎
18:32
|
(9) а как мне еще цифру получить как не через ссылку на объект?
|
|||
11
Господин ПЖ
28.05.14
✎
18:33
|
богоподобным запросом
|
|||
12
Господин ПЖ
28.05.14
✎
18:33
|
тфу, богоугодным
|
|||
13
neetro
28.05.14
✎
18:34
|
Запрос для того чтобы прочитать одну цифру оптимальнее?! О_о
|
|||
14
kosts
28.05.14
✎
18:37
|
(13) Как думаешь, что делает система, когда просишь её получить цену в ВыбранноеЗначение.Цена?
|
|||
15
Ndochp
28.05.14
✎
18:38
|
(12) А вот правда, чем лучше. Запрос (внутри) создастся и так и так, отбор будет одинаковый, на равенство ссылке.
На клиент уйдет все равно только одна цифра. Дельта получается на объем передачи лишних реквизитов между СУБД и сервером. Там должны быть такие копейки, что меньше ошибки измерения. |
|||
16
fisher
28.05.14
✎
18:38
|
(13) В общем случае - да. При обращении через точку идет тот же самый запрос, только на все поля объекта, а не на одно. Зато выполняется кэширование объекта. При повторном обращении через точку к этому же объекту запроса уже не будет.
|
|||
17
neetro
28.05.14
✎
18:38
|
(14) наверное не В а ИЗ ВыбранноеЗначение.Цена
Хочешь сказать запрос и делает? Только по всему объекту? |
|||
18
Господин ПЖ
28.05.14
✎
18:39
|
>Как думаешь, что делает система
она убьет очередного котенка |
|||
19
AAlexandra
28.05.14
✎
18:40
|
(0) Посмотри, как в типовых обрабатывается изменение цены/количества/товара в ТЧ документа. Со всякими кэшированиями, чтобы по каждому чиху в базу не лазить, как в (4).
|
|||
20
neetro
28.05.14
✎
18:40
|
(16) ок, я примерно понял
|
|||
21
fisher
28.05.14
✎
18:40
|
(15) Далеко не всегда копейки. Объект может быть "тяжелым" - с большими табличными частями и хранилищами значений. А тянуться он будет весь, хотя нужен только один реквизит.
|
|||
22
Господин ПЖ
28.05.14
✎
18:41
|
>При повторном обращении через точку к этому же объекту запроса уже не будет
скуль тоже данные кэшировать умеет |
|||
23
neetro
28.05.14
✎
18:42
|
(19) нету типовой у меня.... Тем более подозреваю там цены вообще по нормальному - регистр сведений
|
|||
24
neetro
28.05.14
✎
18:43
|
Попробую переделать на запрос. Спасибо всем за направление вектора моих мыслей в правильную сторону ))
|
|||
25
Ndochp
28.05.14
✎
18:43
|
(16) О, точно. Правильно запросом, потому, что кэширование жрет ресурсов. Главное ведь проверял же недавно. (правда в толстом клиенте, и получение всего объекта. Идет в 5-10 раз быстрее, чем чтение одного поля через точку)
|
|||
26
neetro
28.05.14
✎
18:46
|
(25) так получается же кеширование жрет ресурсы а кешируется после Запроса?
|
|||
27
Ndochp
28.05.14
✎
18:49
|
(26) результат запроса в кеш не складывается, просто кладется в память. А получение реквизита ссылки через точку приводит к помещению данных объекта в хитросделанный кеш.
|
|||
28
neetro
28.05.14
✎
18:51
|
Ок
|
|||
29
AAlexandra
28.05.14
✎
18:52
|
(23) ну.. типовую найти при желании - не проблема, было бы это желание.
А вопрос в подходе. В типовой данные из ТЧ кэшируются в переменную, при изменении, например, количества, кратность упаковки берется не из объекта через точку, а из таблицы кэшированных значений. И только если там нет - лезем на сервер. Ну а так - дело ваше, конечно.. |
|||
30
fisher
28.05.14
✎
18:55
|
Ну, непосредственно по сабжевому моменту (выбор новой номенклатуры из списка), механизм кэширования значений в типовых ничем не поможет. И к этому механизму, если честно, у меня серьезные претензии. Какого хрена весь клиентский кэш постоянно гоняется на сервер??
|
|||
31
fisher
28.05.14
✎
18:56
|
По сабжу можно хитрее извратиться, через альтернативную форму выбора. Цену получать еще в динамическом списке формы, и возвращать её в документ при выборе вместе с номенклатурой.
|
|||
32
neetro
28.05.14
✎
18:59
|
Переделал
&НаКлиенте Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) ТекущиеДанныеТовары = Элементы.Товары.ТекущиеДанные; ТекущиеДанныеТовары.Цена = ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение); КонецПроцедуры &НаСервереБезКонтекста Функция ТоварыНоменклатураОбработкаВыбораНаСервере(ВыбранноеЗначение) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Цена |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", ВыбранноеЗначение); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Возврат ВыборкаДетальныеЗаписи.Цена; КонецФункции Так? |
|||
33
neetro
28.05.14
✎
18:59
|
(31) я не очень силен в 8ке. Вот разбираюсь
|
|||
34
neetro
28.05.14
✎
19:00
|
(29) понял. Спасибо!
|
|||
35
neetro
28.05.14
✎
19:04
|
(29) в типовую я полезу когда буду делать "по правильному" с нормальными ценами (в регистре) и тп. Сейчас простой вопрос, зачем городить огород. Два ответа и все стало понятно.
|
|||
36
neetro
28.05.14
✎
19:04
|
Запрос то правильно сделал? (работает, но мало ли)
|
|||
37
neetro
28.05.14
✎
19:18
|
(31) понял идею, интересно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |