Столкнулся с непонятным для меня поведением и нигде в документации не могу найти объяснения такому поведению.
Есть глобальный общий модуль с парой процедур: одна выполняется на клиенте, вторая должна вызываться из первой и выполняется на сервере. Загвоздка в том, что из процедуры на клиенте я не вижу серверной процедуры, хотя галка "Вызов сервера" у модуля стоит. Может кто знает где найти инфу об этом в документации или кто-то объяснит такое поведение, тонкости работы с глобальными модулями?
Существует еще одна особенность. В одном общем модуле, имеющем несколько мест компиляции («Сервер, клиент») нельзя вызывать из клиентской процедуры серверную того же модуля, даже если поставить галку «вызов сервера». Свойство «вызов сервера» имеет смысл при наличии только одного свойства общего модуля «компиляции на Сервере».
(1) тут дело не в свойстве "глобальный", а в том, что он и клиентский и серверный.
Свойство "Вызов сервера" будет работать только, если данный Общий модуль скомпилирован только на Сервере.
(4) напрямую ссылку на документацию сейчас не дам. Знания накапливаются без привязки к первоисточнику. Ищите особенности работы клиент-серверных общих модулей.
Кстати, если запускать толстый клиент, то все работает. Хотя и ругается, что процедура не найдена.
Толстый клиент в файловом варианте все выполняет на стороне клиента, от того и работает.
(5)знать бы где искать) Искал в справке, искал с СП, но ничего не нашел. Недавно мучался с ОписаниемОповещения при вызове ОткрытьФорму(), там ОО является одним из параметров и во всплывающей подсказке ссылка ведет в справку на ОписаниеОповещения, а параметр называется ОписаниеОповещенияОЗакрытии(только минут через 40 обратил на это внимание) и дооооолго я искал описание сигнатуры вызываемого метода(2 параметра). Очень все неоднозначно
Существует еще одна особенность. В одном общем модуле, имеющем несколько мест компиляции («Сервер, клиент») нельзя вызывать из клиентской процедуры серверную того же модуля, даже если поставить галку «вызов сервера». Свойство «вызов сервера» имеет смысл при наличии только одного свойства общего модуля «компиляции на Сервере».
11.
Aleksandr_prof
19704.07.22 13:56 Сейчас в теме
(10) Ок. Факт остаётся фактом. Но почему имеет смысл только при наличии одного свойства "компиляции на сервере"? Будет ошибка? Или работать не будет? Не могу до конца понять, кто или что запрещает установить все галки?
(11) все дело в компиляции контекстов.
Предположим имеем флаги:
- Сервер
- Вызов сервера
- Клиент (для примера не важен какой именно клиент)
При компиляции общего модуля (если он не глобальный, то компиляция происходит при первом к нему обращении) будут созданы два контекста: Серверный и Клиентский.
Предположим, что общий модуль называется ОбщМодуль и в нем есть процедура Тест.
Соответственно метод Тест будет добавлен как в серверный, так и в клиентский контексты.
Вызов сервера использоваться не будет из клиентского контекста, так как общий модуль есть в клиентском контексте. И обращение ОбщМодуль.Тест() будет вызван метод клиентского контекста.
Теперь мы обрамляем этот метод инструкцией препроцессора #Если Сервер Тогда В таком случае при компиляции этого модуля метод Тест будет только в серверном контексте. И ожидается, что с клиентского контекста отработает Вызов сервера и вызовется метод северного контекста.
НО...
сам же модуль существует в клиентском контексте. Соответственно будет обращение к клиентскому модулю и попытка вызвать метод клиентского контекста, а его там нет. Будет вызвано исключение.
Это можно представить как два разных общих модуля, но с одинаковым именем. Один северный, другой клиентский.
Да, два разных модуля с одинаковым именем создать нельзя, но для модуля с флагами Сервер и Клиент именно это и происходит, но под капотом.
(12) Я бы еще добавил, что серверный модуль компилируется в оперативной памяти сервера 1С (службы rphost), а клиентский модуль компилируется в оперативной памяти клиентского компьютера (включая терминальные сеансы RDP). А клиент-серверный модуль компилируется и там и там.
То есть клиент-серверный модуль по сути занимает в два раза больше совокупной оперативной памяти КИС, чем отдельные серверные и клиентские модули. Пустячок, но все же.
(3) Без глобального никак, глобальность требуется чтобы повестить ОбработчикОжидания. Суть задачи в целом такая: создается документ "ЗаказКлиента" и определенным пользователям должно прилететь оповещение, чтобы они дальше этот заказ обработали. Т.к. 1с не дает возможности напрямую черкануть конкретным пользователям или группе(или я не нашел такой возможности кроме сервера взаимодействия) решил это сделать через обработчик ожидания. в целом все работает сабжевая проблема решается легко - созданием доп ОМ, но из интереса и ради получения более глубокого понимания задал вопрос.