Имя: Пароль:
1C
1С v8
ПредопределенноеЗначение vs Перечисление.Значение
0 Humandra
 
04.04.12
10:19
Подскажите, кто-то сравнивал ПредопределенноеЗначение("Перечисление.Значение") с просто Перечисление.Значение?

С учетом того, что Перечисление - это просто таблица в базе данных, обращаться к его значениям явно надо с осторожностью.

В описании метода ПредопределенноеЗначение сказано, что полученное значение кэшируется.
Т.е. по идее не должно быть обращений к базе данных?
А при Перечисление.Значение? Не кешируется? Или тоже кэшируется?
1 butterbean
 
04.04.12
10:20
сколько тысяч вызовов планируется??
2 Maxus43
 
04.04.12
10:21
а = Перечисление.ВидАдреса.Фактический;
а = Перечисление.ВидАдреса.Фактический;
а = Перечисление.ВидАдреса.Фактический;
3 Buster007
 
04.04.12
10:22
вообще-то это сделалось для того, чтобы не писать свои собственные процедуры, которые получают значения перечисления, справочников и т.д. на клиенте.
4 Maxus43
 
04.04.12
10:22
(2) + замер включи, следующие вызовы после первого - будут быстрей, кэшируется видимо
5 Buster007
 
04.04.12
10:22
(3) вернее, не писать серверные функции для получения значений, которые нужны нам на клиенте)
6 Humandra
 
04.04.12
10:24
(1) В теории - до фига может быть. Это перечисление типа Ставки НДС.
7 mirosh
 
04.04.12
10:27
(0)
"С учетом того, что Перечисление - это просто таблица в базе данных, обращаться к его значениям явно надо с осторожностью. "

Ужас, целая таблица в базе данных).
8 mirosh
 
04.04.12
10:28
+(7) результаты из запросов тоже кешируются, если что.
9 vmv
 
04.04.12
10:30
+(3) ага и Вообще-то в контесте 8.2 и УФ метод ПредопределенноеЗначение("Перечисление.Значение") вызванный из клиентского метода делает обращение к серверу, т.е. "портит" клиентский метод, дергая сервак.

Когда мне в модуле формы необходимо получать, не вызывая сервер, какие-то ссылочные значения(перечисления, группы справочника и т.д.), то я поступаю так
1. в метод ПриСозданииНаСервере() вставляю служебный серверный метод модуля формы СерверИнициализацияТаблицыСсылочныхТипов()
2. На форме создаю реквизит типа ТаблицаЗначений с двумя колонками "Ключ" и "Значение"
3. В теле СерверИнициализацияТаблицыСсылочныхТипов() произвожу инициализацию всех необходимых мне в модуле форме ссылочных типов
4. Пишу еще один метод КлиентПолучитьСсылкуПоКлючу()

После этого я могу
1. получать в чистом клиентском методе ссылочные типы не дерагая сервер
2. в любой момент В ОДНОМ МЕСТЕ могу расширить необходимые мне значения ссылок

Кто поступает по другому - тот тупой и жадный 1С-к)
10 Humandra
 
04.04.12
10:32
(7) Вот пока 1С-ники будут иронизировать над тем, что, к примеру, неявно в цикле будет на каждое обращение запрос к БД лезть, 1С и будет работать только на 10 пользователей.
С обычными запросами, даже повторно выполняемыми с теми же параметрами, запрос на сервер все равно уходит. Ну, конечно кэш самой СУБД немного поможет тут, но не более.
С перечислениями пока непонятно.

(9) Меня интересует не с точки зрения обращения клиента к серверу, а с точки зрения обращения сервера приложений к серверу СУБД.
11 Humandra
 
04.04.12
10:34
Ладно, пошла бороть лень и писать тестовый пример, раз никто до меня не интересовался :)
О результатах сообщу :)
12 vmv
 
04.04.12
10:37
(11) метод ПредопределенноеЗначение(...) производит обращение к СУБД, посему должен быть использован только тогда когда это обращение нужно всего раз.

во всех остальных случаях на клиенте должна сущность, которая хранит необходимые для клиента ссыылки и клинет может их получить без обращения к СУБД.
13 vmv
 
04.04.12
10:40
довесок

значения перечесления невозможно модифицировать штатными средства платформы с уровня приложения, посему страх автора "Перечисление.Значение ...обращаться к его значениям явно надо с осторожностью" скорее вызван молодой луной и магнитной бурей
14 MikleV
 
04.04.12
10:41
(9)ты балбес.
вызов - один раз.
15 MikleV
 
04.04.12
10:41
читайте rtfm
16 vmv
 
04.04.12
10:46
(14) и варвда один, ну все-таки один, а так при создании на сервере все в одном флаконе затулил в таблицу формы и не паришься.

тем более что писать конструкции ПредпорпделенноеЗначение("Спрвачник.МаиТаври.ГруппаМае") муторно и нудно

мне приятнее писать ПолучитьСсылкуПоКлючу("ГруппаМае") и плевать на периименование объектов или реквизитов, все что нужно поправить - все в одном месте, а не расбросано черти где
17 Humandra
 
04.04.12
11:01
(12) Вы не поняли.
С осторожностью - не потому что не доверяю полученному результату. А потому что от запроса к СУБД, выполняемого на каждую итерацию из нескольких тысяч и десятков тысяч, если не миллионов, явно серверу СУБД не получшеет. И я хотела убедиться, что этих миллионов запросов - нет.

Теперь докладываю. Действительно, 1С кэширует запросы к перечислениям.

Сделала такую тестовую процедуру:
&НаСервере
Процедура Тест()

   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    КлассификаторБанковРФ.Код
       |ИЗ
       |    Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ";

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       Если Число(ВыборкаДетальныеЗаписи.Код)%2 = 0 Тогда
           Переменная = Перечисления.СтавкиНДС.НДС10;
       Иначе
           Переменная = Перечисления.СтавкиНДС.НДС18;
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

После первого обращения к перечислению, даже при повторном вызове метода, обращение идет только к таблице Справочника. Перечисление не перезачитывается, и это прекрасно.
18 Humandra
 
04.04.12
11:12
Меня просто смутило, почему в типовых часто пишут ПредопределенноеЗначение("Перечисление.Значение")
...
в общем модуле.

Похоже, что прав (3), и это только для того, чтобы использовать этот метод и на сервере, и на клиенте.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой