Использование встроенного языка на сервере 1С:Предприятия
Для вызова встроенного языка на сервере 1С:Предприятия используются общие модули.
Чтобы управление перешло на сервер, необходимо вызвать процедуру или функцию общего модуля, которая будет располагаться на сервере, и не будет располагаться на клиенте. Только в этом случае управление перейдет на сервер и будет возвращено на клиента после выполнения процедуры или функции.
Для регулирования расположения процедур используются свойства общих модулей и инструкции препроцессора ( #Если ).
В демонстрационной конфигурации "Примеры ИТС" приведен пример вызова процедуры на сервере 1С:Предприятия. Для этого используется общий модуль ВыполнениеОперацийНаСервере. У него установлено свойство "Сервер" и не установлено свойство "Клиент". Поэтому процедуры этого модуля не будут располагаться на клиенте, и их вызов будет приводить к переходу управления на сервер 1С:Предприятия.
В общем модуле ВыполнениеОперацийНаСервере располагается процедура ПровестиДокументыНаСервере() , которая выполняет перепроведение всех документов указанного вида на сервере. Для вызова этой процедуры используется обработка ОбработкаДокументов() . При вызове данной процедуры в клиент-серверном варианте, так как она располагается только на сервере, выполнятся переход управления на сервер. На сервере выполняется данная процедура и после ее выполнения управление возвращается вызывающей процедуре на клиенте.
Свойства модулей регулируют расположение процедур в целом для модуля. Оно также может регулироваться и для отдельных процедур инструкциями препроцессора.
Инструкции могут располагаться и в модулях объектов и наборов записей. Однако там они могут только влиять на то, будет данный участок модуля использоваться на сервере или на клиенте соответственно. Переход управления на сервер может выполняться только при вызове процедур общего модуля.
Если процедура общего модуля располагается и на клиенте и на сервере, то фактически она может использоваться и клиентскими и серверными процедурами, но переход управления на сервер при ее вызове производиться не будет.
Следует учитывать, что на сервере используется только определенное подмножество типов данных 1С:Предприятия. У некоторых типов при работе на сервере не доступны некоторые свойства и методы. В основном это касается интерфейсных возможностей. На сервере недоступны все механизмы, отвечающие за интерфейс. В документации для типов данных, а также отдельных свойств и методов указывается возможность использования на сервере 1С:Предприятия. Из всех интерфейсных возможностей на сервере доступен только вызов метода Сообщить() .
Если предполагается, что какой-то модуль будет использоваться на сервере, то необходимо в нем обеспечить отключение с помощью инструкций препроцессора "#Если" участков, содержащих обращение к недоступным на сервере механизмам. При этом следует учитывать, что если некоторый объект или набор записей используется на сервере, то его модуль будет компилироваться на сервере и соответственно регулировать использование различных участков модуля необходимо независимо от того, предполагается ли вызывать конкретную процедуру на сервере.
Кроме того, следует учитывать, что если при вызове процедуры общего модуля происходит передача управления на сервер, то существуют достаточно жесткие ограничения на типы передаваемых параметров и возвращаемых значений функций. Для передачи параметров и возврата значений могут использоваться типы, имеющие немутабельные значения (то есть значения которых не могут изменяться). Например, это примитивные типы, ссылки на объекты базы данных, значения системных перечислений, хранилище значения. Кроме того, могут использоваться коллекции Структура, Соответствие, ТаблицаЗначений, Массив . На содержимое коллекций накладываются точно такие же ограничения. Для передачи значений также может использоваться результат запроса.
В описанном примере выигрыш от переноса выполнения на сервер 1С:Предприятия с точки зрения производительности может ожидаться за счет сокращения передачи информации между клиентом и сервером и за счет использования более мощного компьютера для выполнения массовой операции. Однако следует учитывать, что целесообразность такого решения нужно оценивать по многим факторам. Не всегда выигрыш по производительности будет существенным, например, если собственно затраты на передачу данных в локальной сети небольшие, а основная часть времени тратится на выполнение операций сервером баз данных. Кроме того, необходимо принимать во внимание, что такое решение увеличивает нагрузку на сервер, который является разделяемым ресурсом. Поэтому на практике можно рекомендовать провести эксперимент в условиях приближенных к реальным, чтобы оценить насколько данное решение повысит эффективность работы системы.
Кроме задач повышения производительности, выполнение встроенного языка на сервере 1С:Предприятия может использоваться для решения вопросов ограничения прав доступа. Для этого используется свойство общего модуля Привилегированный.
В конфигурации "Примеры ИТС" приведен пример, в котором для роли Кладовщик полностью запрещен доступ к регистру УчетНоменклатуры. Однако для того чтобы кладовщик мог вводить и проводить приходные накладные, в модуле документа при проведении выполняется вызов процедуры СформироватьДвиженияПриходнойНакладной() из общего модуля ВыполнениеОперацийНаСервере, в которой и выполняется запись движений по документу. Для этого модуля установлено свойство Привилегированный. Поэтому в нем не выполняется проверка прав доступа. Соответственно, не имея доступа даже на чтение к регистру УчетНоменклатуры кладовщик может выполнить проведение документа ПриходнаяНакладная и изменения в регистре будут выполняться только в соответствии с алгоритмом реализованном в общем модуле. Даже если разрешить кладовщику выполнение произвольных внешних обработок, то он не сможет выполнить с регистром никаких действий, кроме предусмотренных в этом модуле. В данном примере для документа ПриходнаяНакладная в свойствах метаданных отключено автоматическое удаление движений. Это необходимо, чтобы проведение документа, вызываемое на клиенте, не обращалось бы к регистру. Соответственно, в модуле документа реализовано удаление движений в процедуре ОбработкаУдаленияПроведения() . Так как удаление движений будет вызываться на клиенте, то это действие пользователь с ролью Кладовщик выполнить не сможет.
Возможность получения на клиенте результата запроса, выполненного на сервере 1С:Предприятия, позволяет также реализовать предоставление сотруднику строго ограниченной информации, отобранной по необходимым критериям по тем данным, к которым у него запрещен доступ.
Вызов клиентской процедуры из серверной в общем модуле
(6) Эта операция должна выполняться периодически, поэтому и сначала решил использовать регл. задания, пока не понял, что они работают только с серверными процедурами.
Похоже, придется решить проблему через виндовый диспетчер заданий, другого пути не вижу.
В общем модуле доступны только две директивы компиляции &НаКлиенте и &НаСервере. Общие директивы для общих модулей не определены.
Вариант следующий:
* общий модуль должен иметь признаки "Клиент (управляемое приложение)", "Сервер", "Вызов сервера".
* в этом общем модуле 3 метода — первый без директивы компиляции, второй с директивой &НаКлиенте, третий с директивой &НаСервере.
Таким образом имеем один метод (первый) как для серверного, так и для клиентского исполнения.
В общем случае достаточно не указывать директивы компиляции в общем методе, и нет необходимости писать заглушки с директивами копиляции. "Вызов сервера" у модуля тоже не особенно нужен.
Разницу поведения потрохов первого метода на клиенте и на сервере можно организовать через инструкции препроцессора.
Проверено для форм, для регл.заданий тестируй сам.
В общем, наиболее лучшим решением для себя я нашел следующее:
1. Создаю внешнюю обработку, в событии открытия формы которой добавляю строку кода запуска необходимой мне процедуры, которая выполняется НаКлиенте в общем модуле. После этого обработка закрывает 1С.
2. Создаю регламентное задание, в котором указываю запуск требуемой базы 1С с обязательным параметром Execute, в котором указываю путь к моей внешней обработке.
(11) ПодключитьОбработчикОжидания — этот способ не подойдет мне по той причине, что постоянно д.б. запущен сеанс 1С.
П.с. База работает в клиент-серверном режиме.
(15) — описанная последовательность действий.
Я создал общий модуль, проставил для него галки Клиент, Сервер, ВызовСервера, создал в нем 3 процедуры: Процедура1 без какой-либо директивы компиляции, Процедура2 с директивой компиляции НаСервере и Процедура3 с директивой компиляции НаКлиенте.
Далее создаю регламентное задание, указываю для запуска Процедура2.
Процедура2 вызывает Процедура1, а та, в свою очередь, должна вызвать Процедура3, но этого не происходит, т.к. Процедура1 не видит Процедура3.
Если я понял (12), то предполагалась именно такая последовательность, разве не так?
1С создание общего модуля на сервере и клиенте, вызов процедуры
Общие модули дают возможность запустить процедуру или функцию из любого другого участка программного кода в программе, что помогает значительно сократить объем программного кода в целом.
После наименований процедур и функций, должно стоять слово Экспорт (листинг 1). Экспорт означает, что данная процедура будет доступна извне.
Создание общего модуля, исполняемого на сервере:
- Дерево метаданных: Общие -> Общие модули -> Правой кнопкой мыши — > Добавить;
- Отметить флажки:
- Сервер;
- Внешнее соединение;
Рис. 1 — модуль на сервере
Создание общего модуля исполняемого на клиенте:
- Создаем по аналогии с сервером, за исключением свойств (рис. 2)
Рис. 2 — модуль на клиенте
Пример функции общего модуля:
В качестве входящих параметров принимаем значения двух чисел, затем складываем их и возвращаем результат.