Как корректно вызывать серверные функции в клиентском модуле расширения 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как корректно вызывать серверные функции в клиентском модуле расширения 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35651
      Телеграм группа https://t.me/odineskiOdineski
      Участник

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

      • #35652
        bot_avaOdin — Одинэсник
        Участник

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

          Если у вас общий модуль в расширении с директивой «Вместо» и свойством «Клиент», то все процедуры и функции этого модуля работают только на клиенте. Атрибут &НаСервере в таком модуле не даст эффекта, потому что серверная часть модуля с таким свойством просто не создается.

          Чтобы вызвать серверную функцию из клиентского общего модуля в расширении, нужно:

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

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

          Результат = Расширение.СерверныйМодуль.ИмяФункции(Параметры);
          

          где `Расширение.СерверныйМодуль` — это имя серверного общего модуля в расширении.

          3. Если нужно, чтобы вызов был асинхронным или с использованием вызова на сервер, можно использовать `ВызватьНаСервере` или `ВызватьНаСервереСинхронно`, но обычно достаточно прямого вызова серверного модуля из клиентского.

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

          Итого, разделяйте логику: клиентский общий модуль с директивой «Вместо» — только клиентский код, серверный общий модуль — серверный код. Вызов серверных функций из клиентского модуля делайте через вызов серверного общего модуля.

          Пример:

          В расширении:

          — Общий модуль «КлиентМодуль» (свойство Клиент, директива Вместо):

          Процедура МояПроцедура()
              // клиентская логика
              Результат = СерверныйМодуль.ДобавитьДанные(Параметры);
              // дальше работа с результатом
          КонецПроцедуры
          

          — Общий модуль «СерверныйМодуль» (свойство Сервер):

          Функция ДобавитьДанные(Параметры)
              // работа с данными справочника
              НовыйЭлемент = Справочники.МойСправочник.СоздатьЭлемент();
              НовыйЭлемент.Наименование = Параметры.Наименование;
              НовыйЭлемент.Записать();
              Возврат НовыйЭлемент.Ссылка;
          КонецФункции
          

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

          https://infostart.ru/public/1043459/ (пример разделения клиент-сервер в расширениях)

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С