1с модуль сеанса где выполняется
Модули служат непосредственно для хранения исполняемого кода на языке 1С предприятия. Модули как правило состоят из:
Причем разделы идут именно в таком порядке, наличие всех разделов в модуле не обязательно. При указании процедур, функций и переменных следует указывать, где они будут скомпилированы, если не указана директива компиляции, то компиляция произойдет на сервере(необязательно для толстого клиента). Некоторые модули могут компилироваться и на клиенте и на сервере, некоторые только на сервере.(здесь следует добавить примеров). При указании процедур, функций и переменных можно указать их как экспортные. Тогда эти процедуры и переменные будут доступны из вне этого модуля. Делается это с помощью ключевого слова Экспорт
Модуль приложения
Модуль приложения используется для отслеживания запуска\завершения программы. Отрабатывает только в случае если 1С запускается интерактивно, то есть показывается на экране. В 1С есть два модуля приложения один для запуска обычного приложения, второй для запуска управляемого приложения. Модуль приложения управляемого приложения компилируется на стороне клиента. То есть недоступны обращения к базе данных и прочие объекты доступные только на сервере. В модуле обычного приложения, понятно таких проблем нет. В модуле приложения могут как обычно размещаться объявления переменных, процедуры и функции, а также предопределенные обработчики событий. В модуле доступны следующие события:
ПередНачаломРаботыСистемы событие срабатывает в момент запуска системы, одним из первых, когда запуск еще не произошел. У этого события есть параметр Отказ и если его выставить в Истина , то запуск не произойдет. В этот момент окна еще нет, и взаимодействовать с пользователем, не получится.
ПриНачалеРаботыСистемы событие срабатывает когда запуск уже случился и нужно сделать какие то действия после запуска. Уже есть окно программы и можно что то спросить или сказать. Отказаться от запуска уже невозможно.
ПередЗавершениемРаботыСистемы событие по аналогии с предыдущим срабатывает когда завершение работы еще не произошло, есть параметр отказ и можно спросить пользователя, не ошибся ли он, нажав на крестик.
ПриЗавершенииРаботыСистемы событие срабатывает когда все уже произошло и надо отработать действия которые должны происходить после завершения работы системы.
ОбработкаВнешнегоСобытия вызывается когда происходит какое то событие передаваемое в систему, например вызов ридера магнитных карт или сканера штрихокда.
Если в модуле приложения объявить экспортную процедуру или функцию, то можно будет обращаться к ней напрямую без указания имени модуля, из любого другого модуля(если экспортная процедура объявлена в модуле управляемого приложения то очевидно, что она будет доступна только из клиентских модулей). По существу мы получим процедуру глобального контекста. При этом нужно понимать, что этот модуль компилируется при старте системы всегда, поэтому при наличии большого числа процедур в этом модуле будет падать скорость запуска приложения.
Модуль внешнего соединения
Модуль срабатывает в момент запуска приложения в режиме ком соединения, в этом модуле так же есть события ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы в этом модуле не создается окно и нет возможности взаимодействовать с пользователем . Компилируется на сервере.
Модуль сеанса
Запускается и при запуске пользователем и в случае ком соединения, его предназначение – установка параметров сеанса, в модуле сеанса есть только один обработчик УстановкаПараметровСеанса , этот обработчик вызывается первым при запуске приложения. Модуль сеанса компилируется на сервере и запускается в привилегированном режиме - без контроля прав конкретного пользователя. Так же в модуле сеанса запрещены экспортные процедуры и функции.
Внимание. Этот модуль запускается не только при старте системы, но еще и при обращении к параметрам сеанса которые не были определены. В этом случае в первом параметре процедуры УстановкаПараметровСеанса будет массив с параметрами к которым произошло обращение.
Общие модули
Общие модули служат для хранения процедур и функций, которые должны быть доступны из любого места конфигурации. Как правило в них описывают какие то общие механизмы. Количество общих модулей неограниченно. Обычно общие модули разбивают по функционалу. В отличии от предопределенных модулей, у общих модулей есть возможность указать, в каком контексте они будут скомпилированы. В общих модулях доступны только описания процедур и функций, недоступно описание переменных и раздел основной программы. При написании процедур в общих модулях необходимо учитывать место компиляции этого модуля. Есть возможность установить свойство глобальный в этом случае экспортные процедуры будут доступны без указания названий модуля. Глобальные модули компилируются при старте системы и также замедляют старт системы(особенно это плохо, когда там содержатся такие функции которые могут никогда не понадобиться или используются очень редко). Использование процедур из этих модулей может ухудшить читаемость кода. То есть строчка
Читается гораздо лучше чем просто
Галочка Привилегированный указывает на то что при обработке процедур из этого модуля система не будет обращать внимания на права пользователя, это бывает удобно при больших объемах обработки данных когда обработка должна отработать как можно быстрее и нет смысла уменьшать ее быстродействие проверкой прав или когда на время работы процедуры, необходимо дать пользователю недостающие права. Место компиляции модуля определяется с помощью установки свойств модуля. Доступные значения:
В случае если стоят все галочки, то при компиляции процедура скомпилируется и будет доступна только там где указано директивой препроцессору. Если такая директива не указана, то процедура будет скомпилирована и на сервере и на клиенте. В таком случае, необходимо придерживаться ограничений, накладываемых как на серверный контекст так и на клиентский, то есть не будут работать функции обращения к базе данных(сервер) и не будут работать функции взаимодействия с пользователем(клиент). Обращение к экспортным методам общего модуля скомпилированного на сервере, возможно в том случае если установлено свойство Вызов сервера .
Модуль формы
Формы делятся на управляемые и на обычные. В управляемых формах код делится на клиентский и серверный. В обычных формах весь код выполняется на клиенте. Модуль предназначен для обработки действий пользователя и событий формы. (Подробно о событиях выполняемых в модуле формы можно будет почитать либо по ссылке, которая будет здесь, либо события будут добавлены сюда).
Модуль объекта
В модуле объекта записывают такие обработчики как ПриЗаписи , ОбработкаПроведения . ()Суть модуля заключается в том, что события могут срабатывать, даже при программной записи объекта, открытие формы в данном случае необязательно. Также есть возможность, определить дополнительные методы для объекта, если определить их в модуле объекта с ключевым словом Экспорт .
Модуль менеджера
Модуль позволяет добавить функционал расширяющий возможности менеджера, например: В модуле менеджера справочника номенклатура можно указать:
Предназначен в основном для того чтобы поймать момент запуска приложения и момент завершения работы. Здесь же находятся обработчики, которые позволяют перехватить внешнее событие от оборудования. В модуле управляемого приложения отслеживается именно интерактивный запуск системы.
События модуля управляемого приложения срабатывают при запуске тонкого клиента, Веб-клиента и Толстого клиента управляемого приложения. В модуль упр. приложения можно попасть из палитры свойств корневого узла конфигурации или из контекстного меню вызванного на корневом узле конфигурации.
Модуль обычного приложения
Модуль обычного приложения играет такую же роль как и модуль управляемого приложения, только события модуля обычного приложения срабатывают при запуске толстого клиента обычного приложения.
Модуль обычного приложения станет доступен из палитры свойств корневого узла конфигурации после установки в параметрах конфигуратора на вкладке «Общие» опции «Редактирование конфигурации для режимов запуска» в положение «Управляемое приложение и обычное».
Модуль внешнего соединения
Модуль внешнего соединения предназначен для обработки события входа (не интерактивного, а в режиме COM-соединения) и выхода из системы. Имеются соответствующие обработчики. При COM-соединении не происходит открытие интерактивного окна, поэтому функции для диалога с пользователем не сработают. В модуле возможно описывать экспортные переменные и методы. Модуль внешнего соединения компилируется на сервере. Т.е. возможно обращение к соответствующим объектам конфигурации, например к справочникам.
Модулем сеанса
Существует такой общий объект конфигурации как «Параметры сеанса». Модуль сеансов создан для инициализации параметров сеанса (для этого существует определенное событие, при запуске приложения оно стартует самое первое).
Запускается в привилегированном режиме (не выполняется проверка прав доступа при обращении к БД). Модуль сеанса компилируется на сервере. Нет раздела описания переменных и раздела основной программы, нельзя описывать экспортные методы, используется только для установки параметров сеанса. Как видно у модуля сеанса очень узкое предназначение.
Общие модули
Общие модули описывают некоторые общие алгоритмы, содержат функции, которые могут вызываться из различных мест. Общие модули могут быть скомпилированы как на клиенте, так и на сервере.
В общих модулях доступен ТОЛЬКО раздел описания процедур и функций. Если необходимо использовать глобальную переменную то можно использовать, либо параметры сеанса, либо экспортную переменную модуля управляемого приложения.
В общем модуле можно задавать некоторые параметры, которые будут влиять на его поведение. Если в общем модуле установлена галочка «Глобальный» то его экспортные функции будут участвовать в формировании глобального контекста. И к ним можно будет обратиться из другого контекста напрямую (без упоминания имени общего модуля) : МетодОбщегоМодуля( );
Не стоит использовать свойство «Глобальный» общих модулей повсеместно, т.к. такие модули компилируются при старте системы и замедляют старт программы
Модуль объекта
У многих объектов конфигурации (справочники, документы и т.д. ) существует модуль объекта. В него можно вводить стандартные события, такие как создание нового элемента справочника, запись нового объекта, удаление, обработка проведения документа и т.д. Событие записи существует и в модуле формы (возникает в процессе интерактивной записи, когда пользователь нажимает на кнопку «записать») и в модуле объекта.
Нужно помнить, что у одного объекта может быть несколько форм. Поэтому событие записи нужно обрабатывать именно в модуле объекта. Именно там проверяется корректность записываемых данных.
Модуль объекта можно вызвать из палитры свойств данного объекта, либо из контекстного меню. Структура модуля объекта не отличается от модуля формы. Модуль объекта компилируется на сервере, соответственно директивы компиляции указывать не требуется.
Модуль формы
Модуль формы предназначен для обработки действий пользователя (обработка события нажатия кнопки и т.д.). Так же существуют события связанные непосредственно с самой формой (например событие её открытия, закрытия). Модули управляемых и обычных форм различаются прежде всего тем, что модуль управляемой формы четко разделяется на контекст. Каждая процедура должна иметь директиву компиляции. В обычной форме весь код исполняется на клиенте.
Структура управляемой формы содержит раздел описания переменных, раздел процедур и функций и раздел основной программы (выполняется в момент инициализации формы). К стандартным событиям формы можем обратиться через список процедур и функций (Ctrl+Alt+P) либо в палитре свойств самой формы. Так же в управляемой форме можно обработать событие записи элемента (это событие присутствует только для объектов: справочников, документов).
Модуль менеджера объекта
Модуль менеджера появился только в 1С 8.2,существует у многих объектов конфигурации. Основное предназначение модуля менеджера объекта это переопределить стандартное событие «ОбработкаПолученияДанныхВыбора», а так же в нем можем
Модуль менеджера значений
У объекта конфигурации константы не существует модуля объекта, а существует очень похожий модуль – модуль менеджера значений. В модуле менеджера значения константы можно описать различные процедуры (в том числе и экспортные), а также обработать 3 события: ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения. Этот модуль компилируется на сервере.
Модули наборов записей
Модуль набора записей является аналогом модуля объекта и присущ регистрам. В модуле набора записей существуют стандартные события:
- Перед записью
- При записи
- Обработка проверки заполнения
В модуле набора записей существует раздел описания переменных, процедур и функций (в том числе и экспортных), раздел основной программы.
В чем отличия между сеансом и соединением? Этот, на первый взгляд, простой вопрос на экзамене 1С:Эксперт многих ставит в тупик. Несмотря на немалый опыт программирования, сформулировать четкий и правильный ответ сможет далеко не каждый специалист.
В данной статье проведем детальный разбор этого вопроса. Для начала рассмотрим по отдельности понятия сеанс и соединение в 1С:Предприятие. Отметим, что информация актуальна для версий платформы 8.2.x и 8.3.x.
Сеанс 1С
Обратимся к руководству администратора. В нем понятие сеанса определено следующим образом:
Сеанс определяет активного пользователя информационной базы и поток управления этого пользователя.
Можно сказать, что кластер серверов не видит пользователей, вместо них он видит сеансы и сеансовые данные. В консоли управления кластером в принципе отсутствует раздел «Пользователи», под пользователями кластер понимает сеансы.
Это подтверждает визуальное представление пункта «Сеансы» – иконка отображается в виде пользователей.
Следует уточнить, что под активным пользователем не обязательно понимается клиентское соединение, это также может быть:
Сеансовые данные
Рассмотрим понятие сеансовые данные. Сеанс содержит в себе некоторую информацию, такую как:
- наименование информационной базы
- номер сеанса
- имя аутентифицированного пользователя информационной базы
- язык интерфейса
- значения параметров сеанса
- временные хранилища
- статистику работы сеанса
- информацию форм управляемого приложения
- некоторые внутренние данные платформы
Такая информация называется сеансовыми данными. Причем для каждого активного пользователя сеансовые данные свои, и актуальны они только на время его работы. Если пользователь покидает базу (завершил сеанс) – его сеансовые данные удаляются.
Данные сеансов хранятся на кластере серверов, за это отвечает менеджер кластера, именно для этого существует сервис сеансовых данных. Чтобы ускорить работу, данные сеансов кешируются в рабочих процессах и в толстых клиентах.
При перезапуске кластера серверов данные сеансов будут сохранены. В том случае если активный пользователь не выполнил ни одного обращения к кластеру в течение 20-ти минут и сеанс не назначен соединению, то сеанс удаляется вместе с его данными.
Для поддержания сеанса тонкий клиент и веб-клиент обеспечивают обращение к кластеру не реже 1 раза в 10 минут.
Соединение 1С
Теперь разберемся с понятием соединение. Вновь обратимся к руководству администратора:
Соединение является средством доступа сеансов к кластеру серверов «1С:Предприятие», содержит ограниченное множество данных соединения, не отождествляется с активным пользователем.
Другими словами, с помощью соединения сеанс получает доступ к кластеру. При этом количество соединений ограничено, и как только таковое становится не нужным сеансу, оно возвращается в пул соединений.
В случае если сеанс не обращается к кластеру, то есть пользователь бездействует, ему не будет назначено соединение. Таким образом, сеанс может существовать без соединения.
Нужно отметить, что сеансовые данные хранятся на сервере, поэтому если разрыв соединения длится менее 20 минут, то на сеансе это не отразится, ведь соединение – всего лишь средство доступа.
Также соединения используются для взаимодействия процессов кластера, то есть рабочие процессы (rphost) общаются с менеджером кластера (процесс rmngr) при помощи соединений, а не с помощью сеансов.
Отличия соединения от сеансов
Для того чтобы описать основное отличие данных понятий, приведем аналогию.
Допустим, что сеанс – это пассажир, а соединение – такси. Когда пассажиру необходимо добраться домой (сеансу нужно подключится к серверу), он вызывает такси (сеансу назначается соединение из пула соединений).
Если, добравшись домой, пассажир захочет снова поехать на работу, а такси уже уехало (после подключения случился разрыв соединения), то пассажир вызывает новое такси и едет по своим делам (сеансу назначается новое соединение).
В данной аналогии наглядно представлено, что сеанс и соединение далеко не одно и тоже, и сеанс может довольно легко перенести разрыв соединения.
PDF-версия статьи для участников группы ВКонтакте
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кеш браузера или подписаться через другой браузер.
35 учебных часов, подготовка к 1С:Эксперт, правильная настройка серверной части, оптимизация кода, мониторинг загруженности оборудования и прочие взрослые вещи.
Комментарии / обсуждение (11):
Добрый день.
В управляемом приложении (8.3.16.1224) постоянно есть сеансы за прошлый и более ранние дни. И это несмотря на то, что в параметрах ИБ выставлены значения засыпания пассивного сеанса в 1200 с., а время завершения спящего сеанса 14400 с. В консоли кластера такие сеансы видны как не спящие.
В руководстве администратора есть такая фраза:
“Если компьютер клиента не находится в режиме энергосбережения, и клиентское приложение бездействует (не выполняет никаких действий пользователя), то оно периодически вызывает сервер «1С:Предприятия» с интервалом 5-10 минут для поддержания активности сеанса. Поэтому не рекомендуется устанавливать время засыпания сеанса меньше 10 минут.”
Не является ли это противоречием? Получается, если я настрою время засыпания больше этих “5-10 минут” то сеанс не заснет фактически никогда (что, как мне кажется, и происходит), т.к. будет происходить периодический вызов сервера? Можно ли каким-либо другим образом отключать неактивных пользователей?
Добрый день, Михал!
Спящие сеансы – это сеансы которые завершены пользователем, но сервер 1С их не закрывает (что-бы не создавать повторно). У вас видимо другой случай: клиентские сеансы запущены на рабочих местах пользователей и именно про это пишут в руководстве администратора. Если-бы у ваших клиентов 1С сверх того были открыты динамические списки – они-бы периодически посылали запросы.
Я просмотрел Ваш курс, прочитал в документации, и в некоторых других источниках… Всё равно не до конца понимаю некоторые моменты:
1. Если соединение это средство доступа, тогда почему при удалении соединения из консоли управления кластером, сеанс также удаляется?
2. Соединения между чем и кем создаются? Я всегда думал что между пользователем и рабочим процессом. А Вы пишете “Также соединения используются для взаимодействия процессов кластера, то есть рабочие процессы (rphost) общаются с менеджером кластера (процесс rmngr) при помощи соединений”. Или может быть соединения эти устанавливаются между несколькими источниками?
3. соединение физически это “канал связи” между чем-то и чем-то или, это просто “записи некой таблицы внутри оперативной памяти сервера приложения” с громким названием “Соединения”? Я провёл тест, вынул сетевой провод из сервера, а затем вставил. По логике, соединение (канал связи) должно было тут же оборваться, а оно не оборвалось…
1. При удалении соединения сеанс остается, ему назначается новое соединение.
2. Как я и описал, это так же средство общения между процессами. Не понятно зачем устанавливать соединения между несколькими источниками. У вас есть только 2 процессы которые в момент времени могут между собой общаться.
3. Наверняка это знают только разработчики платформы, в документации такие тонкости не описаны.
1. Теоретически это так и должно быть. Но практика показывает, что если удалить соединение, тогда сеанс тоже удаляется, при этом нового соединения ему автоматически не назначается. Кстати говоря, я ещё раз пересмотрел раздел продвинутого курса Евгения Гилёва, в котором он более кратко описывал работу в клиент-серверном режиме работы платформы, и он тоже показал и заострил внимание на том, если удалить соединение, тогда сеанс тоже удаляется. Но вот почему так происходит, тоже не объяснил. ((
2. Что значит “так же средство общения между процессами”. Разве установив соединение между двумя объектами, система сможет общаться с третьим объектом?
PS: например, я позвонил по телефону своей маме (для этого установил “соединение”), смогу ли я в этом случае одновременно пообщаться с братом, при условии что он находится не в том же месте, где мама?
3. А какие тут тонкости? Я просто хочу понять, что из себя представляет понятие “соединение”.
Определение “Соединение – это средство доступа сеанса, к кластеру серверов” звучит очень размыто. Появляется дополнительный вопрос “что такое СРЕДСТВО ДОСТУПА”? Толи это запись некой таблицы, толи реальный канал связи…
4. А если допустим это запись таблицы, тогда какой в ней смысл, почему не заменить две сущности “сеанс + сединеие” в какое-то одно название. Чтобы небыло двух этих объектов, а был какой-то им аналогичный один объект.
5. А ещё Вы упомянули про некий ПУЛ СОЕДИНЕНИЙ. Что когда соединение больше не нужно, оно возвращается в пул соединений. Получается, что количество соединений ограничено, и находятся все они в этом пуле, и получается, что сначала соединение может быть назначено одному сеансу, затем по ненужности вернуться в пул, а через некоторое время назначиться другому сеансу?
1. Я говорю не про теорию, у меня на практике удаление соединения не приводит к удалению сеанса. Сеансу просто назначается другое соединение.
2. Причем тут 3 объекта. rphost общается с rmngr через соединение, эти соединения мы не видим в консоли.
3-4. Нельзя объединять сеанс и соединение, как минимум потому, что у соединения нет сеансовых данных. Как реализовано соединение в платформе на физическом уровне я не знаю, я не разработчик платформы, да если честно мне это все равно. На настройку кластера и оптимизацию это знание никак не повлияет. Если разработчики сделали 2 сущности, а не одну значит на то были причины, и мы можем либо тратить свое время на догадки почему они сделали именно так, либо просто принять это как есть и разобраться в том как это сейчас работает.
5. Да, все верно.
ОГО, ЧУДЕСА, в тонком клиенте и правда нету удаления сеанса, и назначается новое соединение сеансу.
У нас то просто УПП 1.3. Я все эксперименты из вашего курса и не только как правило делал на ней. А там основной режим работы: толстый клиент, обычное приложение. В обычном приложении почему-то при малейшем обрыве сети, соединение рвётся, сеанс удаляется. Даже если не надолго из сервера вытащить сетевой провод.
Да, толстый клиент работает так. Я и забыл уже что кто-то на толстом клиенте работает :)
В этой статье мы покажем, как взаимодействуют клиентская и серверная части платформы и какие есть особенности в использовании директив компиляции.
Это будет полезно начинающим разработчикам и тем, у кого есть пробелы в области клиент-серверного взаимодействия – всё объясним «на пальцах» :)
Клиент-серверная архитектура заложена в платформе изначально – со времен «1С:Предприятие 8.0».
Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере.
Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере – другой. Клиент и сервер «общаются» между собой с помощью серверного вызова.
Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.
Немного базовой теории
Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:
- Мы подразумеваем, что Вы знаете о существовании четырёх директив компиляции, доступных в модулях формы: «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста».
- Все примеры будут опираться на работу «1С:Предприятие 8» в клиент-серверном режиме. Файловый вариант по сути является эмуляцией клиент-серверного режима, с небольшими отклонениями (для данной статьи это не критично)
- В рамках этого материала рассматривается исключительно взаимодействие клиента и сервера 1С. Работа с базой данных, преобразование данных и прочие нюансы работы системы – это темы других статей.
Далее, освежим в памяти немного теории.
Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.
Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:
Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.
Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:
- &НаКлиенте
- &НаСервере
- &НаСервереБезКонтекста
- &НаКлиентеНаСервереБезКонтекста.
То есть из метода, описанного под директивой «&НаКлиенте», можно вызывать процедуры и функции, описанные под любой директивой. А вот «из-под» директивы «&НаСервереБезКонтекста» можно вызывать только то, что описано под директивой «&НаСервереБезКонтекста» или «&НаКлиентеНаСервереБезКонтекста».
Теперь про серверный вызов
Серверный вызов – это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.
Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:
«Оу! При чём тут Библиотека?!» – спросите Вы.
Всё очень просто:
Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).
Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.
Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:
Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.
Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».
Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.
И в этом нам помогут наши новые друзья, знакомьтесь!
Это процесс клиентской части приложения «1С:Предприятие 8». Он запускается на компьютере пользователя и сожительствует в оперативной памяти с другими процессами (38 вкладок браузера, поток аудио из социальной сети, telegram и другие). Может порождать серверный вызов.
Это процесс серверной части приложения «1С:Предприятие 8». Он существует на сервере 1С. Знает, какие клиентские сеансы в данный момент запущены, но самостоятельно не может инициировать взаимодействие с ними. Работает с клиентской частью только через полученный от неё серверный вызов.
А это серверный вызов. Как было сказано выше, он порождается процессом клиентской части и призван «прислуживать» ему. Он передает запросы со стороны клиента на сторону сервера, а также занимается транспортировкой данных с клиента на сервер и обратно.
Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.
Действие 1. Открытие пользователем формы с данными.
В момент нажатия Пользователем кнопки открытия формы из интерфейса, происходит передача управления на Сервер. По переданным параметрам получаются необходимые для построения данные из БД и происходит формирование контекста формы, который затем отправляется на клиентскую часть. У пользователя на экране отображается запрошенная форма.
Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.
Получение этих данных может быть описано под двумя директивами – «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.
Явление 1. Директива «&НаСервере»
При вызове процедуры или функции под директивой «&НаСервере» из формы со стороны клиента происходит «упаковка» всего контекста формы и отправка его на сторону сервера.
После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.
Явление 2. Директива «&НаСервереБезКонтекста»
При вызове процедуры или функции под директивой «&НаСервереБезКонтекста» из формы со стороны клиента происходит передача на сторону сервера только тех данных, которые были указаны в качестве параметров. Обратно же передаётся только необходимая информация в уже подготовленном виде.
Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.
Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.
Если возможно решить возникшую задачу путём отправки на сервер только определённого набора данных, то надо эту возможность использовать и описывать метод под директивой «&НаСервереБезКонтекста». Это позволит уменьшить нагрузку на серверный вызов, а также не занимать сервер обработкой и хранением ненужной в текущий момент информации.
Кстати, именно поэтому до версии платформы 8.3.7.1759 на сложных формах для управления видимостью элементов рекомендовалось использовать панели со страницами, а не свойство «Видимость». Только начиная с этого релиза отработка изменения видимости элементов стала выполняться на стороне клиента.
До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».
Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.
Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.
Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.
Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».
При таком построении программного кода происходит множественное обращение со стороны клиента на сервер – по количеству элементов цикла, запущенного на стороне клиента.
Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.
Используем всё ту же директиву «&НаСервереБезКонтекста».
В данном случае количество серверных вызовов сведено к минимуму за счёт предварительной подготовки параметров.
Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.
Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.
Если цель серверного вызова, созданного внутри цикла – получить какую-либо информацию из базы данных, то данная операция включает в себя запрос в цикле. А это очень негативно влияет на производительность всей системы в целом.
С директивой «&НаСервереБезКонтекста» вроде бы разобрались. Она нужна для того, чтобы уменьшить объем информации, передаваемой в рамках одного серверного вызова. Дополнительно разобрались с количеством текущих серверных вызовов – необходимо стремиться к их минимизации.
Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».
Действие 4. Выполнение обработки данных.
Когда предполагается выполнение одной и той же обработки данных из нескольких участков программного кода, разумно этот код поместить в самостоятельную процедуру или функцию. Остаётся только решить, под какой директивой её написать.
Та-дам!
Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?
Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.
Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы.
Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».
Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.
Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».
Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.
Конечно, вместо того чтобы выделять повторяющийся программный код, описывать его в отдельном методе под директивой «&НаКлиентеНаСервереБезКонтекста», можно поступить по-другому. Просто взять и написать один и тот же участок кода и в клиентской, и в серверной процедуре.
С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…
Вместо заключения
В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.
Придерживайтесь при разработке следующих правил:
- По возможности не передавайте контекст формы на сторону сервера
- Минимизируйте количество текущих серверных вызовов
- Длительные и ресурсоёмкие задачи запускайте на выполнение на стороне сервера (при возможности – в фоновом режиме).
Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!
Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.
Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.
Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?
Об авторе
Автор статьи – Павел Ванин
PDF-версия статьи для участников группы ВКонтакте
Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.
Комментарии / обсуждение (158):
Всё предельно понятно, спасибо за статью!
Хотелось бы увидеть правильные практические примеры с директивой &НаКлиентеНаСервереБезКонтекста
Добрый день, Ruby!
Много примеров использования директив находится в типовых конфигурациях.
Например, в 1С:УНФ есть вот такая функция под директивой «&НаКлиентеНаСервереБезКонтекста»:
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьЗаголовокНастроек(ТекущийРежим, НовыйЗаголовок)
Результат = “Настройки”;
Если НЕ ТекущийРежим Тогда
Результат = НовыйЗаголовок;
КонецЕсли;
C какой радости “Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.” ? С этой директивой можно сделать с базой все что угодно, если код реально будет выполняться в серверном контексте или в толстом клиенте. В тонком просто синтаксический контроль может не пройти. И что за 5 лет никто этого не заметил? Табличка выше этой цитаты тоже вдохновляет. База недоступна. Дальше читать не стал.
Добрый день, . Хочется вам сказать “Браво!” и поаплодировать! (сарказм)
Вы правы – технологических ограничений на доступ к базе данных при серверном исполнении процедуры или функции под директивой «&НаКлиентеНаСервереБезКонтекста» нет. Можно ли считать этот факт опровержением всей статьи? Я считаю – нет, и давайте поясню почему.
В сути данной директивы заложена возможность исполнения одного и того-же кода как на стороне клиента, так и на стороне сервера. И если мы в ней напишем, например, запрос к базе данных, то при компиляции формы возникнет ошибка. Так как со стороны клиентского экземпляра программного модуля формы доступа к базе данных нет.
Про директиву «&НаКлиентеНаСервереБезКонтекста».
Ваши оговорки про толстый клиент и возможность выполнения запроса к базе данных на сервере (игнорируя ошибки, возникающие при компиляции формы) ничто иное, как исключения из правил. Это все равно, что пассатижами гвозди заколачивать – в принципе возможно, но молотком удобнее.
Примеры про доступ к Access и COM-объектам тоже больше похожи на частный случай. Напомню – в ограничениях статьи (которые вы должны были по-идее прочитать, так как они выше описания директив приведены) указано, что рассматривается клиент-серверный вариант работы системы. А это означает, что доступность ресурсов (файлы, объекты, оборудование, …) со стороны клиента и со стороны сервера может иметь существенные отличия.
P.S.
Давайте поясню причину агрессии в своем предыдущем комментарии. Вы не удосужились прочитать статью, но повесили на нее ярлык «плохой контент». В наше время часто перед тем как читать длинный текст, люди пробегаются по комментариям – понять, стоит ли тратить свое время на материал. Увидев ваш комментарий, кто-то может засомневаться в пользе статьи и уйти со страницы. А мне, как автору материала, хотелось бы принести пользу максимальному количеству людей.
Параметры сеанса в 1С — это переменные, которые доступны в течение всего сеанса пользователя в любом месте конфигурации. Например, в параметрах сеанса можно хранить текущего пользователя, или имя компьютера.
Для примера, создадим параметр сеанса, который назовем ИмяТекущегоКомпьютера., в этом параметре будем хранить имя текущего компьютера. Для этого нужно выделить ветку «Параметры сеанса» в группе «Общие» дерева метаданных, вызвать контекстное меню, и в контекстном меню выполнить команду «Добавить».
В правой части экрана откроется палитра свойств параметра сеанса, где следует указать название, синоним и тип (в моем случае это будет тип Строка).
На всякий случай, проверим, есть ли права у нужной роли на этот параметр сеанса. Посмотреть на роли параметра сеанса можно в окне «Дополнительно». Откроем его: выделим созданный параметр сеанса, вызовем контекстное меню и выполним команду «Дополнительно».
В окне «Дополнительно» интересует закладка «Права», в которой следует проверить флажки у прав Получение и Установка для нужной роли.
Получение – это право на получение значения параметра сеанса;
Установка – это право на установку значения параметра сеанса;
Параметр сеанса создан, теперь необходимо написать алгоритм установки значения в этот параметра сеанса. Делается это в модуле сеанса.
Модуль сеанса в 1С
Модуль сеанса необходим для установки значений параметров сеанса. Мы уже создали единственный параметр сеанса в конфигурации – «Имя текущего компьютера».
Научимся устанавливать значение в этот параметр сеанса при запуске сеанса пользователя. Делается это в модуле сеанса. Откроем его. Модуль сеанса открывается достаточно просто: выделяется самый верхний узел конфигурации, вызывается контекстное меню, в котором необходимо выполнить команду «Открыть модуль сеанса».
Впоследствии откроется модуль сеанса, в котором нас интересует один-единственный обработчик событий «УстановкаПараметровСеанса». Создадим процедуру – обработчик события, для этого после открытия модуля сеанса выполним команду «Процедуры и функции», которая расположена в меню «Текст» главного меню (модуль должен быть активен).
В открывшемся окне нужно выделить единственную процедуру и нажать на кнопку «Перейти».
Будет создана процедура «УстановкаПараметровСеанса»
В этой процедуре параметру сеанса ИмяТекущегоКомпьютера установим имя текущего компьютера.
Проверим, как работает установка параметров сеанса. Для этого создадим обработку, форму обработки, и на управляемой форме обработки создадим реквизит ИмяКомпьютера, который разместим на форме в виде поля надписи.
Следующим шагом, создадим событие формы обработки ПриСозданииНаСервере, и в этом событии реквизиту формы обработки будем присваивать значение параметра сеанса.
Осталось проверить работу обработки.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
Читайте также: