Использование встроенного языка на сервере 1С:Предприятия

Для вызова встроенного языка на сервере 1С:Предприятия используются общие модули.

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

Для регулирования расположения процедур используются свойства общих модулей и инструкции препроцессора (#Если).

В демонстрационной конфигурации "Примеры ИТС" приведен пример вызова процедуры на сервере 1С:Предприятия. Для этого используется общий модуль ВыполнениеОперацийНаСервере. У него установлено свойство "Сервер" и не установлено свойство "Клиент". Поэтому процедуры этого модуля не будут располагаться на клиенте, и их вызов будет приводить к переходу управления на сервер 1С:Предприятия.

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

Свойства модулей регулируют расположение процедур в целом для модуля. Оно также может регулироваться и для отдельных процедур инструкциями препроцессора.

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

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

Следует учитывать, что на сервере используется только определенное подмножество типов данных 1С:Предприятия. У некоторых типов при работе на сервере не доступны некоторые свойства и методы. В основном это касается интерфейсных возможностей. На сервере недоступны все механизмы, отвечающие за интерфейс. В документации для типов данных, а также отдельных свойств и методов указывается возможность использования на сервере 1С:Предприятия. Из всех интерфейсных возможностей на сервере доступен только вызов метода Сообщить()

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

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

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

Кроме задач повышения производительности, выполнение встроенного языка на сервере 1С:Предприятия может использоваться для решения вопросов ограничения прав доступа. Для этого используется свойство общего модуля Привилегированный.

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

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