Виртуальные глобальные контейнеры переменных

08.04.17

Разработка - Инструментарий разработчика

Концепция и реализация механизма виртуальных контейнеров глобальных переменных. Виртуальные контейнеры могут содержать переменные различных типов (ссылки, данные, таблицы значений и др.). Добавлять, изменять и считывать данные можно из клиентских (только примитивные типы) и серверных процедур. Возможно использование нескольких контейнеров и групповое удаление переменных. Механизм работает в толстом, тонком клиенте на платформе 1С 8.2 и выше.

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

Наименование Файл Версия Размер
Виртуальные глобальные контейнеры переменных:
.dt 81,96Kb
0
.dt 1.0.0 81,96Kb Скачать
Это первая статья на тему глобальных переменных в тонком клиенте, продолжение здесь:  //infostart.ru/public/608185/

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

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

Концепции и реализации такого механизма и посвящена данная публикация. Изложить концепцию можно с помощью следующих аналогий:

  • обычный (классический) контейнер можно представить в виде ящика, в который можно в любой момент  положить какой-либо предмет, извлечь предмет или посмотреть на предмет. Можно еще вытряхнуть все предметы в мусорную корзину )
  • виртуальный контейнер аналогичен запаяному стеклянному сосуду с различными предметами внутри.   Можно посмотреть, сколько предметов внутри, посмотреть на сам предмет.  Но чтобы добавить в него новый предмет, извлечь предмет или проделать еще какие-либо операции над предметом, придется сосуд разбить, вынуть все предметы, выполнить над ними все  необходимые манипуляции и запаять в новый сосуд. Причем, раз уж разбивать, удобнее это делать для изменения нескольких предметов сразу.  То есть при выполнении манипуляций над предметами, сосуды все время заменяются (контейнер является виртуальным).   Постоянным остаётся только то, что предметы запаяны в какой-либо сосуд.

    
После этой преамбулы перейдем к сути реализации. 

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

    Соответствие = Новый Соответствие(ПараметрыСеанса.КонтейнерПеременных1);
    //.... здесь выполняем манипуляции над Соответствием ...
    ПараметрыСеанса.КонтейнерПеременных1 = Новый ФиксированноеСоответствие(Соответствие);

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

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

  •          Время - время создания переменной. Может быть использовано для автоматической "сборки мусора";
  •          Тип - информация о типе переменной;
  •          URI - служебное свойство для преобразования информации о типе в Тип конфигурации;
  •          Область - свойство управления временем жизни переменной. Тип свойства - произвольный.
  •          Значение или Адрес. Переменные простых типов сохраняются в Значение, для сложных типов
  •            в свойстве Адрес сохранятся адрес, который вернула функция ПоместитьВоВременноеХранилище().

    Изменение переменных возможно поодиночке или пакетное. Скорость пакетного изменения практически не зависит  от количества переменных в пакете, поэтому выполняется намного быстрее нескольких одиночных.

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

В конце концов, как говорится в одной известной пословице: "Если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка и есть" .

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122113    670    389    

714

SALE! 25%

Infostart PrintWizard

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

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

18000 15300 руб.

06.10.2023    7286    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3524    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2520 руб.

14.01.2013    177737    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99344    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18108    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28107    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23601    15    15    

32
Оставьте свое сообщение