База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как корректно вызывать серверные функции в клиентском модуле расширения 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 3 недели назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
5 февраля 2026 в 18:15 #35651
добавил в расширении общий модуль. В него перехватил директивой «Вместо» на клиенте процедуру общего модуля основной конфигурации.
в замененной процедуре все отрабатывает. Но нужно добавить данные со справочника — обращаюсь на сервер &НаСервере создаю функцию, а вызов ее не видит.
Свойство модуля стоит клиент, пытался ставить сервер, вызов сервера не помогает -
5 февраля 2026 в 18:15 #35652
В 1С при работе с расширениями и общими модулями с директивой «Вместо» есть важные нюансы по разделению клиентской и серверной части.
Если у вас общий модуль в расширении с директивой «Вместо» и свойством «Клиент», то все процедуры и функции этого модуля работают только на клиенте. Атрибут &НаСервере в таком модуле не даст эффекта, потому что серверная часть модуля с таким свойством просто не создается.
Чтобы вызвать серверную функцию из клиентского общего модуля в расширении, нужно:
1. Создать отдельный общий модуль в расширении с свойством «Сервер» (без директивы «Вместо»). В нем реализовать серверные процедуры и функции, которые работают с данными (например, добавление в справочник).
2. В клиентском общем модуле (с директивой «Вместо» и свойством «Клиент») вызвать серверную функцию через вызов из серверного модуля, например:
1С (Код)1Результат = Расширение.СерверныйМодуль.ИмяФункции(Параметры);где
Расширение.СерверныйМодуль— это имя серверного общего модуля в расширении.3. Если нужно, чтобы вызов был асинхронным или с использованием вызова на сервер, можно использовать
ВызватьНаСервереилиВызватьНаСервереСинхронно, но обычно достаточно прямого вызова серверного модуля из клиентского.4. Важно, что общий модуль с директивой «Вместо» не может содержать серверные процедуры, если его свойство «Клиент». Если поставить свойство «Сервер», то клиентская часть не будет доступна, и замена процедуры на клиенте не сработает.
Итого, разделяйте логику: клиентский общий модуль с директивой «Вместо» — только клиентский код, серверный общий модуль — серверный код. Вызов серверных функций из клиентского модуля делайте через вызов серверного общего модуля.
Пример:
В расширении:
— Общий модуль «КлиентМодуль» (свойство Клиент, директива Вместо):
1С (Код)12345Процедура МояПроцедура()// клиентская логикаРезультат = СерверныйМодуль.ДобавитьДанные(Параметры);// дальше работа с результатомКонецПроцедуры— Общий модуль «СерверныйМодуль» (свойство Сервер):
1С (Код)1234567Функция ДобавитьДанные(Параметры)// работа с данными справочникаНовыйЭлемент = Справочники.МойСправочник.СоздатьЭлемент();НовыйЭлемент.Наименование = Параметры.Наименование;НовыйЭлемент.Записать();Возврат НовыйЭлемент.Ссылка;КонецФункцииТакой подход гарантирует, что серверный код будет доступен и вызов будет работать.
https://infostart.ru/public/1043459/ (пример разделения клиент-сервер в расширениях)
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.