После написания программы на встроенном языке 1С она сохраняется в конфигурацию в составе модуля. При запуске 1С в режиме 1С Предприятие программа на языке 1С будет выполнена.
Сначала немного терминов:
- Препроцессор — специальная программа, которая перерабатывает программный код из «вида» удобного для работы программиста, в «вид», удобный для работы копилятора;
- Компилятор — специальная программа, которая умеет перерабатывать программный код в «машинный» код — выполняемый непосредственно процессором компьютера;
- Интерпретатор — специальная программа, которая вместо компилирования кода в машинный код для процессора, выполняет его самостоятельно. Интерпретатор с предварительной компиляцией — компилирует программу не в машинный код, а в специальный «байт-код» удобный для последующего выполнения интерпретатором.
Как выполняются программы написанные на встроенном языке 1С?
Программа на языке 1С перед выполнением компилируется – преобразовывается в специальный код.
Выполнение кода на языке 1С производится в три этапа:
- Обработка модулей препроцессором 1С согласно директив препроцессора 1С
- Компиляция в байт-код
- Исполнение
Компиляция производится отдельно на клиенте и отдельно на сервере (даже одного и того же модуля), при первом обращении к нему.
Компилятор 1С на входе получает модуль не в том виде, в каком его видит программист. Препроцессор 1С разрезает модуль на части (вырезая не нужное) и потом соединяет его.
Директива препроцессора 1С — это способ указать препроцессору 1С где будет выполняться указанный участок кода на языке 1С.
Это связано с тем, что выполнение текста программы производится на сервере и на клиенте. Есть функции и процедуры, которые не могут быть выполнены на сервере/клиенте. Например на сервере Вы не можете показать пользователю предупреждение с необходимостью нажатия кнопки ОК.
Поэтому в модуле указывается где должен выполняться код:
- Общий модуль (ветка Общие/Общие модули) – в свойствах модуля указывается может ли он выполняться на сервере и на клиенте
- В остальных модулях – для этого используются директива препроцессора 1С.
Препроцессор 1С
Непосредственно в тексте модуля, блоки программного кода, отмечаются директивы препроцессора 1С:
Функция Пример1() //будет выполнена и на клиенте и на сервере
КонецФункции
#Если Сервер Тогда //будет выполнена только на сервере
Процедура Пример2()
КонецПроцедуры
#КонецЕсли
#Если Клиент Тогда //будет выполнена на [любом] клиенте
Процедура Пример3()
КонецПроцедуры
#КонецЕсли
Если никаких инструкций препроцессору 1С в тексте не указано, и использована функция, которую нельзя выполнять на сервере/клиенте, то в момент компилирования модуля (при первом доступе к нему) в исполняемом режиме будет вызвана ошибка.
«Обертывать» можно не только функции, но и конкретные строки исполняемого кода.
Так как компиляция 1С на данный момент еще не началась, то можно с помощью таких блоков создавать функции с одинаковыми наименованиями (для сервера, для клиента).
Есть разница между «функция есть на сервере» и «функцию можно вызывать на сервере». Во втором случае функция «видна» с клиента и может быть вызвана. В первом – не видна на клиенте и может быть вызвана только из другой функции, выполняемой на сервере. Поэтому есть инструкция #Сервер (доступен вызов с клиенте) и #НаСервере (видна только на сервере), и аналогично для клиента.
В модуле управляемой формы инструкции препроцессору 1С рекомендуется использовать только внутри функций/процедур.
Исполнение
После того, как препроцессор 1С «склеил» модуль, он передает его компилятору 1С, который его компилирует. Далее в режиме исполнения код будет выполнен.
При выполнении кода одного модуля, [может] происходит разовое/множественное переключения выполнения с клиента на сервер и обратно.
Например, если требуется выполнить запрос к базе данных, то выполнение будет переключено на сервер, выполнен запрос, данные переданы на клиент. Таким образом модуль существует на сервере и на клиенте.
Переключение исполнения с клиента на сервер и обратно производится «автоматически».
По умолчанию толстый клиент выполняет весь код на клиенте и иногда вызывает сервер. Тонкий клиент наоборот – все выполняет на сервере и иногда вызывает клиент (хотя в любом случае инициализация первого вызова сервера производится клиентом).
Программист в получившемся «склеенном» модуле может для каждой функции указать, где ее требуется исполнять. Не забываем, что доступ к данным производится на сервере, а инициализация вызова на клиенте. Например:
&НаСервере
Функция ПолучитьДанныеБазыДанных()
Запрос = Новый Запрос("");
КонецФункции
&НаКлиенте
Процедура ОбработчикНажатияКнопки()
ПолучитьДанныеБазыДанных();
КонецПроцедуры
Ранее, в толстом клиенте, форма создавалась и была доступна только на клиенте (если не передать ее параметром на сервер, конечно). Управляемая форма создается на сервере и может обрабатываться на клиенте и на сервере.
Поэтому, при выполнении функций модуля, при переключении выполнения с клиента на сервер и обратно, передаются кроме прочего все данные формы (называется «контекст»).
Данных может быть много и передаваться они будут «долго». А в вызываемой функции они могут быть и не нужны, она их не использует вовсе. Для таких случаев есть директива &НаСервереБезКонтекста.
Справочник директив препроцессора 1С
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.