Как с сервера вызвать клиентскую процедуру 1с

Обновлено: 04.07.2024

(6) Эта операция должна выполняться периодически, поэтому и сначала решил использовать регл. задания, пока не понял, что они работают только с серверными процедурами.

Похоже, придется решить проблему через виндовый диспетчер заданий, другого пути не вижу.

(8) нет, не получится - моя функция должна запускать другую, типовую клиентскую.
(9) Так типовую переделай.
Не обязательно переделывать именно эту типовую ф-ю.
Можно ведь свою наваять. Точно такую же, только она будет делаться на сервере и сделать так, чтобы при обновлении она тоже "обновилась".

В общем модуле доступны только две директивы компиляции &НаКлиенте и &НаСервере. Общие директивы для общих модулей не определены.
Вариант следующий:
* общий модуль должен иметь признаки "Клиент (управляемое приложение)", "Сервер", "Вызов сервера".
* в этом общем модуле 3 метода - первый без директивы компиляции, второй с директивой &НаКлиенте, третий с директивой &НаСервере.
Таким образом имеем один метод (первый) как для серверного, так и для клиентского исполнения.
В общем случае достаточно не указывать директивы компиляции в общем методе, и нет необходимости писать заглушки с директивами копиляции. "Вызов сервера" у модуля тоже не особенно нужен.
Разницу поведения потрохов первого метода на клиенте и на сервере можно организовать через инструкции препроцессора.

Проверено для форм, для регл.заданий тестируй сам.

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

(11) ПодключитьОбработчикОжидания - этот способ не подойдет мне по той причине, что постоянно д.б. запущен сеанс 1С.
П.с. База работает в клиент-серверном режиме.

(15) - описанная последовательность действий.

Я создал общий модуль, проставил для него галки Клиент, Сервер, ВызовСервера, создал в нем 3 процедуры: Процедура1 без какой-либо директивы компиляции, Процедура2 с директивой компиляции НаСервере и Процедура3 с директивой компиляции НаКлиенте.
Далее создаю регламентное задание, указываю для запуска Процедура2.

Процедура2 вызывает Процедура1, а та, в свою очередь, должна вызвать Процедура3, но этого не происходит, т.к. Процедура1 не видит Процедура3.

Если я понял (12), то предполагалась именно такая последовательность, разве не так?

В платформе 8.2 в управляемом приложении для оптимизации работы приложений предлагается разделение функции клиента и сервера. На клиенте, например, нельзя обращаться к данным БД. А на стороне сервера не доступны данные формы, в модуле которой находится процедура с директивой &НаСервереБезКонтекста. Программный код в 1С располагается в различных модулях, модуле объекта, модуле формы, общих модулях и т.д. Процедуры и функции каждого модуля могут компилироваться как на сервере, так и на клиенте. Рассмотрим возможности вызова различных процедур и функции из процедур, компилируемых на стороне сервера, и процедур, компилируемых на стороне клиента.

Итак, со стороны клиента можно вызывать

1) клиентские процедуры данного модуля, с директивой &НаКлиенте;


2) серверные процедуры данного модуля, с директивой &НаСервере;


3) клиентские процедуры общего модуля, с директивой &НаКлиенте(при условии наличия в свойствах доступности в нескольких контекстах, «Клиент» обязателен и др.);


4) все процедуры клиентского общего модуля , в свойствах общего модуля должно быть только свойство «Клиент(управляемое приложение)». Директиву &НаКлиенте в общем модуле в этом случае не пишут;


5) процедуры серверного общего модуля, но с дополнительным свойством «Вызов сервера», причем важно чтобы общий модуль имел только свойство компиляции на сервере.


Со стороны сервера можно вызывать

1) серверные процедуры данного модуля, с директивой компиляции &НаСервере;


2) все процедуры серверного общего модуля, причем в свойствах общего модуля должно быть только свойство «Сервер». Директиву &НаСервере в общем модуле в этом случае не пишут;


3) процедуры общего модуля, с директивой &НаСервере (при условии наличия в свойствах доступности в нескольких контекстах, «Сервер» обязателен и др).


Кроме того, если в свойствах общего модуля указаны несколько мест компиляции «Клиент, Сервер», а в процедуре не указана никакая директива компиляции, то в этом случае процедура будет скомпилирована и на стороне сервера, и на стороне клиента. И ее можно вызывать соответственно и из клиентских методов, и из серверных. В этом случае нужно внимательно использовать процедуру, необходимо чтобы ее код мог выполняться и на сервере, и на клиенте.

Существует еще одна особенность. В одном общем модуле, имеющем несколько мест компиляции («Сервер, клиент») нельзя вызывать из клиентской процедуры серверную того же модуля, даже если поставить галку «вызов сервера». Свойство «вызов сервера» имеет смысл при наличии только одного свойства общего модуля «компиляции на Сервере».

