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

22.12.18

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

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

Скачать исходный код

Наименование Файл Версия Размер
Быстрые параметры сеанса для платформы 8.3.14 и старше
.cfe 12,47Kb
9
.cfe 1.1.1 12,47Kb 9 Скачать
Быстрые параметры сеанса для платформы 8.3.13 и младше
.cfe 11,97Kb
6
.cfe 1.1.1 11,97Kb 6 Скачать

Пролог

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

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

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

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

  • после долгого неиспользования (более 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 - не такая уж великая цена. А если не утерпели, то хотя бы проставляйте ссылку на первоисточник.

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

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

1 стартмани

18.03.2024    2946    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    5262    atdonya    22    

52

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    4162    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9600    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2300    28    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16442    144    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7394    quazare    8    

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