Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Оптимизация получения значения из справочника

v7: Оптимизация получения значения из справочника
Я
   zenon46
 
27.09.18 - 10:49
Доброго дня!
Конфа комплексная 7.7 (сильно доработанная), есть справочник не типовой, "ДатыЗапретаРедактирования" в нем хранятся ВСЕ пользователи которые когда либо регистрировались через конфигуратор, есть в нем некоторые реквизиты которые частенько используются во время работы пользователя в программе, например "Скидка" у каждого она своя, вопрос как оптимально получать этот параметр, сейчас при работе в документах где это нужно, применяется вот такая конструкция, получается каждый раз она гоняется когда в алгоритме нужно получить значение этого параметра (думаю может прогнать ее один раз при старте системе и запихнуть в переменную, ведь значение этой переменной для каждого пользователя будет разная = значения параметра) :
    СпрДат = СоздатьОбъект("Справочник.УправлениеДатамиРедактирования");
    СпрДат.ВыбратьЭлементы();
    Пока СпрДат.ПолучитьЭлемент() = 1 Цикл
        Если СпрДат.ТекущийЭлемент().Наимен.Наименование = ИмяПользователя() Тогда
            // встали на выборке

            МаксСкидка = СпрДат.МаксСкидка;
            МинНаценка = СпрДат.МинНаценка;
        КонецЕсли;
    КонецЦикла;
 
 
   HawkEye
 
1 - 27.09.18 - 10:53
(0) а что, СП религия запрещает почитать, если ты не знаешь  какие методы есть у справочников?

пихаешь в реквизит - СпрДат.ТекущийЭлемент().Наимен.Наименование, а лучше элемент справочника Пользователи..
затем делаешь НайтиПоРеквизиту()...
   Cool_Profi
 
2 - 27.09.18 - 10:56
ЗАпрос нарисовать проблема огромная?
   zenon46
 
3 - 27.09.18 - 10:58
(1) да не удачный пример, сейчас используется НайтиПоРеквизиту()
   zenon46
 
4 - 27.09.18 - 10:59
(2) думаю найтипореквизиту() отработает быстрей чем запрос
   zenon46
 
5 - 27.09.18 - 11:00
Вопрос в том, оставить как есть или же получить, необходимые значения при старте системы в глобальные переменные ?
   uno-group
 
6 - 27.09.18 - 11:09
(5) Если юзер не выйдет из системы, а с завтрашнего числа будет действовать другая скидка. Убытки ты будешь компенсировать?
   zenon46
 
7 - 27.09.18 - 11:11
(6) априори такого быть не может, на ночь всех выкидывает из базы.
   vova1122
 
8 - 27.09.18 - 11:20
(7) всеравно при старте не проканает. Пользователь с утра зашел в базу. А после этого поменяли скидку. Если ты запишешь в в глобальную переменную при старте, то для пользователя будет всеравно старая скидка.
Я делал подобную задачу. В справочнике "пользователи" сделал реквизит "СразуНаПринтер" (при нажатии на "Печать" печаталось без предварительного просмотра) И каждый пользователь сам для себя выбирает как ему удобно. Так вот. Я тоже пишу в глобальную переменную. И если сам пользователь для себя поменяет то все работает без перезагрузки. Если Админ поменяет пользователю, то пользователю нужно перезайти.
   zenon46
 
9 - 27.09.18 - 11:23
(8) это понятно, в компании только один человек меняет размер скидки для пользователя, можно просто решить этот вопрос выдав предупреждение что пользователю нужно перезайти в систему.
   zenon46
 
10 - 27.09.18 - 11:23
(8) я просто пытаюсь понять выогдно переносить в глобальную переменную, или гонять каждый раз эту конструкцию, сотни раз в день для каждого пользователя.
 
 Рекламное место пустует
   vova1122
 
11 - 27.09.18 - 11:34
(9) Зависит от многих факторов.
1. Размер самого СпрДат (сколько по времени займет пройтись по этому справочнику)
2. Количество пользователей (Если много запаришься всем говорить чтоб перешли, и проконтролировать это).
   vova1122
 
12 - 27.09.18 - 11:38
+(8) Так как способ печати у меня меняется редко. то я одному поменял и забыл что ему нужно перезайти. И некоторое время пришлось колдовать почему не идет СразуНаПринтер...
   Злопчинский
 
13 - 27.09.18 - 11:52
СпрДат.ТекущийЭлемент().Наимен....
- ТекущийЭлемент() здесь зачем?
что не устроило в конструкции
СпрДат.Наимен....
?
   zenon46
 
14 - 27.09.18 - 11:54
(13) это делалось лет 15 назад) тогда я только разбирался в 1С, сейчас просто кинулся делать один отчет, снова понадобилось получать значения переменных из этого справочника и решил сразу везде переделать.
   Builder
 
15 - 27.09.18 - 11:55
Альтернативный вариант
1. получать при старте
2. сделать обработку ожидания в глобальнике и обновлять значение раз в час например.
   Базис
 
16 - 27.09.18 - 12:00
4 ошибки, кто больше?
   vova1122
 
17 - 27.09.18 - 12:05
(15) значит при худшем варианте целый час будет действовать неверная скидка. За тот час можно продать на 100500 тугриков товара с неправильной скидкой
   Builder
 
18 - 27.09.18 - 12:11
(17) Значит настроить время обновления в зависимости от требований, изложенных в техническом задании :)
   Peltik
 
19 - 27.09.18 - 12:34
можно еще флаг изменения какой-нибудь прилепить, что бы каждый раз не пересчитывать
   unregistered
 
20 - 27.09.18 - 12:57
(0) Оставить как есть - получать данные из справочника.

Только *авнокод оптимизировать.

Что есть реквизит Нимен справочника УправлениеДатамиРедактирования? Предположу, что это ссылка на справочник Пользователи (реальной структуры комплексной 7.7 я не помню). Если так, то найдите сначала это элемент, а потом ищите нужный в справочнике УправлениеДатамиРедактирования. Как то так:


 СпрПользователи = СоздатьОбъект("Справочник.Пользователи");
 Если СпрПользователи.НайтиПоНаименованию(ИмяПользователя()) = 1 Тогда
   СпрДат = СоздатьОбъект("Справочник.УправлениеДатамиРедактирования");
   Если СпрДат.НайтиПоРеквизиту("Наимен", СпрПользователи.ТекущийЭлменет()) = 1 Тогда
     МаксСкидка = СпрДат.МаксСкидка;
     МинНаценка = СпрДат.МинНаценка;
   Иначе
    // что-то делаем

   КонецЕсли;
 Иначе
  // что-то делаем

 КонецЕсли;

PS Синтаксис 7.7 могу переврать, но думаю суть понятна.
   uno-group
 
21 - 27.09.18 - 13:04
При старте засунуть в переменную СпрДат.ТекущийЭлемент(), размеры скидок считать каждый раз. Хотя если 10 лет работало и никто не жаловался на быстродействие то смысл что то менять.
   vova1122
 
22 - 27.09.18 - 13:31
(21) если бы все было так просто. При старте КакаяТоПеременная=СпрДат.ТекущийЭлемент() И когда позже админ поменяэт этому пользователю в СпрДат скидку, то из "КакаяТоПеременная" всеравно будет вытягиватся старое значение
   unregistered
 
23 - 27.09.18 - 13:40
+ к (20) А вот кстати значение элемента справочника Пользователи соответствующего текущему пользователю, можно запихнуть и в переменную при старте системы. Уж это значение точно меняться не будет тогда код из (20) упроститься.
   vova1122
 
24 - 27.09.18 - 13:42
(23) ветку не читал?
   Kigo_Kigo
 
25 - 27.09.18 - 14:01
(22) Сфигали, мы запминаем не знаечение параметра, а справочник, а вот при обращении
КакаяТоПеременная.МаксСкидка будет считываться значение параметра из справочника, по этому в глобальную переменню при запуске засовываем КакаяТоПеременная = СпрДат.ТекущийЭлемент()
   vova1122
 
26 - 27.09.18 - 14:09
(25) я знаю о чем говорю. Так как у меня была похожая ситуация см (8). Если не веришь, то сам проверь. Запиши в глобальную переменную ТекущегоПользователя. Потом запусти 1С под двумя пользователями. Под одним поменяй какое-то значения в СправочникеПользователи (для другого пользователя) А потом под другим пользователем проверь это начение.
   vova1122
 
27 - 27.09.18 - 14:17
+(26) именно попробуй получить его из глобальной КакаяТоПеременная
   uno-group
 
28 - 27.09.18 - 14:25
(27) Если сделаешь Спр.ИспользоватьДату()то переменная будет хранить все реквизиты на момент отрытия. А конструкция
Переменная.МинСкидка.Получить(ДатаДок) будет считывать всегда свежие значения. Можешь за проверяться.
   vova1122
 
29 - 27.09.18 - 14:37
(28) точно.... Для переодических реквизитов работает. а для обычных нет. Никогда бы не подумал о таком
   ADirks
 
30 - 27.09.18 - 15:00
(26) это называется кэширование
чтобы победить кэш можно писать КакаяТоПеременная.ТекущийЭлемент().Скидка;

но может и не помочь иной раз
   vova1122
 
31 - 27.09.18 - 15:21
(30) это называется нужно искать элемент и вызывать значение его реквизита каждый раз когда нужно, а не ПриСтартеСистемы. Из чего следует что мы возвращаемся к изначальной проблеме в (0)
   vova1122
 
32 - 27.09.18 - 15:28
+(31) а нет. Всетаки заработало как надо. Значит автору можно посоветовать переписать  сохранять в глобальную переменную и вызывать как описано в (30)
   vova1122
 
33 - 27.09.18 - 15:31
+(32) Последовательно вызвал после изменения другим пользователем
 Сообщить(глПользователь.СразуНаПринтер);    
Сообщить(глПользователь.ТекущийЭлемент().СразуНаПринтер);
 Первое выдало "0" Второе "1" (правильное должно было быть "1")
 
 
   zenon46
 
34 - 27.09.18 - 16:01
(33) да уже все намутил, изменение скидки на лету все равно делать никто не будет.
   vova1122
 
35 - 27.09.18 - 16:24
(34) а вдруг....?  И как сделали?
   zenon46
 
36 - 27.09.18 - 16:28
(35) не точно нет) этой системе уже более 10 лет.
сделал просто при начале работы систему, записываю в глобальные переменные нужные параметры, в модулях где раньше использовался вызов справочника и поиск, просто вставил эту глобальную переменную. ведь под каждым пользователем эта переменная принимает значений то что задано для него в справочнике.
   vova1122
 
37 - 27.09.18 - 16:50
теперь главное чтобы новую скидку устанавливали до того как пользователи начнут входить в базу. Ведь до этого у вас работало по другому - скидка вычислялась на реальное время. А сейчас будет на момент когда пользователь зашел в базу.
   zenon46
 
38 - 28.09.18 - 09:02
(37) скидка величина абсолютная, далее она просто в формулах участвовала, я скажу более, ее не меняли уже лет 7)
   unregistered
 
39 - 28.09.18 - 12:00
(24) > ветку не читал?

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует