При разработке интеграций в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью выноса функционала в расширения. Это позволяет сохранить типовую конфигурацию на поддержке, добавляя при этом новые веб-сервисы или изменяя существующие. Однако механизм расширений, особенно в версиях платформы 8.3.11 и 8.3.12, имеет свои нюансы. Рассмотрим ситуацию, когда веб-сервис успешно отрабатывает логику (например, создает элемент справочника), но вместо возврата результата выдает непонятную ошибку unknownOperation с кодом 500 через веб-сервер Apache или IIS.
Проанализируем поведение системы. Как отмечает автор темы, проблема локализуется именно в момент передачи данных обратно клиенту. Внутри базы 1С отладчик показывает, что объект успешно сформирован и функция веб-сервиса выполнила оператор Возврат. Однако на стороне веб-сервера происходит сбой. Выясним причину: веб-сервис 1С при формировании SOAP-ответа выполняет сериализацию данных в XML на основе пакетов XDTO. Если тип возвращаемого значения определен в XDTO-пакете расширения, платформа 8.3.11 в некоторых случаях «теряет» контекст этого расширения в момент финальной сборки XML-пакета. В результате сериализатор не находит описание типа в основной конфигурации и генерирует исключение unknownOperation, так как структура ответа становится невалидной.
Первым делом проанализируем, как описаны типы данных в вашем расширении. Если вы скопировали стандартный веб-сервис и изменили пакет XDTO, убедитесь, что у вашего пакета уникальный URI пространства имен (Namespace). Использование того же URI, что и в основной конфигурации, при наличии изменений в составе полей, гарантированно приведет к конфликту.
Рекомендуется придерживаться следующей схемы при создании пакета в расширении:
http://www.company.ru/extension/v1.Чтобы убедиться, что проблема именно в сериализации сложного объекта, проведем эксперимент. Попробуем изменить тип возвращаемого значения операции веб-сервиса на примитивный тип, например, string (из пространства имен http://www.w3.org/2001/XMLSchema).
В модуле веб-сервиса временно изменим код:
Функция СоздатьОбъект(ДанныеЗапроса)
// Логика создания объекта
НовыйОбъект = Справочники.ВходящиеДокументы.СоздатьЭлемент();
// ... заполнение ...
НовыйОбъект.Записать();
// Вместо возврата XDTO-объекта вернем просто УИД
Возврат Строка(НовыйОбъект.Ссылка.УникальныйИдентификатор());
КонецФункции
Если после этого изменения ошибка unknownOperation исчезла, а клиент получил строку с идентификатором, значит, наши подозрения верны: платформа не справляется с сериализацией сложного типа данных, описанного в расширении. Разберем по шагам, как это исправить для сложных объектов.
Посмотрим на настройки веб-сервера. Файл default.vrd управляет тем, как 1С взаимодействует с Apache или IIS. Иногда для корректной работы веб-сервисов из расширений требуется явно разрешить их использование. Проверьте секцию ws в файле конфигурации публикации. В версии 8.3.11 важно, чтобы имя веб-сервиса в публикации соответствовало имени в расширении с учетом регистра.
Пример корректной записи в default.vrd для веб-сервиса из расширения:
<ws>
<point name="Expertise_dm"
alias="Expertise_dm.1cws"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
</ws>
Обратите внимание: если вы используете несколько расширений с веб-сервисами, убедитесь, что имена сервисов не пересекаются с основной конфигурацией. Платформа 8.3.11 может «запутаться», если в разных областях (конфигурация и расширение) есть объекты с одинаковыми именами, даже если они находятся в разных пространствах имен.
Веб-сервисы крайне чувствительны к кэшированию. Ошибка unknownOperation часто возникает, когда клиент или прокси-сервер (включая модуль расширения веб-сервера 1С) использует старое WSDL-описание, в котором еще не было вашей новой операции или типа данных. Рассмотрим алгоритм полной очистки кэша:
Temp).srvinfo (или аналогичной, где хранятся сеансы и данные сервера 1С), если это возможно в условиях разработки.Если вы используете платформу 8.3.11.3034 и вышеуказанные действия не помогли, вероятно, вы столкнулись с системным багом обработки XDTO в расширениях. В этой версии платформы механизм работы с типами из расширений еще не был доведен до совершенства. Попробуем применить один из программных обходов.
Вместо того чтобы полагаться на автоматическую сериализацию возвращаемого значения платформой, мы можем выполнить сериализацию вручную внутри кода 1С и вернуть результат в виде строки или объекта XDTOДанные, созданного явным образом.
Проанализируем пример кода для ручного создания возвращаемого объекта:
// Получаем тип из пакета XDTO, который находится в расширении
ТипОбъекта = ФабрикаXDTO.Тип("http://www.company.ru/extension/v1", "CreatedObjectResponse");
// Создаем объект XDTO явным образом
ОтветXDTO = ФабрикаXDTO.Создать(ТипОбъекта);
ОтветXDTO.ID = Строка(НовыйОбъект.Ссылка.УникальныйИдентификатор());
ОтветXDTO.Name = НовыйОбъект.Наименование;
// Возвращаем именно созданный объект XDTO
Возврат ОтветXDTO;
Иногда помогает перенос описания типов (XDTO-пакета) из расширения в основную конфигурацию, если это допустимо политикой разработки. Это самый надежный способ для старых версий платформы, так как основная конфигурация всегда находится в «поле зрения» сериализатора.
Подводя итог, можно выделить основные причины ошибки unknownOperation в расширениях:
Для стабильной работы рекомендуется обновить платформу до актуальных релизов (начиная с 8.3.15+), где работа веб-сервисов в расширениях была значительно переработана и стабилизирована. Если же обновление невозможно, используйте ручное формирование объектов XDTO и тщательно следите за уникальностью имен и пространств имен в ваших пакетах.