Как исправить ошибку отображения типов и правильно передать данные через веб-сервисы 1С 8.3?

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

Работа с веб-сервисами в среде 1С:Предприятие 8.3 — это мощный инструмент для интеграции различных информационных систем. Однако начинающие разработчики часто сталкиваются с трудностями при передаче данных, отличных от простых строк или чисел. Одной из самых распространенных ошибок является попытка передать системные объекты 1С, такие как ХранилищеЗначения или ТабличныйДокумент, напрямую через протокол SOAP.

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

Разбор проблемы: Почему возникает ошибка «Отображение типа 'ХранилищеЗначения'»

Проанализируем ситуацию: когда мы создаем веб-сервис, мы описываем его операции и параметры в пакете XDTO. Эти пакеты базируются на стандартах XML Schema (W3C). Проблема заключается в том, что тип ХранилищеЗначения является внутренним системным типом 1С, который предназначен для хранения сжатых данных в базе. В стандартном наборе типов XML такого понятия просто не существует.

Когда платформа 1С пытается отправить объект этого типа через веб-сервис, она не находит соответствующего описания в схеме XDTO и выдает ошибку: «Ошибка отображения типов: Отображение типа 'ХранилищеЗначения' в тип...». Чтобы решить эту задачу, нам необходимо привести данные к виду, который «понятен» протоколу XML.

Решение №1: Использование Base64 для передачи двоичных данных

Если в вашем ХранилищеЗначения находятся файлы, картинки или сериализованные объекты, самым надежным способом передачи будет преобразование их в строку Base64. Рассмотрим пошагово, как это реализовать на стороне отправителя и получателя.

Шаг 1. На стороне источника (Web-сервис):

Вместо того чтобы возвращать ХранилищеЗначения, мы извлекаем из него данные и преобразуем их в строку. Тип возвращаемого значения в определении веб-сервиса в конфигураторе должен быть установлен как string (http://www.w3.org/2001/XMLSchema).


Функция ПолучитьДанныеФайла(КодОбъекта)
    // Допустим, мы ищем файл в справочнике
    СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоКоду(КодОбъекта);
    Если СсылкаНаОбъект.Пустая() Тогда
        Возврат "";
    КонецЕсли;

    // Извлекаем ДвоичныеДанные из ХранилищаЗначения
    ДвоичныеДанные = СсылкаНаОбъект.ФайлХранилище.Получить();
    
    Если ТипЗнч(ДвоичныеДанные) <> Тип("ДвоичныеДанные") Тогда
        Возврат ""; // Или обработка ошибки
    КонецЕсли;

    // Преобразуем в строку Base64
    Возврат Base64Строка(ДвоичныеДанные);
КонецФункции

Шаг 2. На стороне приемника (Обработка):

При получении ответа от веб-сервиса мы выполняем обратное преобразование.


// Вызов веб-сервиса через WSПрокси
РезультатСтрока = Прокси.ПолучитьДанныеФайла("00001");

Если ЗначениеЗаполнено(РезультатСтрока) Тогда
    // Превращаем строку обратно в ДвоичныеДанные
    ДанныеФайла = Base64Значение(РезультатСтрока);
    // Теперь данные можно сохранить на диск или поместить в ХранилищеЗначения
    НовоеХранилище = Новый ХранилищеЗначения(ДанныеФайла);
КонецЕсли;

Решение №2: Передача табличных документов

Часто возникает необходимость передать печатную форму (объект ТабличныйДокумент). Напрямую передать его невозможно, так как это сложный визуальный объект. Разберем, как проанализировать ситуацию и выбрать правильный формат.

Рассмотрим два основных подхода:

  1. Сохранение в PDF или MXL: Мы сохраняем документ во временный файл, читаем его как ДвоичныеДанные и передаем через Base64 (как описано выше). Это гарантирует сохранение форматирования.
  2. Сериализация в XML: Мы можем преобразовать сам объект ТабличныйДокумент в XML-строку.

Пример сериализации табличного документа в строку:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТабДок);
СтрокаXML = ЗаписьXML.Закрыть();
// Эту строку теперь можно передавать как обычный параметр типа string

Анализ ошибки «Значение не является значением объектного типа (Тип)»

Эта ошибка часто сбивает с толку при работе с WSПрокси. Выясним причину ее возникновения. Обычно она проявляется в строке кода, где вы пытаетесь создать объект XDTO через прокси, например: Прокси.ФабрикаXDTO.Создать(ТипXDTO).

Если ТипXDTO не был определен корректно или веб-сервис не предоставил описание этого типа в WSDL, переменная будет иметь значение Неопределено. Попытка обращения к свойству или методу Неопределено и вызывает данную ошибку.

Как проверить:

Рекомендации по типам данных в XDTO

Для стабильной работы обмена старайтесь придерживаться следующих правил:

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

← На главную