Работа с веб-сервисами в среде 1С:Предприятие 8.3 — это мощный инструмент для интеграции различных информационных систем. Однако начинающие разработчики часто сталкиваются с трудностями при передаче данных, отличных от простых строк или чисел. Одной из самых распространенных ошибок является попытка передать системные объекты 1С, такие как ХранилищеЗначения или ТабличныйДокумент, напрямую через протокол SOAP.
В этой статье мы подробно разберем, почему возникают ошибки отображения типов, как правильно подготовить данные для передачи и какие методы преобразования следует использовать, чтобы ваш обмен работал стабильно.
Проанализируем ситуацию: когда мы создаем веб-сервис, мы описываем его операции и параметры в пакете XDTO. Эти пакеты базируются на стандартах XML Schema (W3C). Проблема заключается в том, что тип ХранилищеЗначения является внутренним системным типом 1С, который предназначен для хранения сжатых данных в базе. В стандартном наборе типов XML такого понятия просто не существует.
Когда платформа 1С пытается отправить объект этого типа через веб-сервис, она не находит соответствующего описания в схеме XDTO и выдает ошибку: «Ошибка отображения типов: Отображение типа 'ХранилищеЗначения' в тип...». Чтобы решить эту задачу, нам необходимо привести данные к виду, который «понятен» протоколу XML.
Если в вашем ХранилищеЗначения находятся файлы, картинки или сериализованные объекты, самым надежным способом передачи будет преобразование их в строку Base64. Рассмотрим пошагово, как это реализовать на стороне отправителя и получателя.
Шаг 1. На стороне источника (Web-сервис):
Вместо того чтобы возвращать ХранилищеЗначения, мы извлекаем из него данные и преобразуем их в строку. Тип возвращаемого значения в определении веб-сервиса в конфигураторе должен быть установлен как string (http://www.w3.org/2001/XMLSchema).
Функция ПолучитьДанныеФайла(КодОбъекта)
// Допустим, мы ищем файл в справочнике
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоКоду(КодОбъекта);
Если СсылкаНаОбъект.Пустая() Тогда
Возврат "";
КонецЕсли;
// Извлекаем ДвоичныеДанные из ХранилищаЗначения
ДвоичныеДанные = СсылкаНаОбъект.ФайлХранилище.Получить();
Если ТипЗнч(ДвоичныеДанные) <> Тип("ДвоичныеДанные") Тогда
Возврат ""; // Или обработка ошибки
КонецЕсли;
// Преобразуем в строку Base64
Возврат Base64Строка(ДвоичныеДанные);
КонецФункции
Шаг 2. На стороне приемника (Обработка):
При получении ответа от веб-сервиса мы выполняем обратное преобразование.
// Вызов веб-сервиса через WSПрокси
РезультатСтрока = Прокси.ПолучитьДанныеФайла("00001");
Если ЗначениеЗаполнено(РезультатСтрока) Тогда
// Превращаем строку обратно в ДвоичныеДанные
ДанныеФайла = Base64Значение(РезультатСтрока);
// Теперь данные можно сохранить на диск или поместить в ХранилищеЗначения
НовоеХранилище = Новый ХранилищеЗначения(ДанныеФайла);
КонецЕсли;
Часто возникает необходимость передать печатную форму (объект ТабличныйДокумент). Напрямую передать его невозможно, так как это сложный визуальный объект. Разберем, как проанализировать ситуацию и выбрать правильный формат.
Рассмотрим два основных подхода:
ДвоичныеДанные и передаем через Base64 (как описано выше). Это гарантирует сохранение форматирования.ТабличныйДокумент в XML-строку.Пример сериализации табличного документа в строку:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТабДок);
СтрокаXML = ЗаписьXML.Закрыть();
// Эту строку теперь можно передавать как обычный параметр типа string
Эта ошибка часто сбивает с толку при работе с WSПрокси. Выясним причину ее возникновения. Обычно она проявляется в строке кода, где вы пытаетесь создать объект XDTO через прокси, например: Прокси.ФабрикаXDTO.Создать(ТипXDTO).
Если ТипXDTO не был определен корректно или веб-сервис не предоставил описание этого типа в WSDL, переменная будет иметь значение Неопределено. Попытка обращения к свойству или методу Неопределено и вызывает данную ошибку.
Как проверить:
Для стабильной работы обмена старайтесь придерживаться следующих правил:
http://www.w3.org/2001/XMLSchema (string, boolean, decimal, dateTime).УникальныйИдентификатор в виде строки. Не пытайтесь передать саму ссылку.Nillable (Возможное пустое значение) в свойствах параметра XDTO в значение Истина.Соблюдение этих принципов позволит вам избежать большинства ошибок отображения типов и создаст надежный мост для обмена данными между вашими базами 1С. Если обмен требуется выполнять регулярно по расписанию, для этого настраивается программа автоматического обмена данными между базами 1С через веб-сервисы.