Имя: Пароль:
1C
1С v8
Получить реквизит элемента справочника по ссылке
, ,
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) понял идею, интересно.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший