Как передавать ссылки на элементы справочников и двоичные данные через веб-сервисы в 1С?

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

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

Передача ссылочных данных между базами 1С

Прямая передача типа СправочникСсылка между независимыми базами данных невозможна, так как ссылочный тип имеет смысл только в контексте своей базы данных. Если передать ссылку напрямую через сериализатор XDTO (СериализаторXDTO), на стороне базы-приемника прочитается ссылка с тем же УникальныйИдентификатор (GUID). Если элемент с таким идентификатором в приемнике еще не существует, 1С вернет «битую» ссылку со значением «Объект не найден».

Рассмотрим основные способы корректного сопоставления данных между базами:

  1. Синхронизация по уникальным бизнес-ключам (Код, Артикул, ИНН):

    Вместо ссылки база-источник передает текстовое значение уникального реквизита. На стороне базы-приемника в методе веб-сервиса выполняется поиск существующего элемента.

    Посмотрим на пример поиска элемента по коду:

    
    Функция НайтиИлиСоздатьНоменклатуру(КодНоменклатуры, НаименованиеНоменклатуры)
        СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
        Если СсылкаНаЭлемент.Пустая() Тогда
            НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
            НовыйОбъект.Код = КодНоменклатуры;
            НовыйОбъект.Наименование = НаименованиеНоменклатуры;
            НовыйОбъект.Записать();
            Возврат НовыйОбъект.Ссылка;
        КонецЕсли;
        Возврат СсылкаНаЭлемент;
    КонецФункции
    
  2. Синхронизация по GUID (УникальныйИдентификатор):

    Если справочники в обеих базах должны иметь одинаковые внутренние идентификаторы, передается строковое представление GUID: Строка(Ссылка.УникальныйИдентификатор()). На стороне приемника ссылка восстанавливается по GUID.

    Разберем код сопоставления и создания объекта с фиксированным GUID:

    
    Функция ПолучитьЭлементПоGUID(СтрокаGUID, ИмяСправочника, ИмяЭлемента)
        Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
        СсылкаНаЭлемент = Справочники[ИмяСправочника].ПолучитьСсылку(Идентификатор);
        
        // Проверяем, существует ли объект в базе данных
        Если СсылкаНаЭлемент.ПолучитьОбъект() = Неопределено Тогда
            НовыйОбъект = Справочники[ИмяСправочника].СоздатьЭлемент();
            НовыйОбъект.УстановитьСсылкуНового(СсылкаНаЭлемент);
            НовыйОбъект.Наименование = ИмяЭлемента;
            НовыйОбъект.Записать();
        КонецЕсли;
        
        Возврат СсылкаНаЭлемент;
    КонецФункции
    
  3. Использование универсального формата EnterpriseData:

    Для сложных интеграций типовых конфигураций рекомендуется использовать пакеты XDTO стандарта EnterpriseData, в которых правила сопоставления по ключевым реквизитам и GUID уже стандартизированы платформой.

Передача картинок и двоичных данных через SOAP Web-сервисы

Передача файлов и картинок в формате ДвоичныеДанные через SOAP-веб-сервисы реализуется штатным механизмом сериализации XDTO. Платформа 1С поддерживает автоматическое кодирование бинарных данных в строку Base64.

Разберем по шагам настройку и использование веб-сервиса для передачи двоичных данных:

  1. Настройка параметров операции в конфигураторе:

    В свойствах параметра веб-сервиса (или возвращаемого значения) необходимо выбрать тип XSD base64Binary из пространства имен http://www.w3.org/2001/XMLSchema. В этом случае платформа автоматически выполнит упаковку и распаковку данных типа ДвоичныеДанные.

  2. Ручная сериализация через Base64:

    Если данные передаются внутри сложного XML- или JSON-документа как строка, применяются встроенные функции 1С:

    
    // На стороне отправителя (кодирование файла в Base64)
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные("C:\Images\picture.png");
    СтрокаBase64 = Base64Строка(ДвоичныеДанныеФайла);
    
    // На стороне получателя (декодирование обратно в ДвоичныеДанные)
    ПолученныеДвоичныеДанные = Base64Значение(СтрокаBase64);
    ПолученныеДвоичныеДанные.Записать("C:\Images\received_picture.png");
    

Ограничения и альтернатива: использование HTTP-сервисов

Проанализируем технические нюансы работы с большими файлами через SOAP:

  1. Накладные расходы Base64: Кодирование в Base64 увеличивает объем передаваемого сообщения примерно на 33%, что повышает нагрузку на сеть.
  2. Потребление оперативной памяти: При XML-сериализации весь объем двоичных данных помещается в память рабочего процесса сервера 1С, что при передаче больших файлов может вызывать ошибку нехватки памяти.
  3. Альтернативный вариант — HTTP-сервисы: Для регулярного обмена медиафайлами, документами и картинками предпочтительно использовать объект метаданных HTTP-сервис. В этом случае файл передается в «сыром» виде напрямую в теле HTTP-запроса, а на стороне сервиса считывается методом HTTPСервисЗапрос.ПолучитьТелоКакДвоичныеДанные() или HTTPСервисЗапрос.ПолучитьТелоКакПоток(), что существенно снижает нагрузку на сервер.
← На главную