какие директивы компиляции могут быть в модуле формы управляемые формы
Директивы компиляции
Директивы компиляции — это директивы которые определяют в какой среде будут исполнятся процедуры и функции модулей форм, модуля команды и общего модуля управляемого приложения.
Перед определением директивы ставится «&».
Если директива отсутствует используется директива по умолчанию — &НаСервере.
Использование нескольких директив вместе невозможно.
Допустимые директивы:
&НаКлиенте (&AtClient)
Определяет выполнение процедуры (функции) на клиенте;
Используется на клиенте, доступны процедуры модуля и доступны данные форм.
&НаСервере (&AtServer)
Определяет выполнение процедуры (функции) на сервере;
Выполняется на серверном приложении. В таких процедурах доступны данные формы, доступен серверный контекст формы и вызовы серверных процедур модуля. Данные формы передаются с клиента на сервер и обратно по окончанию вызова.
&НаСервереБезКонтекста (&AtServerNoContext)
Определяет выполнение процедуры (функции) на сервере вне контекста формы. В данном случае не будут доступен контекст формы и ее данные. Позволяет вызывать только внекотекстные процедуры и функции и не позволяет выполнять передачу данных между клиентом и сервером. Данный метод позволяет существенно снизить объем передоваемой информации.
&НаКлиентеНаСервереБезКонтекста (&AtClientAtServerNoContext)
определяет выполнение процедуры (функции) на сервере и на клиенте, не имеющую доступа к данным формы, переменным. В данном методе имеется доступ к процедурам и функциям клиентских и серверных одновременно.
&НаКлиентеНаСервере (&AtClientAtServer)
определяет выполнение процедуры (функции) на сервере и на клиенте. В данном методе имеется доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным.
Инструкции препроцессора в 1С 8.3
Препроцессор
Препроцессор обрабатывает исходный код на встроенном языке до его компиляции. Препроцессор может обрабатывать только инструкции препроцессора, которые начинаются с символа решетка «#». В результате работы препроцессора, какие-то куски кода могут отсутствовать в скомпилированном модуле.
С помощью инструкций препроцессора можно указать где именно будет выполняться код на встроенном языке: на сервере, на клиенте, в вебклиенте и т.д.
Часть кода расположенная между #Если ВебКлиент Тогда и #КонецЕсли будет отсутствовать в данной процедуре при выполнении не в веб клиенте 1С.
Данный кусок кода будет присутствовать в скомпилированном модуле только при выполнении на сервере, в режиме обычного приложения или при подключении через COM (внешнее соединение).
У каждой инструкции препроцессора обязательно должен быть завершающий оператор #КонецЕсли. Если его не указать, то будет ошибка компиляции «Ожидается завершение оператора препроцессора Если (If)»:
Процесс выполнения кода на встроенном языке 1с:
При этом один и тот же модуль может быть скомпилирован как на сервере, так и на клиенте. С помощью инструкций препроцессора можно указать должен ли присутствовать в скомпилированном модуле тот или кусок кода.
Инструкции препроцессора
Возможные варианты инструкций препроцессора:
Клиент и НаКлиенте — одно и то же. Сервер и НаСервере — одно и то же.
Также есть инструкции для выделения областей в модуле и для директивы «Изменение и контроль» в расширениях. В данной статье они не будут рассмотрены.
Инструкции препроцессора и директивы компиляции
Директивы компиляции используются в модулях форм и команд. Они определяют где будет скомпилирована процедура: на клиенте или на сервере. Директивы компиляции начинаются с символа &.
Сначала выполняются инструкции препроцессора, а уже потом определяются директивы компиляции. Например:
Данный кусок кода будет присутствовать в серверном модуле формы, но не будет скомпилирован. В клиентском модуле формы его даже не будет.
Часто инструкции препроцессора по ошибке называют директивы препроцессора. Но правильно все-таки инструкции препроцессора.
Исполнение процедур и функций
В файловой базе данных инструкции препроцессора будут игнорироваться, куски кода не будут вырезаны при компиляции.
В клиент-серверном варианте экземпляры общих модулей создаются как на сервере, так и на клиенте. Если в модуле есть #Если Сервер Тогда … #КонецЕсли, то кусок кода между ними будет только на сервере. Если обратиться к процедуре в этом куске кода на клиенте, то вызов будет перенаправлен на сервер, потому что на клиенте не будет этой процедуры. Если между #Если Сервер Тогда … #КонецЕсли находится только часть процедуры, то она будет присутствовать только на сервере, и тогда вызов этой процедуры на сервере будет отличаться от вызова на клиенте.
Если в модуле есть #Если ТонкийКлиент (или толстый) Тогда … #КонецЕсли, то этот кусок будет только на клиенте. Если там была процедура, то к ней нельзя будет обращаться на сервере, потому что нельзя с сервера вызывать клиента.
В типовых конфигурациях можно часто встретить конструкцию:
Модуль формы в 1С 8.3
Модуль формы
Модуль формы выполняется при создании или открытии формы. В модуле формы может быть тело модуля, раздел описания переменных и процедуры и функции. Процедуры и функции могут быть экспортными, тогда их можно вызывать через программный объект «Форма».
Чтобы открыть модуль формы нужно сначала создать форму. Для этого в окне редактирования свойств объекта нужно перейти на закладку «Формы» и в поле «Элемента» нажать на кнопку с лупой:
Откроется конструктор формы. В нем можно выбрать тип формы, указать имя и синоним:
Оставим в конструкторе все без изменений и нажмем кнопку «Готово».
Откроется редактор формы. Для открытия модуля формы нужно внизу выбрать закладку «Модуль»:
Добавим в модуль формы код:
Сохраним конфигурацию базы данных, откроем конфигурацию в пользовательском режиме и создадим новый элемент справочника «Номенклатура». Внизу формы мы увидим два сообщения:
Почему сообщение вывелось дважды? Дело в том, что форма одновременно существует и на клиенте на сервере, поэтому модуль был скомпилирован дважды.
Директивы компиляции
Для того чтобы определить где будет выполняться процедура или функция модуля формы можно использовать директивы компиляции:
Что такое контекст будет рассмотрено позже, пока можно сказать, что это доступность реквизитов, элементов и параметров формы.
Добавим в модуль формы две процедуры:
С помощью директив компиляции вверху процедуры мы указали где они будут скомпилированы. Клиентские процедуры недоступны на сервере. Серверные процедуры можно вызывать с клиента. Если директива компиляции не указана, то по умолчанию используется &НаСервере.
Для переменных модуля тоже можно использовать директивы компиляции:
При этом нужно учитывать, что серверная переменная формы будет инициализироваться при каждом вызове сервера. То есть если мы вызовем с клиента серверную процедуру, в ней изменим серверную переменную, то при следующем серверном вызове значение переменной будет инициализироваться заново, предыдущее значение будет потеряно.
Обработчики событий модуля формы
В модуле формы тоже есть события, для которых можно создавать обработчики:
У обработчиков событий формы нельзя изменить директиву компиляции. Часть из них доступны на клиенте, часть на сервере.
Рассмотрим основные из них:
ПриЧтенииНаСервере — выполняется только для уже существующих в базе данных объектов, есть параметр ТекущийОбъект, через который доступен прикладной объект, можно вызывать его экспортные методы из модуля объекта. Директива компиляции &НаСервере.
ПриСозданииНаСервере — выполняется как для существующих, так и для новых объектов. Если установить параметр Отказ = Истина, то форма не будет создана и не будет открыта. Директива компиляции &НаСервере.
ПриОткрытии — выполняется при непосредственном открытии формы, можно отказаться от открытия, установив параметр Отказ = Истина. Директива компиляции &НаКлиенте.
ПередЗакрытием — выполняется до закрытия формы. Можно отказаться от закрытия, установив параметр Отказ = Истина. Директива компиляции &НаКлиенте.
ПриЗакрытии — выполняется после закрытия формы, уже нельзя отказаться от закрытия формы. Директива компиляции &НаКлиенте.
Для примера добавим в модуль формы 2 обработки событий: ПриСозданииНаСервере и ПередЗакрытием и добавим туда следующий код:
Директивы выполнения кода в модулях управляемых форм 1С 8.3
С появлением управляемых форм в модулях форм 1С 8.3 стали активно использоваться директивы компиляции в модулях форм и объектов:
Дальше речь пойдет о том, как правильно ими пользоваться и как с их помощью можно оптимизировать работу системы.
Необходимо понимать, как работают управляемые формы в тонком режиме, проще всего представить эту модель в виде веб-сайта: сервер отдельно, клиент отдельно. В момент обращения к форме клиент делает обращение к серверу, и вся работа выполняется на сервере. Клиент (Ваша машина) лишь получает результат работы сервера.
Обратите внимание! Если директива не указана, то по умолчанию она выполняется на сервере.
Особенности компиляции этих директив управляемого приложения
&НаКлиенте
Указывает на то, что процедура или функция выполняется на стороне клиента 1C, все переменные существуют лишь на время жизни клиентской части формы. Такой метод выполняется «у Вас на компьютере», никак не затрагивая серверную часть. С клиента доступны все серверные функции.
На клиенте есть доступ к следующим объектам:
&НаСервере
Выполняется на сервере, переменные существуют только на время серверного вызова. С сервера допустим вызов практически любых процедур, кроме клиентских. Если работа происходит в режиме тонкого клиента, вся работа происходит на сервере, а клиент получает лишь результат выполнения.
&НаСервереБезКонтекста
Это процедура выполняется на сервере, вне контекста формы. Т.е. процедура не имеет доступа к реквизитам формы, выполняется на сервере и возвращает желаемый результат. Хорошо подходит для получения статичных данных. Крайне рекомендуется к использованию для оптимизации клиент-серверного взаимодействия.
&НаКлиентеНаСервереБезКонтекста
Используется, когда к процедуре нужно обращаться и с клиента, и с сервера. В остальном аналог &НаСервереБезКонтекста.
Оптимизация клиент-серверного взаимодействия
При разработке функционала необходимо учитывать следующие нехитрые правила:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
Исполнение кода в модуле формы при разработке в 1С 8.2
Внимание. По какой то причине статья не отображается в IE. Поэтому, тем кто не может просмотреть статью на сайте, рекомендую скачать doc-файл.
До перехода на новую платформу 1С 8.2, я, признаться, даже не задумывался, где именно исполняется написанный в модуле формы код – на клиенте или на сервере. Писал код, «как получится». Субъективно, в 1С 8.1 этому не придавалось значения. Объективно, конечно, в книгах давались рекомендации по оптимизации кода, но, как это часто в жизни бывает – я думал, зачем соблюдать какие-то правила, когда можно обойтись без них и получить рабочий результат? Оптимальность кода становилась актуальной, только когда в системе появлялись серьезные «затыки» и приходилось разбираться «отчего так получилось?». И «тяжелое» место в коде было не всегда очевидно. Пляски с бубном, замеры производительности, детальный разбор узких мест…
Теперь в 1С 8.2 применяется новый подход к программированию форм. Благодаря этому многое разложилось по полочкам, но чтобы окончательно во всем разобраться, пришлось потратить какое-то время и перестроить мозги на работу в логике клиент-серверного взаимодействия. Причем все оказалось несколько сложнее, чем казалось первоначально (как всегда).
Пока не разобрался в теории, постоянно допускал ошибки на практике и задавался вопросом «почему не работает?».
Итак, немного ликбеза. Прежде всего, что такое форма? Нужно понимать, что это программный объект, который создается в процессе работы прикладного решения и состоит из двух взаимодействующих частей. Каждая часть выполняется в своем контексте: в контексте сервера или в контексте клиента. Контекст в новой платформе определяет не только программное окружение, в котором выполняется код, но и физическое место, где будет исполняться код (сервер или клиент). Таким образом, разработчик явно программирует отдельно клиентскую и серверную части приложения.
Прежде всего, нужно отметить то, что структура кода определяется не логикой решаемой задачи, а логикой клиент-серверного взаимодействия. Клиентский код пишется как сценарий передачи управления с клиента на сервер и обратно, а не как последовательность действий к исполнению. Для организации такого сценария предназначены директивы компиляции:
&НаСервере
&НаКлиенте
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
Код, реализующий бизнес-логику должен быть отделен от кода реализующего интерфейс. Нужно понимать, что форма существует одновременно и на клиенте и на сервере, но каждый из них «видит» только свою часть со всеми вытекающими последствиями. По этой причине все процедуры и функции, создаваемые в модуле формы, должны иметь явное указание на то, в каком контексте они будут исполняться. Например, директива компиляции и процедура могут выглядеть следующим образом:
Процедуры или функции исполняемые в контексте клиента называют клиентскими, соответственно исполняемые в контексте серверной части называют серверными. Из клиентских процедур и функций можно вызывать серверные, когда они будут выполнены, исполнение кода вернется на клиент. Тут важно отметить, что принудительно вернуть исполнение кода на клиент не получится, т.е. из серверных процедур и функций вызвать клиентские – нельзя.
&НаСервере
Указывает на то, что процедура или функция исполняется в контексте серверного приложения. Её используют для всех обработчиков серверных событий формы, а также для собственных процедур и функций, которые определит разработчик, чтобы передать выполнение кода на сервер. Такие процедуры и функции упрощенно называют серверными процедурами формы. Разработчик должен управлять частотой вызовов сервера. В идеале, нужно стремиться к тому, чтобы их количество было минимально, т.к. при каждом вызове система «гоняет» туда-сюда данные.
&НаКлиенте
Директива указывает на то, что процедура или функция исполняется в контексте клиентского приложения и ей будет доступен весь контекст формы – реквизиты, элементы и параметры формы. Но к элементам базы данных обратится не получится, т.е. код
работать не будет. Правильно будет сделать вызов серверной функции, которая вернет значение:
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
Данная директива определяет, что процедура или функция может исполняться как в контексте клиента, так и в контексте сервера. Когда такое может понадобиться при разработке? Скорее всего тогда, когда нужно выполнить одинаковые действия в обеих частях приложения. Чтобы не создавать две одинаковые процедуры с разными директивами – можно сделать одну, с директивой &НаКлиентеНаСервереБезКонтекста.