При активной разработке веб-сервисов в среде 1С:Предприятие, особенно при использовании Хранилища конфигурации, программисты часто сталкиваются с ситуацией, когда новый метод веб-сервиса добавлен, корректно отображается в WSDL через браузер, но при попытке вызова возвращает критическую ошибку: «Function is not a valid method for this service». Эта проблема может поставить в тупик, так как визуально всё настроено верно. В этой статье мы подробно разберем, почему возникает этот сбой и как его устранить, пройдя по всем уровням взаимодействия систем.
Разберем ситуацию: ваша база 1С (сервер) уже знает о существовании нового метода MyProcedure, но вызывающая система (клиент) продолжает использовать старое описание сервиса, сохраненное в локальной памяти. Это самая распространенная причина ошибки. Вызывающая сторона даже не пытается отправить полноценный запрос к новой функции, так как на её уровне эта функция считается «несуществующей».
Проанализируем, как ведут себя различные клиентские среды:
soap.wsdl_cache_enabled. Даже если вы обновили код в 1С, PHP-скрипт будет брать структуру объекта из файла в папке /tmp или C:\Windows\Temp. Необходимо либо временно отключить кэширование в php.ini, либо вручную удалить файлы кэша.WSDL в момент разработки. Если вы добавили метод в 1С, вам обязательно нужно перегенерировать прокси-класс в проекте клиента, иначе клиентская библиотека выдаст ошибку еще до отправки HTTP-пакета.WSСсылки, необходимо зайти в конфигуратор базы-клиента, найти соответствующую WS-ссылку, нажать правую кнопку мыши и выбрать пункт «Обновить». После этого конфигурацию нужно сохранить и обновить в режиме «Предприятие».Рассмотрим случай, когда вы используете веб-сервер IIS (Internet Information Services). Иногда стандартной кнопки «Опубликовать» в конфигураторе 1С недостаточно. Веб-сервер кэширует загруженные библиотеки расширения (wsisapi.dll) и метаданные опубликованных баз в оперативной памяти Пула приложений.
Выясним, как принудительно обновить данные на стороне веб-сервера:
1C:Enterprise 8.3 App Pool или DefaultAppPool).Проанализируем специфическую ситуацию, описанную в теме: метод был добавлен в копии базы, а затем перенесен в основную базу через файл конфигурации и помещен в Хранилище. При таких манипуляциях (удаление и повторное создание метода) у объекта в метаданных может измениться его внутренний уникальный идентификатор (GUID).
Хотя веб-сервисы работают по именам, сервер приложений 1С может хранить в своем внутреннем кэше старые связи имен и идентификаторов. Если простая перепубликация не помогает, рекомендуется выполнить следующие шаги:
default.vrd).default.vrd. Убедитесь, что имя сервиса и его псевдоним (alias) в точности соответствуют тому, что ожидает вызывающая сторона.Посмотрим на структуру WSDL. Веб-сервис 1С определяется не только именем, но и Пространством имен (Namespace). Если при переносе из копии в основную базу вы случайно изменили это свойство в свойствах веб-сервиса, то для внешнего мира это стал совершенно другой сервис, даже если его имя осталось прежним.
Также важно помнить о регистре. В то время как язык 1С нечувствителен к регистру (MyProcedure и myprocedure для него одно и то же), протоколы SOAP и XML очень строги. Если в 1С метод назван MyProcedure, а внешняя система вызывает myprocedure, веб-сервер может вернуть ошибку о невалидности метода. Проверьте также, не закрались ли в имя метода кириллические буквы, визуально похожие на латинские (например, «с», «е», «а», «о»).
Если вызывающей стороной является другая база 1С, программное обновление или пересоздание соединения может выглядеть так. Разберем код для динамического создания соединения, который помогает избежать проблем с кэшированием статических WS-ссылок:
// Определение местоположения WSDL
Определение = Новый WSОпределения("http://server/base/ws/myservice?wsdl", "Логин", "Пароль");
// Выбор сервиса и точки подключения
Сервис = Определение.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];
// Создание прокси-объекта
Прокси = Новый WSПрокси(Определение, Сервис.Имя, ТочкаПодключения.Имя);
Прокси.Пользователь = "Логин";
Прокси.Пароль = "Пароль";
// Вызов метода
Попытка
Результат = Прокси.MyProcedure(ПараметрJSON);
Исключение
Сообщить("Ошибка вызова: " + ОписаниеОшибки());
КонецПопытки;
Использование WSОпределения позволяет получать актуальную структуру WSDL непосредственно в момент обращения, что минимизирует риски столкнуться с ошибкой «is not a valid method» после обновления конфигурации сервера.
Если вы столкнулись с данной проблемой, пройдите по шагам:
WSDL в браузере содержит нужный метод (проверьте тег <operation name="MyProcedure">).WS-ссылку в 1С или перегенерируйте прокси-классы).