Имя: Пароль:
 
1C
1C 7.7
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 Базис
 
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) > ветку не читал?

Я то читал. А ты похоже либо - нет, либо что-то не так понял.