Почему общий модуль не виден в WS-сервисе 1С и как правильно настроить его контекст?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интеграций через веб-сервисы (WS-сервисы) программисты 1С часто сталкиваются с ситуацией, когда экспортные функции общего модуля, доступные в формах или других частях конфигурации, внезапно оказываются «невидимыми» для модуля веб-сервиса. Это вызывает недоумение, особенно в конфигурациях с обычными формами (толстый клиент), где границы между клиентским и серверным контекстом иногда кажутся размытыми. Разберем подробно, почему так происходит, и как правильно настроить свойства общего модуля для стабильной работы веб-сервисов.

Анализ контекста выполнения веб-сервиса

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

Рассмотрим ошибку автора темы: у модуля были установлены флаги Глобальный и ОбычноеПриложение. Флаг ОбычноеПриложение (в старых версиях — «Клиент (обычное приложение)») означает, что модуль будет скомпилирован в контексте толстого клиента. Однако WS-сервис запускается в серверном сеансе, где этот флаг не дает модулю права на компиляцию. Следовательно, система «не видит» модуль, так как для текущего серверного сеанса его просто не существует.

Настройка флагов общего модуля для WS-сервиса

Выясним, какие настройки являются критически важными для того, чтобы функции модуля стали доступны. Рассмотрим три основных флага, которые должны быть установлены в свойствах общего модуля:

  1. Сервер — это самый важный флаг. Он разрешает компиляцию модуля на стороне сервера 1С. Поскольку веб-сервисы работают на сервере, без этой галочки вызов любой функции будет возвращать ошибку «Метод не обнаружен».
  2. Внешнее соединение — этот флаг часто игнорируют, но он важен. Сеансы веб-сервисов по своим свойствам и набору доступных функций во многом схожи с COM-соединениями (внешними соединениями). Установка этого флага гарантирует, что модуль будет доступен при различных программных способах подключения к базе.
  3. Вызов сервера — этот флаг необходим только в том случае, если вы планируете вызывать функции этого модуля с клиента (из модуля формы или модуля команды). Если модуль используется только внутри серверных процессов (как в случае с WS-сервисом), этот флаг можно не ставить, чтобы не увеличивать нагрузку на систему лишними интерфейсными связями.

Разберем по шагам правильную комбинацию настроек

Проанализируем оптимальный набор флагов для общего модуля, который должен «отдавать» данные в веб-сервис:

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

Важный момент: Если вы ставите флаг Глобальный, помните, что такой модуль будет инициализироваться при каждом старте сеанса. Для веб-сервисов, которые могут вызываться очень часто и на короткое время, большое количество глобальных модулей может существенно замедлить время отклика. Рекомендуется создавать неглобальные модули и обращаться к ним по имени:


// В модуле WS-сервиса вызываем функцию неглобального модуля
Результат = ИмяВашегоОбщегоМодуля.ВашаЭкспортнаяФункция(Параметры);

Проблема интерактивных методов в серверном контексте

Проанализируем еще одну причину, по которой код может не работать в WS-сервисе, даже если флаги расставлены верно. Это использование интерактивных функций. Посмотрим на пример кода, который вызовет ошибку в веб-сервисе:


Функция ПолучитьДанныеДляСервиса() Экспорт
    Сообщить("Начинаем выгрузку..."); // Ошибка или игнорирование
    Предупреждение("Проверьте данные!"); // Критическая ошибка в сеансе WS
    Возврат Справочники.Номенклатура.Выбрать();
КонецФункции

В контексте веб-сервиса нет пользователя, который мог бы нажать кнопку «ОК». Поэтому любые попытки вызвать Предупреждение, Вопрос или открыть форму приведут к аварийному завершению работы потока веб-сервиса. Всегда оборачивайте подобный код в проверку на тип клиента или используйте только серверную логику.

Использование привилегированного режима

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

Это позволит выполнять код модуля без проверки прав доступа (RLS), что критично для стабильной работы веб-сервисов. Рассмотрим пример:


// Модуль помечен как Привилегированный
Функция ПолучитьОстаткиТоваров(Артикул) Экспорт
    // Код выполнится успешно, даже если у пользователя WS-сервиса 
    // нет прав на чтение регистра накопления ОстаткиТоваров
    Запрос = Новый Запрос("ВЫБРАТЬ ... ИЗ РегистрНакопления.ОстаткиТоваров.Остатки(...)");
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Оптимизация работы через повторное использование значений

Рассмотрим ситуацию, когда метод веб-сервиса вызывается внешними системами очень часто с одними и теми же параметрами. Чтобы не нагружать сервер лишними вычислениями или тяжелыми запросами к базе данных, в свойствах серверного общего модуля можно настроить Повторное использование значений.

Установите значение На время сеанса. В этом случае, если веб-сервис в рамках одного сеанса (при использовании пула соединений) вызовет функцию с одинаковыми входными данными, 1С не будет выполнять код функции заново, а сразу вернет результат из кеша. Это значительно ускоряет работу высоконагруженных интеграционных шлюзов.

Итоги

Подведем итог: чтобы ваш общий модуль был «виден» и успешно работал в контексте WS-сервиса, необходимо:

  1. Обязательно включить флаг Сервер.
  2. Включить флаг Внешнее соединение для корректной работы сеанса связи.
  3. Избегать использования интерактивных команд (Предупреждение, ОткрытьФорму) внутри функций.
  4. Для выполнения операций, требующих повышенных прав, использовать свойство Привилегированный.
  5. Отдавать предпочтение неглобальным модулям для снижения нагрузки на сервер при инициализации сеанса веб-сервиса.

Соблюдение этих правил позволит избежать трудноуловимых ошибок и обеспечит надежную работу ваших интеграционных решений на платформе 1С:Предприятие.

← На главную