Глобальные переменные в контексте сервера 8.2. Простое решение.

Опубликовал Валерий Просвирнин (Expert1C) в раздел Программирование - Теория программирования

Можно ли в 8.2 на сервере хранить ссылку на какой либо объект?
Можно! Рассмотрим на примере...

Эта статья - более простая реализация решения задачи описанной в http://infostart.ru/public/62410/

Платформа 8.2 простым штатным способом позволяет реализовывать глобальные переменые на сервере. Достигается это использованием модулей с признаком "Повторное использование возвращаемых значений" установленным в значение "На время сеанса". Установка данного признака заставляет систему помнить все возвращаемые значения. Как сказано в СП:

Если для общего модуля установлено значение "На время вызова" или "На время сеанса", то возвращаемые значения экспортных функций повторно используются в разрезе входных значений их параметров.

Для сброса значений необходимо вызвать функцию:

	 ОбновитьПовторноИспользуемыеЗначения()

Таким образом задача решается без всяких извращений.

 

Для демонстрации приложена конфигурация, с одной единственной обработкой, со следующим текстом:

	 Процедура КнопкаВыполнитьНажатие(Кнопка)
    ОчиститьСообщения();
    Тест.ВывестиЗначенияСтруктуры();
КонецПроцедуры

Модуль "Тест" (Сервер, Вызов сервера):

 
Функция ВывестиЗначенияСтруктуры() Экспорт
    Соответствие = Переменные.ПолучитьПеременную();
    Для Каждого КлючЗначение Из Соответствие Цикл
        Сообщить(КлючЗначение.Ключ);
    КонецЦикла;
    Соответствие.Вставить(ТекущаяДата(), ТекущаяДата());
КонецФункции

И модуль "Переменные" (Сервер, Повторное использование возвращаемых значений=На время сеанса):

 
Функция ПолучитьПеременную() Экспорт
    Сообщить("Создаем объект"); //Эта строка выполнится один раз за сеанс!
    Возврат Новый Соответствие; //и эта тоже!
КонецФункции

Ложка дегтя - все что написано выше - неправильно. Везде, где написано "сеанс" надо читать "20 минут после последнего обращения" :(

И вообще - не все по факту так, как написано. Вскоре будут изменения.

Скачать файлы

Наименование Файл Версия Размер
1Cv8.cf
.cf 11,25Kb
07.09.14
96
.cf 11,25Kb 96 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Сергей Аверьянов (saver77) (1.00 $m)
Добавить вознаграждение
Комментарии
1. Владимир Чередниченко (bazilisa) 15.12.09 22:05 Сейчас в теме
и зачем это, два раза прочитал не понял
2. Сергей (strange2007) 123 16.12.09 04:38 Сейчас в теме
Очень ценная информация. Жаль раньше сам не додумался :))
3. Иван Петров (xMas) 16.12.09 10:57 Сейчас в теме
Что-то есть подозрение, что переменная будет жить 20 минут (а может даже и всего 5)
4. Валерий Просвирнин (Expert1C) 648 16.12.09 11:00 Сейчас в теме
(3) да, конечно. Если сеанс будет жить 20 минут (или всего 5)
5. Роман Тарасевич (tarroman) 16.12.09 11:29 Сейчас в теме
Сохранение соответствия "ключевые параметры"->"возвращаемое значение" и возможность обращения к нему - это конечно корошо и не только для возврата соответствия, как в примере (вызов непараметризируемой функции), т.к. здесь придется еще позиционироваться на элементе соответствия. Если параметр у функции один - строка - идентификатор переменной, то и получается нечто вроде функции возвращавшей значение параметра сенса в 8.1. А можно и многомерить (составной ключ - значение)

Остается вопрос - сколько вот таких запоминаний может быть в рамках сеанса, и будет ли все это корошо чиститься по завершении сеанса. ;)
6. Роман Тарасевич (tarroman) 16.12.09 11:33 Сейчас в теме
Я бы еще заголовок темы поменял. Ну как-то не совсем он коррелирует с описанием. Например, из первого предложения темы - "Реализация глобальных переменных и обращение к ним на сервере 8.2". :D
7. Валерий Просвирнин (Expert1C) 648 16.12.09 11:35 Сейчас в теме
(5) данный пример максимально наглядно показывает, что возможно сохранение ссылки на объект. Что за объект - это уже не важно.

Количество сохраняемых объектов платформа не ограничивает.
Чиститься будет, если не будет циклических ссылок
8. Валерий Просвирнин (Expert1C) 648 16.12.09 11:37 Сейчас в теме
(6) как говорила наша химичка, что пнем по сове, что совой об пень...
9. Роман Тарасевич (tarroman) 16.12.09 11:42 Сейчас в теме
(7) Я бы сказал, что данный пример показывает возможность сохранения соответствия в рамках сеанса и обращения к нему в первую очередь. А что запихано в соответствие - да что угодно, благо там нет ограничения на типы хранимых в соотв. объектов. ;)
10. Валерий Просвирнин (Expert1C) 648 16.12.09 11:44 Сейчас в теме
(9) почему соответствие? это может быть структура, ТЗ, ВК, ...
смысл в том, что хранится именно ссылка, а не копия объекта
11. Роман Тарасевич (tarroman) 16.12.09 11:49 Сейчас в теме
(10) в примере то именно соответствие :) Для меня соответствие - это не ссылка. Это агрегатный объект/тип:) А хранить наверное можно все, что может возвращать подобная функция с указанными свойствами, либо агрегатный объект/тип, ею возващаемый.
12. Валерий Просвирнин (Expert1C) 648 16.12.09 11:56 Сейчас в теме
(11) соответствие для демонстрации выбрано только потому, что в нем проще хранить уникальные значения (дату).

А агрегантный объект может быть либо ссылкой (как в данном примере) либо копией (в типовых 8.1 можно посмотреть функцию глПолучитьЗначениеПеременной(...) - название может быть несколько не такое)
13. Роман Тарасевич (tarroman) 16.12.09 12:35 Сейчас в теме
(12) Вот и замечательно. В статье отражены и другие аспекты демо-примера :)
14. Сергей Смирнов (milanse) 24 16.12.09 13:42 Сейчас в теме
Плюсанул, ком объекты, кстати тоже кешируются.
15. Валерий Просвирнин (Expert1C) 648 16.12.09 13:43 Сейчас в теме
16. Олег Кравчук (kravchuk) 136 17.12.09 10:13 Сейчас в теме
17. Артур Аюханов (artbear) 847 18.12.09 07:14 Сейчас в теме
Плюсанул.
ИМХО в 8.2 в данном вопросе как-то все очень извращенно получилось :(
18. smilohov@mail.ru (smilohov) 27.12.09 18:02 Сейчас в теме
Спасибо, помогло! Плюсанул.
19. rasswet (rasswet) 80 13.04.10 18:30 Сейчас в теме
расскажите на примере, плиз, зачем это нужно?
20. Валерий Просвирнин (Expert1C) 648 12.05.10 10:29 Сейчас в теме
(19) не надо придумывать задачу по возможностям, надо искать возможности для решения задач
21. Николай Гармаш (korsar-81) 15.06.10 21:42 Сейчас в теме
СУПЕР - это то что я долго искал, большое спасибо
22. Z-z-z (ZLENKO) 02.08.10 18:42 Сейчас в теме
Если быть еще более точным, то читать надо не реже чем каждые 6 минут и даже в этом случае через 20 минут после вычислени все равно "умрет". А может и раньше если не повезет и серверу станет мало памяти.
Возможность очень интересная, но очень неуниверсальная :-( т.к. нет возможности явно управлять временем жизни кеша.
23. - - (Rebelx) 928 02.08.10 19:11 Сейчас в теме
(22) да, да, да.
на момент публикации еще небыло столь подробных комментариев от 1С, а сечас уже есть. и в связи с этим данный механизм уже не столь красив как казалось.
24. jack smith (jsmith) 16.10.11 17:36 Сейчас в теме
Очень интересно. Спасибо
25. Павел (d0dger) 77 28.02.14 12:40 Сейчас в теме
Наткнулся на публикацию, а чем параметры сеанса в качестве глобальных переменных хуже?
26. Сергей Аверьянов (saver77) 9 20.11.14 14:38 Сейчас в теме
Спасибо! Отлично работает.
Внимание! В 8.3 не работает способ с использованием ПараметрСеанса, описанный тут: http://infostart.ru/public/62410/, выдаёт ошибку "Переданное значение не может быть помещено во временное хранилище".
27. Сергей JesteR (JesteR) 108 25.03.15 18:43 Сейчас в теме
Из документации:
Сохраненные значения удаляются:
Если свойство установлено в значение На время вызова:
● на стороне сервера – при возврате управления с сервера;
● на стороне клиента – при завершении работы процедуры или функции встроенного языка верхнего уровня (вызванной системой из интерфейса, а не из другой процедуры или функции встроенного языка);
Если свойство общего модуля установлено в значение На время сеанса:
● на стороне сервера – при окончании сеанса;
● на стороне клиента – при закрытии клиентского приложения.

Сохраненные значения будут удалены:
● на сервере, в толстом клиенте, во внешнем соединении, в тонком клиенте и в веб-клиенте с обычной скоростью соединения – через 20 минут после вычисления сохраняемого значения или через 6 минут после последнего использования;
● в тонком клиенте и веб-клиенте с низкой скоростью соединения – через 20 минут после вычисления сохраняемого значения;
● при нехватке оперативной памяти в рабочем процессе сервера;
● при перезапуске рабочего процесса;
● при переключении клиента на другой рабочий процесс.

После удаления значений вызов экспортируемой функции выполняется как при первом вызове.
NittenRenegade; +1 Ответить
28. Юрий Батяев (ybatiaev) 33 20.10.16 11:38 Сейчас в теме
А нельзя ли ТАК правильно написать программный код, где "КЕШируемый" вызов будет получать данные только один раз( а не крутить вызовы в теле модуля)? И управление КЕШом всё-таки связать с видимостью ПЕРЕМЕННЫХ? Если пользователь "ушёл с модуля" - почистился КЕШ переменных значений модуля.

Вообще, как бы желательно, САМОМУ (программно) чистить КЕШ НЕ НУЖНЫХ значений(по типу деструктора).

И ещё. Если в общем модуле с повторным использованием выбран "на время сеанса", то чем ЭТО в принципе отличается от использовании параметров сеанса? Это я про "мусор" как в конфигурации, так и в головах