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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
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) 853 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) 929 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 Сейчас в теме
А нельзя ли ТАК правильно написать программный код, где "КЕШируемый" вызов будет получать данные только один раз( а не крутить вызовы в теле модуля)? И управление КЕШом всё-таки связать с видимостью ПЕРЕМЕННЫХ? Если пользователь "ушёл с модуля" - почистился КЕШ переменных значений модуля.

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

И ещё. Если в общем модуле с повторным использованием выбран "на время сеанса", то чем ЭТО в принципе отличается от использовании параметров сеанса? Это я про "мусор" как в конфигурации, так и в головах
29. Гуков Ярослав (for_sale) 157 03.03.17 10:09 Сейчас в теме
Для решения каких-то задач этот механизм наверняка нужен, удобен и хорош, но никакого отношения к "глобальным переменным на сервере" он не имеет, зачем писать такие вводящие в заблуждения названия статьям? Это "сохранение значения на сервере на время сеанса", а не глобальная переменная.

Переменная - это то, что можно изменить. Собственно, огромный кусок потребностей в глобальных переменных - это чтение-изменение её в разных местах. Есть у меня, например, глобальный счётчик, есть в разных местах процедуры, которые этот счётчик читают, а потом накручивают. Как это можно реализовать в данном механизме? Подозреваю, что как-то можно нахимичить с ОбновитьПовторноИспользуемыеЗначения(), но эти значения, собсна, для того и кэшировались, чтобы их как можно меньше дёргать, а так, получается, для каждого изменения нужно весь кэш сбрасывать (а его может быть очень много) для одной переменной.