Почему возникает ошибка «is not a valid method for this service» при вызове веб-сервиса 1С и как её исправить

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

При активной разработке веб-сервисов в среде 1С:Предприятие, особенно при использовании Хранилища конфигурации, программисты часто сталкиваются с ситуацией, когда новый метод веб-сервиса добавлен, корректно отображается в WSDL через браузер, но при попытке вызова возвращает критическую ошибку: «Function is not a valid method for this service». Эта проблема может поставить в тупик, так как визуально всё настроено верно. В этой статье мы подробно разберем, почему возникает этот сбой и как его устранить, пройдя по всем уровням взаимодействия систем.

Причина 1: Агрессивное кэширование на стороне клиента

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

Проанализируем, как ведут себя различные клиентские среды:

Причина 2: Нюансы работы с IIS и пулами приложений

Рассмотрим случай, когда вы используете веб-сервер IIS (Internet Information Services). Иногда стандартной кнопки «Опубликовать» в конфигураторе 1С недостаточно. Веб-сервер кэширует загруженные библиотеки расширения (wsisapi.dll) и метаданные опубликованных баз в оперативной памяти Пула приложений.

Выясним, как принудительно обновить данные на стороне веб-сервера:

  1. Откройте Диспетчер служб IIS.
  2. Перейдите в раздел «Пулы приложений» (Application Pools).
  3. Найдите пул, под которым работает ваша публикация (обычно это 1C:Enterprise 8.3 App Pool или DefaultAppPool).
  4. Выполните команду «Перезапустить» (Recycle). Это заставит веб-сервер выгрузить старые метаданные и заново прочитать описание веб-сервиса из базы данных 1С при первом следующем обращении.

Причина 3: Конфликты идентификаторов при использовании Хранилища

Проанализируем специфическую ситуацию, описанную в теме: метод был добавлен в копии базы, а затем перенесен в основную базу через файл конфигурации и помещен в Хранилище. При таких манипуляциях (удаление и повторное создание метода) у объекта в метаданных может измениться его внутренний уникальный идентификатор (GUID).

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

  1. Полностью удалите публикацию веб-сервиса через конфигуратор (Администрирование -> Публикация на веб-сервере -> снять галочку).
  2. Удалите физическую папку на диске, где находилась публикация (там, где лежит файл default.vrd).
  3. Создайте публикацию заново в новый каталог.
  4. Проверьте файл default.vrd. Убедитесь, что имя сервиса и его псевдоним (alias) в точности соответствуют тому, что ожидает вызывающая сторона.

Причина 4: Пространство имен (Namespace) и регистр символов

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

Также важно помнить о регистре. В то время как язык 1С нечувствителен к регистру (MyProcedure и myprocedure для него одно и то же), протоколы SOAP и XML очень строги. Если в 1С метод назван MyProcedure, а внешняя система вызывает myprocedure, веб-сервер может вернуть ошибку о невалидности метода. Проверьте также, не закрались ли в имя метода кириллические буквы, визуально похожие на латинские (например, «с», «е», «а», «о»).

Практический пример обновления WS-ссылки в 1С

Если вызывающей стороной является другая база 1С, программное обновление или пересоздание соединения может выглядеть так. Разберем код для динамического создания соединения, который помогает избежать проблем с кэшированием статических WS-ссылок:


// Определение местоположения WSDL
Определение = Новый WSОпределения("http://server/base/ws/myservice?wsdl", "Логин", "Пароль");

// Выбор сервиса и точки подключения
Сервис = Определение.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];

// Создание прокси-объекта
Прокси = Новый WSПрокси(Определение, Сервис.Имя, ТочкаПодключения.Имя);
Прокси.Пользователь = "Логин";
Прокси.Пароль = "Пароль";

// Вызов метода
Попытка
    Результат = Прокси.MyProcedure(ПараметрJSON);
Исключение
    Сообщить("Ошибка вызова: " + ОписаниеОшибки());
КонецПопытки;

Использование WSОпределения позволяет получать актуальную структуру WSDL непосредственно в момент обращения, что минимизирует риски столкнуться с ошибкой «is not a valid method» после обновления конфигурации сервера.

Резюме: алгоритм решения

Если вы столкнулись с данной проблемой, пройдите по шагам:

  1. Убедитесь, что WSDL в браузере содержит нужный метод (проверьте тег <operation name="MyProcedure">).
  2. Перезапустите Пул приложений IIS или службу Apache.
  3. Обновите описание сервиса на стороне клиента (очистите кэш PHP, обновите WS-ссылку в 1С или перегенерируйте прокси-классы).
  4. Проверьте соответствие Пространства имен в конфигураторе и в запросе клиента.
  5. Если ничего не помогло — выполните перепубликацию в новый пустой каталог.
← На главную