|
v7: Оптимизация получения значения из справочника | ☑ | ||
---|---|---|---|---|
0
zenon46
27.09.18
✎
10:49
|
Доброго дня!
Конфа комплексная 7.7 (сильно доработанная), есть справочник не типовой, "ДатыЗапретаРедактирования" в нем хранятся ВСЕ пользователи которые когда либо регистрировались через конфигуратор, есть в нем некоторые реквизиты которые частенько используются во время работы пользователя в программе, например "Скидка" у каждого она своя, вопрос как оптимально получать этот параметр, сейчас при работе в документах где это нужно, применяется вот такая конструкция, получается каждый раз она гоняется когда в алгоритме нужно получить значение этого параметра (думаю может прогнать ее один раз при старте системе и запихнуть в переменную, ведь значение этой переменной для каждого пользователя будет разная = значения параметра) : СпрДат = СоздатьОбъект("Справочник.УправлениеДатамиРедактирования"); СпрДат.ВыбратьЭлементы(); Пока СпрДат.ПолучитьЭлемент() = 1 Цикл Если СпрДат.ТекущийЭлемент().Наимен.Наименование = ИмяПользователя() Тогда // встали на выборке МаксСкидка = СпрДат.МаксСкидка; МинНаценка = СпрДат.МинНаценка; КонецЕсли; КонецЦикла; |
|||
1
HawkEye
27.09.18
✎
10:53
|
(0) а что, СП религия запрещает почитать, если ты не знаешь какие методы есть у справочников?
пихаешь в реквизит - СпрДат.ТекущийЭлемент().Наимен.Наименование, а лучше элемент справочника Пользователи.. затем делаешь НайтиПоРеквизиту()... |
|||
2
Cool_Profi
27.09.18
✎
10:56
|
ЗАпрос нарисовать проблема огромная?
|
|||
3
zenon46
27.09.18
✎
10:58
|
(1) да не удачный пример, сейчас используется НайтиПоРеквизиту()
|
|||
4
zenon46
27.09.18
✎
10:59
|
(2) думаю найтипореквизиту() отработает быстрей чем запрос
|
|||
5
zenon46
27.09.18
✎
11:00
|
Вопрос в том, оставить как есть или же получить, необходимые значения при старте системы в глобальные переменные ?
|
|||
6
uno-group
27.09.18
✎
11:09
|
(5) Если юзер не выйдет из системы, а с завтрашнего числа будет действовать другая скидка. Убытки ты будешь компенсировать?
|
|||
7
zenon46
27.09.18
✎
11:11
|
(6) априори такого быть не может, на ночь всех выкидывает из базы.
|
|||
8
vova1122
27.09.18
✎
11:20
|
(7) всеравно при старте не проканает. Пользователь с утра зашел в базу. А после этого поменяли скидку. Если ты запишешь в в глобальную переменную при старте, то для пользователя будет всеравно старая скидка.
Я делал подобную задачу. В справочнике "пользователи" сделал реквизит "СразуНаПринтер" (при нажатии на "Печать" печаталось без предварительного просмотра) И каждый пользователь сам для себя выбирает как ему удобно. Так вот. Я тоже пишу в глобальную переменную. И если сам пользователь для себя поменяет то все работает без перезагрузки. Если Админ поменяет пользователю, то пользователю нужно перезайти. |
|||
9
zenon46
27.09.18
✎
11:23
|
(8) это понятно, в компании только один человек меняет размер скидки для пользователя, можно просто решить этот вопрос выдав предупреждение что пользователю нужно перезайти в систему.
|
|||
10
zenon46
27.09.18
✎
11:23
|
(8) я просто пытаюсь понять выогдно переносить в глобальную переменную, или гонять каждый раз эту конструкцию, сотни раз в день для каждого пользователя.
|
|||
11
vova1122
27.09.18
✎
11:34
|
(9) Зависит от многих факторов.
1. Размер самого СпрДат (сколько по времени займет пройтись по этому справочнику) 2. Количество пользователей (Если много запаришься всем говорить чтоб перешли, и проконтролировать это). |
|||
12
vova1122
27.09.18
✎
11:38
|
+(8) Так как способ печати у меня меняется редко. то я одному поменял и забыл что ему нужно перезайти. И некоторое время пришлось колдовать почему не идет СразуНаПринтер...
|
|||
13
Злопчинский
27.09.18
✎
11:52
|
СпрДат.ТекущийЭлемент().Наимен....
- ТекущийЭлемент() здесь зачем? что не устроило в конструкции СпрДат.Наимен.... ? |
|||
14
zenon46
27.09.18
✎
11:54
|
(13) это делалось лет 15 назад) тогда я только разбирался в 1С, сейчас просто кинулся делать один отчет, снова понадобилось получать значения переменных из этого справочника и решил сразу везде переделать.
|
|||
15
Builder
27.09.18
✎
11:55
|
Альтернативный вариант
1. получать при старте 2. сделать обработку ожидания в глобальнике и обновлять значение раз в час например. |
|||
16
Базис
naïve
27.09.18
✎
12:00
|
4 ошибки, кто больше?
|
|||
17
vova1122
27.09.18
✎
12:05
|
(15) значит при худшем варианте целый час будет действовать неверная скидка. За тот час можно продать на 100500 тугриков товара с неправильной скидкой
|
|||
18
Builder
27.09.18
✎
12:11
|
(17) Значит настроить время обновления в зависимости от требований, изложенных в техническом задании :)
|
|||
19
Peltik
27.09.18
✎
12:34
|
можно еще флаг изменения какой-нибудь прилепить, что бы каждый раз не пересчитывать
|
|||
20
unregistered
27.09.18
✎
12:57
|
(0) Оставить как есть - получать данные из справочника.
Только *авнокод оптимизировать. Что есть реквизит Нимен справочника УправлениеДатамиРедактирования? Предположу, что это ссылка на справочник Пользователи (реальной структуры комплексной 7.7 я не помню). Если так, то найдите сначала это элемент, а потом ищите нужный в справочнике УправлениеДатамиРедактирования. Как то так: СпрПользователи = СоздатьОбъект("Справочник.Пользователи"); Если СпрПользователи.НайтиПоНаименованию(ИмяПользователя()) = 1 Тогда СпрДат = СоздатьОбъект("Справочник.УправлениеДатамиРедактирования"); Если СпрДат.НайтиПоРеквизиту("Наимен", СпрПользователи.ТекущийЭлменет()) = 1 Тогда МаксСкидка = СпрДат.МаксСкидка; МинНаценка = СпрДат.МинНаценка; Иначе // что-то делаем КонецЕсли; Иначе // что-то делаем КонецЕсли; PS Синтаксис 7.7 могу переврать, но думаю суть понятна. |
|||
21
uno-group
27.09.18
✎
13:04
|
При старте засунуть в переменную СпрДат.ТекущийЭлемент(), размеры скидок считать каждый раз. Хотя если 10 лет работало и никто не жаловался на быстродействие то смысл что то менять.
|
|||
22
vova1122
27.09.18
✎
13:31
|
(21) если бы все было так просто. При старте КакаяТоПеременная=СпрДат.ТекущийЭлемент() И когда позже админ поменяэт этому пользователю в СпрДат скидку, то из "КакаяТоПеременная" всеравно будет вытягиватся старое значение
|
|||
23
unregistered
27.09.18
✎
13:40
|
+ к (20) А вот кстати значение элемента справочника Пользователи соответствующего текущему пользователю, можно запихнуть и в переменную при старте системы. Уж это значение точно меняться не будет тогда код из (20) упроститься.
|
|||
24
vova1122
27.09.18
✎
13:42
|
(23) ветку не читал?
|
|||
25
Kigo_Kigo
27.09.18
✎
14:01
|
(22) Сфигали, мы запминаем не знаечение параметра, а справочник, а вот при обращении
КакаяТоПеременная.МаксСкидка будет считываться значение параметра из справочника, по этому в глобальную переменню при запуске засовываем КакаяТоПеременная = СпрДат.ТекущийЭлемент() |
|||
26
vova1122
27.09.18
✎
14:09
|
(25) я знаю о чем говорю. Так как у меня была похожая ситуация см (8). Если не веришь, то сам проверь. Запиши в глобальную переменную ТекущегоПользователя. Потом запусти 1С под двумя пользователями. Под одним поменяй какое-то значения в СправочникеПользователи (для другого пользователя) А потом под другим пользователем проверь это начение.
|
|||
27
vova1122
27.09.18
✎
14:17
|
+(26) именно попробуй получить его из глобальной КакаяТоПеременная
|
|||
28
uno-group
27.09.18
✎
14:25
|
(27) Если сделаешь Спр.ИспользоватьДату()то переменная будет хранить все реквизиты на момент отрытия. А конструкция
Переменная.МинСкидка.Получить(ДатаДок) будет считывать всегда свежие значения. Можешь за проверяться. |
|||
29
vova1122
27.09.18
✎
14:37
|
(28) точно.... Для переодических реквизитов работает. а для обычных нет. Никогда бы не подумал о таком
|
|||
30
ADirks
27.09.18
✎
15:00
|
(26) это называется кэширование
чтобы победить кэш можно писать КакаяТоПеременная.ТекущийЭлемент().Скидка; но может и не помочь иной раз |
|||
31
vova1122
27.09.18
✎
15:21
|
(30) это называется нужно искать элемент и вызывать значение его реквизита каждый раз когда нужно, а не ПриСтартеСистемы. Из чего следует что мы возвращаемся к изначальной проблеме в (0)
|
|||
32
vova1122
27.09.18
✎
15:28
|
+(31) а нет. Всетаки заработало как надо. Значит автору можно посоветовать переписать сохранять в глобальную переменную и вызывать как описано в (30)
|
|||
33
vova1122
27.09.18
✎
15:31
|
+(32) Последовательно вызвал после изменения другим пользователем
Сообщить(глПользователь.СразуНаПринтер); Сообщить(глПользователь.ТекущийЭлемент().СразуНаПринтер); Первое выдало "0" Второе "1" (правильное должно было быть "1") |
|||
34
zenon46
27.09.18
✎
16:01
|
(33) да уже все намутил, изменение скидки на лету все равно делать никто не будет.
|
|||
35
vova1122
27.09.18
✎
16:24
|
(34) а вдруг....? И как сделали?
|
|||
36
zenon46
27.09.18
✎
16:28
|
(35) не точно нет) этой системе уже более 10 лет.
сделал просто при начале работы систему, записываю в глобальные переменные нужные параметры, в модулях где раньше использовался вызов справочника и поиск, просто вставил эту глобальную переменную. ведь под каждым пользователем эта переменная принимает значений то что задано для него в справочнике. |
|||
37
vova1122
27.09.18
✎
16:50
|
теперь главное чтобы новую скидку устанавливали до того как пользователи начнут входить в базу. Ведь до этого у вас работало по другому - скидка вычислялась на реальное время. А сейчас будет на момент когда пользователь зашел в базу.
|
|||
38
zenon46
28.09.18
✎
09:02
|
(37) скидка величина абсолютная, далее она просто в формулах участвовала, я скажу более, ее не меняли уже лет 7)
|
|||
39
unregistered
28.09.18
✎
12:00
|
(24) > ветку не читал?
Я то читал. А ты похоже либо - нет, либо что-то не так понял. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |