gifts2017

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Сергей Аверьянов (saver77) (1.00 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Владимир Чередниченко (bazilisa) 15.12.09 22:05
и зачем это, два раза прочитал не понял
2. Сергей (strange2007) 16.12.09 04:38
Очень ценная информация. Жаль раньше сам не додумался :))
3. Иван Петров (xMas) 16.12.09 10:57
Что-то есть подозрение, что переменная будет жить 20 минут (а может даже и всего 5)
4. Валерий Просвирнин (Expert1C) 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) 16.12.09 11:35
(5) данный пример максимально наглядно показывает, что возможно сохранение ссылки на объект. Что за объект - это уже не важно.

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

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

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

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

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

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