Добрый день!

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

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

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

Что же делать, как быть?
---
Уберите директивы совсем. Так процедура будет видна и с клиента и с сервера... но только извне
Обратиться к другой процедуре того же модуля можно только в виде клиент-клиент или сервер-сервер... по другому никак, только сделав вызов в ещё одном общем модуле
---
Для ответа на вопрос "как быть" - есть разъяснение в официальной документации
https://its.1c.ru/db/v8std/content/469/hdoc

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

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

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

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

3. Вспоминаю анекдот про Вовочку: "А вы, дяденька, если не знаете, то не подсказывайте"
---
Именно. Если раньше код спокойно работал на клиенте, и не требуется его изменять - значит там нет явных серверных методов работы с серверными объектами или данными БД, и данный код может работать именно что в двух контекстах - клиентском и серверном. Именно работать, а не "всегда вызываться сервер с клиента".

Это же сразу в глаза бросается!
---
По контексту топика получается, что нужный общий модуль должен иметь второй вид, а именно :
2. Серверный для вызова с клиента (это тип модуля)
Это конечно все интересно, только ничего общего не имеет с вопросом ТС.
Для глобального общего модуля не работает ВызовСервера. Совсем не работает.
---
Про "глобальный модуль" - это скорее всего опечатка автор вопроса. Вероятно он имел ввиду неглобальный общий модуль.
Те, кто сильно долго программировал в 7.7, до конца жизни будут "глобальный" вместо "общий"
---
Про "глобальный модуль" - это скорее всего опечатка автор вопроса. Вероятно он имел ввиду неглобальный общий модуль.
"Перенёс её в глобальный модуль" это в каком месте опечатка?
---
именно глобальный, с установленным соответствующим флажком
---
Уберите директивы совсем. Так процедура будет видна и с клиента и с сервера... но только извне
Обратиться к другой процедуре того же модуля можно только в виде клиент-клиент или сервер-сервер... по другому никак, только сделав вызов в ещё одном общем модуле
---
А зачем глобальный модуль?
Для модуля, Клиент и ВызовСервера - противоречащие галки. По вашей задаче, видимо, нужно оставить Сервер и ВызовСервера.
---
1. Нужно создать неглобальный общий модуль с галками "Клиент" и "Сервер". Галка "Вызов сервера" не нужна.

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

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

4. Вызывать процедуру через ИмяМодуля.ИмяПроцедуры