Существуют рекомендации использовать общие модули, скомпилированные только на сервере или только на клиенте. Соответственно использовать в модуле со свойством «Клиент» все клиентские модули, а в модуле со свойством «сервер» использовать все серверные методы.

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


Но не стоит увлекаться использованием этого свойства, так как в таком случае модуль будет компилироваться при запуске системы, что увеличивает время запуска.

С сервера вызвать клиента
очень очень нужно вызвать из процедуры в модуле объекта открыть форму нужно, т.е. совершить.


Отличаются версии клиента и сервера
всем привет. ставлю платформу 1с 8.3.6.7( кажется) устанавливаю все тонкий клиент, сервер.


Обратный вызов клиента
Может кто доступно объяснить принцип действия обратного вызова клиента и метода.

определение и вызов Почтового клиента
Подскажите каким образом возможно из программы на Visual C, определить почтового клиента по.

С сервера нельзя вызвать клиента (клиентов может быть много и сервер не знает о их существовании)

Добавлено через 22 секунды
На самом деле это и не нужно

Добавлено через 1 минуту
Наверное логично, чтобы получить доступ к методу какого-то объекта, необходимо получить сам ОБЪЕКТ

тогда такой вопрос-если в общем модуле стоят галки клиент и сервер(обычные формы),в таком случае доступно ли получитьформу()?

StaLL1n, смотря где исполняется код

Добавлено через 24 секунды
Если на сервере, то НЕТ
Если на Клиенте, то ДА

не совсем понял,как это.Процедура в том модуле запускается рег.заданием(которое,кстати,фиг поймешь как работает).Можно ли как-то программно открыть обработку в вышеуказанном модуле?

Решение

StaLL1n, читать литературу. Читать, читать, Много читать.

Галочки у модуля только говорят о том где должен компилироваться модуль! (не исполняться. ) т.е. ОМ с галками Сервер и Клиент будет скомпилирован 2 раза для клиента и отдельно для сервера + компиляцией так же управляют инструкции препроцессору

Если вызвать функцию Этого модуля например с формы (с клиента), то код будет выполняться на клиенте
Если вызвать эту же функцию например из ОМ с галкой Сервер или из Регламентного задания то код будет исполняться на сервере

В этой статье мы покажем, как взаимодействуют клиентская и серверная части платформы и какие есть особенности в использовании директив компиляции.


Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере.

Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

Немного базовой теории

Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:

Далее, освежим в памяти немного теории.

Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.

Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:

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

Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:

Теперь про серверный вызов

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

Всё очень просто:

Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).

Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.

Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.

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

И в этом нам помогут наши новые друзья, знакомьтесь!

Это процесс клиентской части приложения «1С:Предприятие 8». Он запускается на компьютере пользователя и сожительствует в оперативной памяти с другими процессами (38 вкладок браузера, поток аудио из социальной сети, telegram и другие). Может порождать серверный вызов.
Это процесс серверной части приложения «1С:Предприятие 8». Он существует на сервере 1С. Знает, какие клиентские сеансы в данный момент запущены, но самостоятельно не может инициировать взаимодействие с ними. Работает с клиентской частью только через полученный от неё серверный вызов. А это серверный вызов. Как было сказано выше, он порождается процессом клиентской части и призван «прислуживать» ему. Он передает запросы со стороны клиента на сторону сервера, а также занимается транспортировкой данных с клиента на сервер и обратно.

Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.

Действие 1. Открытие пользователем формы с данными.

В момент нажатия Пользователем кнопки открытия формы из интерфейса, происходит передача управления на Сервер. По переданным параметрам получаются необходимые для построения данные из БД и происходит формирование контекста формы, который затем отправляется на клиентскую часть. У пользователя на экране отображается запрошенная форма.

Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.

После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.

Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.

Кстати, именно поэтому до версии платформы 8.3.7.1759 на сложных формах для управления видимостью элементов рекомендовалось использовать панели со страницами, а не свойство «Видимость». Только начиная с этого релиза отработка изменения видимости элементов стала выполняться на стороне клиента.

Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.

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

При таком построении программного кода происходит множественное обращение со стороны клиента на сервер – по количеству элементов цикла, запущенного на стороне клиента.

Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.

В данном случае количество серверных вызовов сведено к минимуму за счёт предварительной подготовки параметров.

Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.

Если цель серверного вызова, созданного внутри цикла – получить какую-либо информацию из базы данных, то данная операция включает в себя запрос в цикле. А это очень негативно влияет на производительность всей системы в целом.

Действие 4. Выполнение обработки данных.

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

Та-дам!

Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?

Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы.

Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.

Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.

С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…

Вместо заключения

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

Придерживайтесь при разработке следующих правил:

  • По возможности не передавайте контекст формы на сторону сервера
  • Минимизируйте количество текущих серверных вызовов
  • Длительные и ресурсоёмкие задачи запускайте на выполнение на стороне сервера (при возможности – в фоновом режиме).

Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!

Так ли это важно думать об оптимизации? Тут имеет смысл вспомнить одну историю.

Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.

Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.

Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?

Читайте также: