При интеграции двух или более информационных баз 1С через веб-сервисы разработчики часто сталкиваются с двумя типовыми задачами: передачей ссылочных данных (элементов справочников, документов) и передачей бинарных файлов (изображений, сканов документов, архивов). Разберем особенности реализации каждого из этих механизмов, возможные ошибки и лучшие практики.
Прямая передача типа СправочникСсылка между независимыми базами данных невозможна, так как ссылочный тип имеет смысл только в контексте своей базы данных. Если передать ссылку напрямую через сериализатор XDTO (СериализаторXDTO), на стороне базы-приемника прочитается ссылка с тем же УникальныйИдентификатор (GUID). Если элемент с таким идентификатором в приемнике еще не существует, 1С вернет «битую» ссылку со значением «Объект не найден».
Рассмотрим основные способы корректного сопоставления данных между базами:
Вместо ссылки база-источник передает текстовое значение уникального реквизита. На стороне базы-приемника в методе веб-сервиса выполняется поиск существующего элемента.
Посмотрим на пример поиска элемента по коду:
Функция НайтиИлиСоздатьНоменклатуру(КодНоменклатуры, НаименованиеНоменклатуры)
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
Если СсылкаНаЭлемент.Пустая() Тогда
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Код = КодНоменклатуры;
НовыйОбъект.Наименование = НаименованиеНоменклатуры;
НовыйОбъект.Записать();
Возврат НовыйОбъект.Ссылка;
КонецЕсли;
Возврат СсылкаНаЭлемент;
КонецФункции
Если справочники в обеих базах должны иметь одинаковые внутренние идентификаторы, передается строковое представление GUID: Строка(Ссылка.УникальныйИдентификатор()). На стороне приемника ссылка восстанавливается по GUID.
Разберем код сопоставления и создания объекта с фиксированным GUID:
Функция ПолучитьЭлементПоGUID(СтрокаGUID, ИмяСправочника, ИмяЭлемента)
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаЭлемент = Справочники[ИмяСправочника].ПолучитьСсылку(Идентификатор);
// Проверяем, существует ли объект в базе данных
Если СсылкаНаЭлемент.ПолучитьОбъект() = Неопределено Тогда
НовыйОбъект = Справочники[ИмяСправочника].СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(СсылкаНаЭлемент);
НовыйОбъект.Наименование = ИмяЭлемента;
НовыйОбъект.Записать();
КонецЕсли;
Возврат СсылкаНаЭлемент;
КонецФункции
Для сложных интеграций типовых конфигураций рекомендуется использовать пакеты XDTO стандарта EnterpriseData, в которых правила сопоставления по ключевым реквизитам и GUID уже стандартизированы платформой.
Передача файлов и картинок в формате ДвоичныеДанные через SOAP-веб-сервисы реализуется штатным механизмом сериализации XDTO. Платформа 1С поддерживает автоматическое кодирование бинарных данных в строку Base64.
Разберем по шагам настройку и использование веб-сервиса для передачи двоичных данных:
В свойствах параметра веб-сервиса (или возвращаемого значения) необходимо выбрать тип XSD base64Binary из пространства имен http://www.w3.org/2001/XMLSchema. В этом случае платформа автоматически выполнит упаковку и распаковку данных типа ДвоичныеДанные.
Если данные передаются внутри сложного XML- или JSON-документа как строка, применяются встроенные функции 1С:
// На стороне отправителя (кодирование файла в Base64)
ДвоичныеДанныеФайла = Новый ДвоичныеДанные("C:\Images\picture.png");
СтрокаBase64 = Base64Строка(ДвоичныеДанныеФайла);
// На стороне получателя (декодирование обратно в ДвоичныеДанные)
ПолученныеДвоичныеДанные = Base64Значение(СтрокаBase64);
ПолученныеДвоичныеДанные.Записать("C:\Images\received_picture.png");
Проанализируем технические нюансы работы с большими файлами через SOAP:
HTTPСервисЗапрос.ПолучитьТелоКакДвоичныеДанные() или HTTPСервисЗапрос.ПолучитьТелоКакПоток(), что существенно снижает нагрузку на сервер.