Быстрые параметры сеанса (решение проблемы глобальных переменных в контексте сервера)

22.12.18

Разработка - Универсальные функции

Расширение возможностей при адаптации, расширении и т. д. конфигураций обычного / управляемого приложения на платформе 8.3 путем предоставления доступа к так называемым быстрым параметрам сеанса в глобальном контексте (как частный случай - решение проблемы глобальных переменных в контексте сервера)

Файлы

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

Наименование Скачано Купить файл
Быстрые параметры сеанса для платформы 8.3.14 и старше
.cfe 12,47Kb ver:1.1.1
10 2 500 руб. Купить
Быстрые параметры сеанса для платформы 8.3.13 и младше
.cfe 11,97Kb ver:1.1.1
6 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Пролог

Возникла задача: на типовом решении интерактивно запускать длительную обработку так, чтобы было видно как идет процесс (индикатор %). При этом большая часть обработки происходит на сервере, а использование фонового задания для этих целей оказалось не применимо. Единственным приемлемым решением было применить регулярые вызовы сервера, во время каждого из которых обрабатывалась очередная порция, а на клиенте двигался индикатор %. Объем временных служебных данных во время обработи на стороне сервера оказался большой, поэтому гонять его туда-сюда при контекстных вызовах слишком накладно. Как было бы замечательно поместить их в глоальную переменную на сервере и использовать вызовы безконтекста формы. Как известно, глобальные переменные в контексте сервера невозможны, а использование стандартных параметров сеанса очень медленно, использование временного хранилища еще медленней. Но если нельзя, а очень хочется, то получается вот такое:

Описание алгоритма

Все устроено так, как если бы была глобальная переменная (например, глОбщиеЗначения) содержащая структуру, и в эту структуру можно сложить что угодно (как, например, слона в холодильник :)) ) и при этом максимально быстро. Естественно, на клиенте и на сервере эти переменные разные и нужно их как-то синхронизировать. Все решается путем применения сохраняемых на время сеанса результатов функций из общих модулей. Но есть одно НО: эти значения внезапно смертны. Вот цитата из справки:

Сохраненные значения могут быть удалены:

  • после долгого неиспользования (более 5 минут);
  • при нехватке оперативной памяти в рабочем процессе сервера;
  • при перезапуске рабочего процесса;
  • при переключении клиента на другой рабочий процесс.

Время в первом пункте может варьироваться от релиза к релизу, но принцип сохраняется и подтверждается экспериментами. Поэтому для обеспечения их живучести пришлось пойти на сохранение этих структур в одном из обычных параметров сеанса с типом хранилище значения. Сохранение происходит регулярно, но не слишком часто, чтобы не сбивать производительность. Если структуры из сеансовых данных "помрут", они будут воссозданы заново из сохраненных в обычном параметре сеанса.

При обрашении БПС_Общие.ПолучитьПараметрСеанса (ИмяПараметра) на клиенте проверяется клиентская структура, если нет нашли - проверяется серверная структура (серверный вызов), если не нашли - проверяется вся коллекция стандартных параметров сеанса (т. е. параметры сеанса могут быть скопированы на клиента и в дальнейшем доступны быстро, естественно, помним про ограничения по типам), если не нашли - проверяется сохраненная ранее в служебном параметре сеанса структура, если не нашли - пытаемся вызвать функции получения значений по-умолчанию типовых конфигураций, если таковые имеются. Полученные по цепочке значения сохраняются на сервере и возвращаются на клиента. При обрашении БПС_Общие.ПолучитьПараметрСеанса (ИмяПараметра) на сервере все происходит по той же цепочке, только начинается с сервера.

При обрашении БПС_Общие.УстановитьПараметрСеанса (ИмяПараметра, ЗначениеПараметра, ОбновлятьСервер) на клиенте происходит установка нового значения параметра. ОбновлятьСервер указывает сразу установить значение и на стороне сервера и сохранить структуру в служебный обычный параметр сеанса. При обрашении БПС_Общие.УстановитьПараметрСеанса (ИмяПараметра, ЗначениеПараметра, ОбновлятьСервер) на сервере выполняется все так же. ОбновлятьСервер указывает сразу сохранить структуру в служебный обычный параметр сеанса.

Такое временное хранение данных может "отъесть" значительный кусок памяти на сервере, поэтому "после того как" желательно прибрать мусор. Для этого используем вызовы БПС_Общие.УдалитьПараметрСеанса (ИмяПараметра, ОбновлятьСервер) соответственно на клиенте / на сервере.

Особенности

Реализовано в виде расширения с назначением: Адаптация. Из расширяемой конфигурации заимствованы только процедура модуля приложения ПриНачалеРаботыСистемы и процедура модуля сеанса УстановкаПараметровСеанса. Если процедуры ПриНачалеРаботыСистемы нет в расширяемой конфигурации, ошибки не будет, но не будет работать регулярное сохранение в стандартный параметр сеанса при бездействии (при обращении проверка необходимости сохранения продолжит работать). Все остальное только добавлено и не пересекается с типовыми объектами/именами.

До платформы 8.3.14 в расширение нельзя было добавить свои параметры сеанса, поэтому реализовано два расширения:

  • БыстрыеПараметрыСеанса.8.3.14.cfe - для платформы и режима совместимости 8.3.14 и выше
  • БыстрыеПараметрыСеанса.8.3.13.cfe - для платформы и режима совместимости с 8.3.9 по 8.3.13

Расширение 8.3.14 следует использовать только если и платформа и режим совместимости расширяемой конфигурации 8.3.14 и выше. В противном случае следует использовать расширение 8.3.13. В нем среди стандартных параметров сеанса ищется подходящий с типом ХранилищеЗначения и содержащий структуру. Обычно хоть один такой имеется если в конфигурацию внедрены стандартные библиотеки.

Если наслаиваются несколько расширений, то это желательно поставить первым в списке (ближе к расширяемой конфигурации).

Если заимствовать содержимое расширения и внедрить в конфигурацию непосредственно, то можно вынести функции и процедуры в глобальный контекст, естественно, разделяя клиент и сервер.

Эпилог

Просьба не выкладывать скачанные файли или код из них на варезных форумах, 1sm - не такая уж великая цена. А если не утерпели, то хотя бы проставляйте ссылку на первоисточник.

Вступайте в нашу телеграмм-группу Инфостарт

параметры сеанса глобальные переменные сервер программирование

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3762    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7071    DeerCven    15    

60

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    50821    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7483    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    64210    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9359    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DO_WHILE_LOOP 360 22.12.18 16:19 Сейчас в теме
Система стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8
Длительные операции на сервере
https://its.1c.ru/db/v8std#content:2149184291:hdoc
2. Mekadote 6 23.12.18 01:12 Сейчас в теме
(1) Все верно, мы так же считаем, что желательно придерживаться стандартов и методик от "Большого Брата", и сами придерживаемся по возможности. Но эти стандарты и методики - не догма, а рекомендация.
Быстрые параметры сеанса - не для запихивания во все и вся повсеместно, а для особых случаев. И те, у кого особый случай случился, применят сей инструмент и скажут спасибо.
4. Munsters 13 27.09.24 18:24 Сейчас в теме
(2) Добрый день. подскажите как можно с вами связаться? вопрос по теме, в которой вы выкладывали решение..
3. Ted1982 68 04.11.20 21:19 Сейчас в теме
После подключения расширения к конфигурации ЗУП 3.1 (релиз 3.1.15.96 Платформа 8.3.16.1148) при запуске программы появляется ошибка "Поле объекта не обнаружено БПС_ОбщиеЗначения", т.е. программа не видит параметр сеанса из расширения.
Почему?
Прикрепленные файлы:
Для отправки сообщения требуется регистрация/авторизация