Исполнение процедур и функций

В варианте клиент-сервер
В файл–серверном варианте
В сессии СОМ-соединения
В тонком клиенте
В веб-клиенте

Настройка использования кода в различных режимах запуска осуществляется с помощью инструкций препроцессора.

В варианте клиент-сервер

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

Для выполнения на сервере:

#Если Сервер Тогда

#КонецЕсли

Для выполнения на клиентском месте:

#Если ТолстыйКлиентОбычноеПриложение Тогда

#КонецЕсли

#Если ТолстыйКлиентУправляемоеПриложение Тогда

#КонецЕсли

#Если ТонкийКлиент Тогда

#КонецЕсли

Для того, чтобы процедура присутствовала и была вызвана на стороне сервера, фрагмент кода должен выглядеть следующим образом:

#Если Сервер Тогда
Процедура Проц1() Экспорт

КонецПроцедуры
#КонецЕсли

Важно! В приведенном тексте ВСЯ процедура, а не ее часть находится внутри блока #Если Сервер Тогда … #КонецЕсли.
При запуске конфигурации на выполнение производится загрузка и компиляция конфигурации. Экземпляры всех общих модулей создаются как на серверной, так и на клиентской стороне. Если в каком-то из общих модулей содержится приведенный фрагмент кода, то он в соответствии с инструкцией препроцессора #Если Сервер Тогда … #КонецЕсли будет скомпилирован только на стороне сервера, а на стороне клиента данный фрагмент «выпадет» из компилируемого текста и, таким образом, процедура на стороне клиента не будет представлена совсем.

Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер 1С:Предприятия.

Если блок #Если Сервер Тогда … #КонецЕсли включает только часть процедуры, то процедура будет присутствовать как на стороне клиента, так и на стороне сервера. Только на клиентской стороне она будет без той части, которая заключена в блок, поэтому результат выполнения процедуры может зависеть от того, где обрабатывается вызов этой процедуры.

Для правильного понимания ситуации в случае использования клиент–серверного варианта информационной базы важным понятием является «экземпляр модуля». Экземпляр модуля содержит скомпилированный код модуля, значения глобальных переменных модуля и т. п. Экземпляры всех общих модулей создаются как на стороне клиента, так и на стороне сервера. Экземпляры модулей таких объектов, как документы или элементы справочников, существуют при своих объектах и могут появляться как на клиентской, так и на серверной стороне, в зависимости от того, где создается тот или иной объект.

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

Предположим, что модуль некоторого объекта, например документа Д, содержит обращение к процедуре П(), определенной в одном из общих модулей. При этом «вокруг» процедуры П() нет никаких операторов препроцессора. В этом случае процедура П() будет содержаться как в экземпляре общего модуля на клиентской стороне, так и в экземпляре общего модуля на серверной стороне. Таким образом, модуль документа, созданного на стороне клиента будет обращаться к процедуре П() из общего модуля на стороне клиента, а модуль документа, созданного на стороне сервера будет обращаться к процедуре общего модуля на стороне сервера.
Теперь предположим, что процедура П() заключена в блок #Если Сервер Тогда … #КонецЕсли. В этом случае экземпляр общего модуля на клиентской стороне не будет содержать процедуру П() и все обращения к ней как со стороны клиента, так и со стороны сервера всегда будет разрешаться за счет экземпляра общего модуля на серверной стороне. То есть все вызовы процедуры П() всегда будут обрабатываться на сервере.

А теперь предположим, что процедура П() заключена в блок #Если ТолстыйКлиентУправляемоеПриложение Тогда … #КонецЕсли. В этом случае экземпляр общего модуля на стороне сервера не будет содержать процедуру П() и обращение к ней будет возможно только на стороне клиента. А экземпляр модуля, содержащий обращение к процедуре П() не сможет быть создан на стороне сервера, так как вызовы клиентских процедур с сервера не поддерживаются и обращение к процедуре П() на серверной стороне останется неразрешенным.

В файловом варианте все намного проще, а именно, клиентская и серверная сторона считаются "слившимися". При компиляции всех модулей Сервер, ТонкийКлиент, ТолстыйКлиентУправляемоеПриложение и ТолстыйКлиентОбычноеПриложение считаются определенными и фрагменты кода, находящиеся внутри блоков #Если Сервер Тогда … #КонецЕсли и #Если ТолстыйКлиентОбычноеПриложение Тогда … #КонецЕсли не будут "вырезаться" при компиляции модулей.

В файл–серверном варианте

В файловом варианте инструкции препроцессора #Если Сервер… или #Если Клиент… пропускаются, поэтому экземпляр кода будет присутствовать всегда.

В сессии СОМ-соединения

Для включения возможности использования процедур и функций в сессии внешнего соединения применяется инструкция препроцессора

#Если ВнешнееСоединение Тогда

#КонецЕсли

В тонком клиенте

Для включения возможности использования процедур и функций в тонком клиенте применяется инструкция препроцессора

#Если ТонкийКлиент Тогда

#КонецЕсли

В веб-клиенте

Для включения возможности использования процедур и функций в веб-клиенте применяется инструкция препроцессора

#Если ВебКлиент Тогда

#КонецЕсли

1C:Enterprise Developer's Community