Как сделать глобальную процедуру, доступную и с клиента и с сервера?

1. DWZ2 15.07.21 05:39 Сейчас в теме
Добрый день!

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

Перенёс её в глобальный модуль, в его свойствах флажки "Клиент (управляемое приложение)", "Сервер" и "Вызов сервера" стоят, ключевое слово "Экспорт" у процедуры есть.

Ставлю перед ней директивы компиляции "&НаКлиентеНаСервере" или "&НаКлиентеНаСервереБезКонтекста" - процедуру не видно ни с клиента, ни с сервера. Ладно, мы не гордые - сделаем процедуру чисто "&НаСервере". В результате с сервера её видно, а с клиента нет, хотя флажок "Вызов сервера" стоит. Сделал глобальную процедуру-обёртку "&НаКлиенте". С клиента обёртка видна, но сама она серверную процедуру из того же модуля не видит. Чистил кеш - не помогло.

Что же делать, как быть?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. Alfn 61 15.07.21 06:45 Сейчас в теме +0.05 $m
Уберите директивы совсем. Так процедура будет видна и с клиента и с сервера... но только извне
Обратиться к другой процедуре того же модуля можно только в виде клиент-клиент или сервер-сервер... по другому никак, только сделав вызов в ещё одном общем модуле
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. victor_d_nikitenko 15.07.21 10:02 Сейчас в теме
(1) Для ответа на вопрос "как быть" - есть разъяснение в официальной документации
https://its.1c.ru/db/v8std/content/469/hdoc

По контексту топика получается, что нужный общий модуль должен иметь второй вид, а именно :
2. Серверный для вызова с клиента (это тип модуля)
ОбщегоНазначенияВызовСервера (пример наименования)
+ Вызов сервера
+ Сервер

Директивы компиляции внутри модуля не потребуются.

з.ы. Там в тексте по ссылке есть ещё кусочек, который нужно выделить - вот я ниже его скопипастил
---
В то же время, как только возникает необходимость ветвить код в клиент-серверных общих модулях на серверный и клиентский, то не следует использовать для этого инструкции препроцессора. Вместо этого, функциональность, различную для клиента и для сервера, рекомендуется реализовывать по общим правилам в модулях соответствующего типа – см. пп. 2.1 и 2.3. Такое явное разделение клиентской и серверной бизнес-логики продиктовано соображениями повышения модульности прикладного решения, упрощения контроля со стороны разработчика над клиент-серверным взаимодействием и снижением риска ошибок из-за принципиальных отличий требований к разработке клиентского и серверного кода (необходимость минимизации кода, выполняемого на клиенте, разной доступностью объектов и типов платформы и др.). При этом нужно иметь в виду неизбежное увеличение числа общих модулей в конфигурации.
---
6. sivin-alexey 513 15.07.21 11:25 Сейчас в теме
(5)
1. По контексту топика явно понятно, что модуль должен быть доступен и на клиенте, и на сервере. Т.е. нужны галки "Клиент" и "Сервер".

2. В вашеи варианте "Вызов сервера" и "Сервер" - тоже будет работать, но приэтом будут лишние серверные вызовы. Зачем код выполнять на сервере, если он может быть выполнен на клиенте?

3. Вспоминаю анекдот про Вовочку: "А вы, дяденька, если не знаете, то не подсказывайте"
user1448856; FatPanzer; +2 Ответить
7. FatPanzer 15.07.21 11:29 Сейчас в теме
(6) Именно. Если раньше код спокойно работал на клиенте, и не требуется его изменять - значит там нет явных серверных методов работы с серверными объектами или данными БД, и данный код может работать именно что в двух контекстах - клиентском и серверном. Именно работать, а не "всегда вызываться сервер с клиента".

Это же сразу в глаза бросается!
8. spacecraft 15.07.21 11:52 Сейчас в теме
(5)
По контексту топика получается, что нужный общий модуль должен иметь второй вид, а именно :
2. Серверный для вызова с клиента (это тип модуля)

Это конечно все интересно, только ничего общего не имеет с вопросом ТС.
Для глобального общего модуля не работает ВызовСервера. Совсем не работает.
9. sivin-alexey 513 15.07.21 12:17 Сейчас в теме
(8) Про "глобальный модуль" - это скорее всего опечатка автор вопроса. Вероятно он имел ввиду неглобальный общий модуль.
Те, кто сильно долго программировал в 7.7, до конца жизни будут "глобальный" вместо "общий"
10. spacecraft 15.07.21 12:22 Сейчас в теме
(9)
Про "глобальный модуль" - это скорее всего опечатка автор вопроса. Вероятно он имел ввиду неглобальный общий модуль.

"Перенёс её в глобальный модуль" это в каком месте опечатка?
11. DWZ2 15.07.21 13:11 Сейчас в теме
(9) именно глобальный, с установленным соответствующим флажком
2. Alfn 61 15.07.21 06:45 Сейчас в теме +0.05 $m
Уберите директивы совсем. Так процедура будет видна и с клиента и с сервера... но только извне
Обратиться к другой процедуре того же модуля можно только в виде клиент-клиент или сервер-сервер... по другому никак, только сделав вызов в ещё одном общем модуле
3. ImHunter 338 15.07.21 07:10 Сейчас в теме
(1) А зачем глобальный модуль?
Для модуля, Клиент и ВызовСервера - противоречащие галки. По вашей задаче, видимо, нужно оставить Сервер и ВызовСервера.
4. sivin-alexey 513 15.07.21 08:24 Сейчас в теме
1. Нужно создать неглобальный общий модуль с галками "Клиент" и "Сервер". Галка "Вызов сервера" не нужна.

2. После объявления процедуры написать Экспорт.

3.Никакие директивы компиляции в общем модуле не нужны (они предназначены для модулей форм)

4. Вызывать процедуру через ИмяМодуля.ИмяПроцедуры
user1448856; FatPanzer; lefthander; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот