Продолжение публикции "Виртуальные глобальные контейнеры переменных".
Функция ВКонтейнер(Ключ, Значение = Неопределено, Область = Неопределено) Экспорт
Функция ИзКонтейнера(Ключ) Экспорт
Функция УдалитьИзКонтейнера(Ключ) Экспорт
Функция ПеременныеВКонтейнере() Экспорт
Функция ОбластиКонтейнера() Экспорт
Функция ПеременныеОбластиКонтейнера(Область) Экспорт
Функция КоличествоПеременныхВКонтейнере() Экспорт
Процедура ДефрагментацияКонтейнеров() Экспорт
Процедура ОчиститьКонтейнер() Экспорт
Процедура ОчиститьОбластьКонтейнера(Область) Экспорт
Процедура ДефрагментацияКонтейнеров() позволяет сбалансировать загрузку пула контейнеров переменных после добавления большого количества и удаления части переменных. При "дефрагментации" данные, размещенные во временном хранилище не перезаписываются, поэтому процедура выполняется быстро. В большинстве случаев эта процедура не потребуется, так как значения новых переменных будут размещаться в наименее загруженном контейнере из пула.
Результаты тестов производительности: в обычном виртуальном контейнере две тысячи изменений значений переменных выполнялось 26 секунд, в блочном контейнере (из 50 блоков) - двадцать тысяч изменений выполняется за 7 секунд, быстрее в 37 раз.
Теперь можно использовать на практике "глобальные переменные" произвольных типов для обмена данными между серверным процедурами и функциями одного или различных модулей. Если переменные нужно создать на время существования формы и удалить после её закрытия, нужно просто вызывать фунцию ВКонтейнер(Ключ, Значение, ЭтаФорма.УникальныйИдентификатор) и в обработчике формы "ПриЗакрытии" вызвать ОчиститьОбластьКонтейнера(ЭтаФорма.УникальныйИдентификатор).
Блочный контейнер можно использовать также для повышения производительности формы, поскольку он предоставляет альтернативный способ обмена данными между процедурами формы. Например, если форма содержит "развесистую" таблицу значений, то вызов функций РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() будет занимать длительное время. Если в некоторых процедурах формы нужен доступ только к некоторым реквизитам формы, "лишние" данные формы будут мешать. Такие процедуры можно скомпилировать с директивой &НаСервереБезКонтекста, передать в них дополнительным аргументом УникальныйИдентификаторФормы и осуществлять доступ к необходимым для работы всех процедур общим данным через блочный контейнер переменных.
Еще вариант применения блочного контейнера: подписки на события выполняются на стороне сервера, но через контейнер можно передать данные из процедуры подписки на сторону клиента. Для этого, например, в подписке "ПередУдалением" нужно вызвать функцию ВКонтейнер(Источник.Ссылка,<передаваемая на сторону клиента структура>,"УдалениеОбъектаПоПодписке"), а на клиенте в процедуре, вызываемой в обработчике ожидания, проверять наличие переменных в Области "УдалениеОбъектаПоПодписке" Если нашли, забирать ИзКонтейнера информацию, сформированную в процедуре подписки и обрабатывать уже на стороне клиента (оповещать о событии удаления на сервере, к примеру). После обработки каждой переменной области - удалять из контейнера переменную с "именем" Источник.Ссылка (вот здесь и пригодится возможность использования в качестве "имен" переменных данных произвольных типов !).
- добавлен параметр функции ВКонтейнер(Ключ, Значение = Неопределено, Область = Неопределено, Срок = 0). Задает "срок жизни" переменной секундах;
- добавлена процедура УдалитьУстаревшиеПеременные(). Удаляет переменные, "срок жизни" которых вышел;
- аргументом функции УдалитьИзКонтейнера() может быть как один ключ, так и массив ключей.