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

16.06.10

Разработка - Математика и алгоритмы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
1Cv8.cf
.cf 11,25Kb
99
99 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3208    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7618    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3147    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10932    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4401    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    3567    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9051    7    kalyaka    11    

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

Остается вопрос - сколько вот таких запоминаний может быть в рамках сеанса, и будет ли все это корошо чиститься по завершении сеанса. ;)
7. Expert1C 664 16.12.09 11:35 Сейчас в теме
(5) данный пример максимально наглядно показывает, что возможно сохранение ссылки на объект. Что за объект - это уже не важно.

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

А агрегантный объект может быть либо ссылкой (как в данном примере) либо копией (в типовых 8.1 можно посмотреть функцию глПолучитьЗначениеПеременной(...) - название может быть несколько не такое)
13. tarroman 16.12.09 12:35 Сейчас в теме
(12) Вот и замечательно. В статье отражены и другие аспекты демо-примера :)
6. tarroman 16.12.09 11:33 Сейчас в теме
Я бы еще заголовок темы поменял. Ну как-то не совсем он коррелирует с описанием. Например, из первого предложения темы - "Реализация глобальных переменных и обращение к ним на сервере 8.2". :D
8. Expert1C 664 16.12.09 11:37 Сейчас в теме
(6) как говорила наша химичка, что пнем по сове, что совой об пень...
14. milanse 38 16.12.09 13:42 Сейчас в теме
Плюсанул, ком объекты, кстати тоже кешируются.
15. Expert1C 664 16.12.09 13:43 Сейчас в теме
16. kravchuk 141 17.12.09 10:13 Сейчас в теме
17. artbear 1563 18.12.09 07:14 Сейчас в теме
Плюсанул.
ИМХО в 8.2 в данном вопросе как-то все очень извращенно получилось :(
18. smilohov 27.12.09 18:02 Сейчас в теме
Спасибо, помогло! Плюсанул.
19. rasswet 82 13.04.10 18:30 Сейчас в теме
расскажите на примере, плиз, зачем это нужно?
20. Expert1C 664 12.05.10 10:29 Сейчас в теме
(19) не надо придумывать задачу по возможностям, надо искать возможности для решения задач
21. korsar-81 15.06.10 21:42 Сейчас в теме
СУПЕР - это то что я долго искал, большое спасибо
22. ZLENKO 398 02.08.10 18:42 Сейчас в теме
Если быть еще более точным, то читать надо не реже чем каждые 6 минут и даже в этом случае через 20 минут после вычислени все равно "умрет". А может и раньше если не повезет и серверу станет мало памяти.
Возможность очень интересная, но очень неуниверсальная :-( т.к. нет возможности явно управлять временем жизни кеша.
23. ValeriVP 1336 02.08.10 19:11 Сейчас в теме
(22) да, да, да.
на момент публикации еще небыло столь подробных комментариев от 1С, а сечас уже есть. и в связи с этим данный механизм уже не столь красив как казалось.
24. jsmith 16.10.11 17:36 Сейчас в теме
Очень интересно. Спасибо
25. d0dger 84 28.02.14 12:40 Сейчас в теме
Наткнулся на публикацию, а чем параметры сеанса в качестве глобальных переменных хуже?
26. saver77 65 20.11.14 14:38 Сейчас в теме
Спасибо! Отлично работает.
Внимание! В 8.3 не работает способ с использованием ПараметрСеанса, описанный тут: http://infostart.ru/public/62410/, выдаёт ошибку "Переданное значение не может быть помещено во временное хранилище".
27. JesteR 153 25.03.15 18:43 Сейчас в теме
Из документации:
Сохраненные значения удаляются:
Если свойство установлено в значение На время вызова:
● на стороне сервера – при возврате управления с сервера;
● на стороне клиента – при завершении работы процедуры или функции встроенного языка верхнего уровня (вызванной системой из интерфейса, а не из другой процедуры или функции встроенного языка);
Если свойство общего модуля установлено в значение На время сеанса:
● на стороне сервера – при окончании сеанса;
● на стороне клиента – при закрытии клиентского приложения.

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

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

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

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

Переменная - это то, что можно изменить. Собственно, огромный кусок потребностей в глобальных переменных - это чтение-изменение её в разных местах. Есть у меня, например, глобальный счётчик, есть в разных местах процедуры, которые этот счётчик читают, а потом накручивают. Как это можно реализовать в данном механизме? Подозреваю, что как-то можно нахимичить с ОбновитьПовторноИспользуемыеЗначения(), но эти значения, собсна, для того и кэшировались, чтобы их как можно меньше дёргать, а так, получается, для каждого изменения нужно весь кэш сбрасывать (а его может быть очень много) для одной переменной.
DJ_Codebase; djvu; TeMochkiN; +3 Ответить
30. Torin57 7 15.01.24 12:35 Сейчас в теме
(29) Не согласен. Глобальный счетчик работает без ОбновитьПовторноИспользуемыеЗначения()
Прикрепленные файлы:
1Cv8.dt
PlatonStepan; +1 Ответить
Оставьте свое сообщение