hsИнтегратор 2. Онлайновый обмен и удаленное исполнение функций по HTTP протоколу

Публикация № 1062681

Обмен - Перенос данных из 1C8 в 1C8

Обмен HTTP удаленное исполнение

11
Расширенная версия технологии обмена данными и удаленного исполнения функций.

Развитие и расширение технологии, опубликованной ранее //1cstart.kz/public/852394/

  • Организация онлайнового обмена данными и удаленного исполнения функций между базами данных на платформе 1С:Предприятие, начиная с версии платформы 8.3.9. Обмен выполняется по протоколу HTTP между любыми конфигурациями, в том числе развернутыми на мобильной платформе.

  • Организация и настройка обмена выполняется без изменения существующих конфигураций, с использованием расширения конфигурации hsИнтегратор (в мобильной платформе расширения не поддерживаются, необходимо внедрение объектов метаданных hsИнтегратор) в мобильную конфигурацию.

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

  • Обмен данными и удаленное исполнение функций использует простую парадигму: Y = F(X), где F – имя функции в модуле удаленного исполнения, X – параметр функции. Всё, что описано ниже для параметра, также применимо и к результату функции (Y), который возвращается клиенту сервиса hsИнтегратор.

    В качестве параметра можно использовать примитивные типы данных, коллекции (в том числе содержащие другие коллекции) — структуры, соответствия, массивы, таблицы значений. Колонки таблиц значений также могут быть коллекциями. Для передачи объектов базы данных используется результат запроса, преобразованный в таблицу значений, которая содержит только примитивные типы данных. Ссылки преобразуются в специальный строчный формат, например СПР.Контрагенты.<GUID> - это предствление ссылки, созданное сервисом для базы приемника.

    При получении данных второй стороной обмена таблица значений преобразуется в массив объектов, которые могут быть созданы фабрикой приемника. Функции преобразования могут вызывать определенные в модуле обмена функции замен, которые позволяют сформировать представление данных для клиента в тех случаях, когда типы и организация данных на клиенте и сервере отличаются (преобразование одного объекта в два, два в один, изменение типа данных и др.).
    Для передачи всех данных объектов с совпадающей структурой можно формировать данные для передачи с помощью запроса «по звездочке». Объем передаваемых данных можно значительно сократить, если в запросе указывать только нужные реквизиты и табличные части. Если имена реквизитов на премнике данных отличаются, в запросе можно определить имена для приемника с помощью оператора «КАК». Если отличаются имена табличных частей, для табличной части также используется оператор «КАК». Реквизиты, полученные в данных и отсутствующие в объектах приемника, не копируются. Поэтому если в источнике изменится структура данных (добавлен реквизит), а данные получены запросом «через звездочку», приемник будет успешно получать данные. Если же впоследствии в конфигурации приемника добавить реквизит с таким же именем, при следующих обменах приемник начнет получать данные нового реквизита.

  • При получении объектов приемником возможно автоматически рекурсивно запрашивать объекты по ссылкам на сервере. Причем запись всех данных полученных данных производится на приемнике в единой транзакции. Возможны следующие варианты:
    1) не запрашивать объекты по ссылкам
    2) запрашивать объекты по ссылкам всегда, если ссылка отсутствует на приемнике.
    3) запрашивать объекты по ссылкам, если ссылка отсутствует на приемнике ИЛИ версии данных объекта на приемнике и источнике отличаются.

  • Вторая версия hsИнтегратор поддерживает передачу следующих типов объектов:
    - элементы справочников, документов, планов видов характеристик, планов счетов (в том числе предопределенные)
    - значения перечислений (также с помощью функций замен можно преобразовать к существующим на приемнике).
    - данные регистров сведений (независимых и подчиненных регистатору), накопления, бухгалтерии. Если регистратор отсутствует и не был определен для приемника, запись на приемнике создана не будет.

  • При передаче между источником и приемником (и обратно) данные могут быть сериализованы в строку JSON (при обмене с мобильной платформой возможен только этот вариант), Base64 или передаваться в бинарном виде — это самый экономный вариант.

  • Передаваемые данные автоматически разбиваются на пакеты заданного размера, чтобы не превышать ограничения Web-сервера. Размер пакетов может быть задан отдельно для сервера и для клиента.

  • Функции удаленного исполнения могут исполняться сервисом:

    - в синхронном режиме. В том случае, если функция исполняется на сервере быстро и загрузка сервера небольшая (несколько десятков запросов в секунду), целесообразно использовать данный режим, поскольку он обеспечивает минимальное время отклика сервиса.
    - в асинхронном режиме, а сеансах Web-сервера (большое количество длительных запросов).
    - в асинхронном режиме, в фоновых процессах сервера 1С. Количество фоновых процессов задаётся для каждого пользователя, под именем которого исполняется функция удаленного исполнения. Это самый масштабируемый вариант, поскольку позволяет снизить нагрузку на Web-сервер и перенести вычисления на кластер серверов 1С.

Пример кода для загрузки данных независимого регистра сведений и регистра бухгалтерии на стороне клиента и сервера. Это самый сложный пример, загружаются
данные регистров сведений и рекурсивно объекты по ссылкам в регистрах. Причем объекты запрашиваются на сервере только при отсутствии на клиенте или если различаются версии данных объектов.
Сторона клиента:
 

&НаСервере
Процедура ТестОбмена_3_1НаСервере(Знач ИмяФункцииНаСервере, JSONУпаковка, Асинхронно, КоличествоДокументов)
	
	#Если Не МобильноеПриложениеСервер И Не ТолстыйКлиентУправляемоеПриложение И Не ТолстыйКлиентОбычноеПриложение Тогда
		
		ИмяМодуля             = ИмяМодуля();
		ИмяНастройки          = ИмяНастройки();
		ИменаФункцийЗамен     = "ЗаменыПараметров/ЗаменыОтвета";
		ИменаЗаменБитыхСсылок = "БитыеСсылкиЗаменаПараметров/ЗаменыОтвета"; 
		ИмяФункцииНаСервере   = ИмяФункцииНаСервере + "/" + ИменаФункцийЗамен;
		
		Парам = Новый Структура("КоличествоЗаписей", КоличествоЗаписей);
		
		КоличествоДней = 0;
		ОбъектыДляЗаписи = Новый Соответствие;
		
		// Запросим обновления для зарегистрированных на клиенте версий объекта сервера 
    	Справочники.hsИнтегратор.ЗапроситьОбновленияКлиент(ИмяНастройки, ИмяМодуля,	ОбъектыДляЗаписи, РазрешимыеСсылки(), JSONУпаковка, Асинхронно, ИменаЗаменБитыхСсылок, БинарныйОбмен,КоличествоДней);
		
		// запросим с сервера записи двух регистров
		Результат = Справочники.hsИнтегратор.ЗапроситьСервер(ИмяНастройки, ИмяМодуля, ИмяФункцииНаСервере, Парам, Асинхронно, JSONУпаковка, БинарныйОбмен);
		Если Справочники.hsИнтегратор.ОшибкаВРезультате(Результат) Тогда
			Возврат;
		КонецЕсли;	
		
		ТабБух = Результат.Ответ.РегистрБухгалтерии;  
		ТабСв  = Результат.Ответ.РегистрСведений;  
		
		БитыеСсылки = Новый Соответствие;
		
		//ПолучатьНовыеВерсииОбъектов = Истина;  // запрашивать объекты по ссылкам, даже если они уже есть на клиенте
		ПолучатьНовыеВерсииОбъектов = Ложь;      // запрашивать без рекурсивных запросов битых ссылок (они уже приехали с обновлениями)
		
		// Несколько регистров (наборов записей) с объектами
		
		// в соответствии БитыеСсылки накапливаются общие битые ссылки по двум полученным таблицам
		Справочники.hsИнтегратор.hsТаблицаВТаблицу(ТабБух, БитыеСсылки, ПолучатьНовыеВерсииОбъектов);
		Справочники.hsИнтегратор.hsТаблицаВТаблицу(ТабСв , БитыеСсылки, ПолучатьНовыеВерсииОбъектов);
		// запросим с сервера объекты по всем битым ссылкам
		Справочники.hsИнтегратор.ЗапроситьБитыеСсылкиКлиент(ИмяНастройки,БитыеСсылки,ИмяМодуля,,ОбъектыДляЗаписи, РазрешимыеСсылки() , ПолучатьНовыеВерсииОбъектов, JSONУпаковка, Асинхронно, ИменаЗаменБитыхСсылок, БинарныйОбмен);
		
		// построим коллекции для записи в единой транзакции
		КоллекцииДляЗаписи = Новый Структура;
		КоллекцииДляЗаписи.Вставить("Объекты", ОбъектыДляЗаписи);
		КоллекцииДляЗаписи.Вставить("РегБухгалтерии", Новый Структура("Таблица, ИмяРегистра",ТабБух, "РегистрыБухгалтерии.Хозрасчетный1" ));
		КоллекцииДляЗаписи.Вставить("РегСведений"   , Новый Структура("Таблица, ИмяРегистра",ТабСв , "РегистрыСведений.СчетаУчетаРасчетовСКонтрагентами1" ));
		
		// запишем коллекции
		ТекстОшибки = Справочники.hsИнтегратор.ЗаписатьКоллекции(КоллекцииДляЗаписи);
		
		
		Если ТекстОшибки <> "" Тогда
			Сообщить(ТекстОшибки);
		КонецЕсли;
		
	#КонецЕсли
	
КонецПроцедуры

Сторона сервера (модуль содержит все прикладные функции для трех тестов):
 

#Область СлужебныеПроцедуры
// Нужна при копировании текста модуля в модуль объекта подключаемой обработки
// (в этом случае функции удаленного исполнения переопределяются в модуле обработке
// в общем модуле не используется
Функция СведенияОВнешнейОбработке() Экспорт
	
	РегистрационныеДанные = Новый Структура;
	РегистрационныеДанные.Вставить("Наименование", "Это просто хранилище экспортных функций в модуле объекта");
	РегистрационныеДанные.Вставить("БезопасныйРежим", Истина);
	РегистрационныеДанные.Вставить("Версия", "1.00");
	
	РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
	РегистрационныеДанные.Вставить("Информация", "Хранилище экспортных функций для сервиса hsИнтегратор");
	
	Назначение = Новый Массив;
	РегистрационныеДанные.Вставить("Назначение", Назначение);	
	
	///////////// команды /////////////////////////
	тзКоманд = Новый ТаблицаЗначений;
	тзКоманд.Колонки.Добавить("Идентификатор");
	тзКоманд.Колонки.Добавить("Представление");
	тзКоманд.Колонки.Добавить("Модификатор");
	тзКоманд.Колонки.Добавить("ПоказыватьОповещение");
	тзКоманд.Колонки.Добавить("Использование");
	
	РегистрационныеДанные.Вставить("Команды", тзКоманд);
	Возврат РегистрационныеДанные;
	
КонецФункции

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

Функция ИмяМодуля() // имя этого модуля
	
	Возврат "hsМодульТестыОбмена";
	
КонецФункции	

Функция ИмяФункцииЗамен(ИмяФункции)  // возвращает полное имя функции
	
	Возврат ИмяМодуля() + "." + ИмяФункции;
	
КонецФункции	

#КонецОбласти 

#Область ФункцииУдаленногоВызова

//////////////////////////////////////////////////////////////////////
// Модуль содержит функции, вызываемые через HTTP-сервис hsExchange
// Коллекция Параметры передаётся клиентом, функция возвращает 
// коллекцию, передаваемую клиенту. 
// 
// Имя функции, передаваемое клиентом должно совпадать с именем одной
// из функций модуля.

Функция ТестОбмена_1_1(Параметры = Неопределено, СлужебнаяИнформация = Неопределено,ИмяЗаменПараметров = Неопределено,ИмяЗаменОтвета = Неопределено) Экспорт
	
	// Объекты передаются с преобразованием в hsТаблицы
	Запрос = Новый Запрос;
	Количество = Параметры.КоличествоКонтрагентов;
	
	// Поскольку запрос "по звездочке", в результат запроса на сервере 
	// попадут ссылки на ПВХ и характеристики, которые не поддерживаются мобильной платформой
	// Поэтому в мобильном приложении в справочнике контрагентов
	// удалить реквизит ДополнительныеРеквизиты.Свойство (все равно не заполняется)
	// и у реквизита ДополнительныеРеквизиты.Значение
	// заменить тип с Характеристика.ДополнительныеРеквизитыИСведения (характеристика в моб.приложении не поддерживается)
	//              на составной (любая ссылка, примитивные типы)
	// иначе будет "вылет" с ошибкой SDBL
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	*,
	|	Контрагенты.ИНН КАК ИНН
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	Контрагенты.ИНН = ""5260274718""
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ ПЕРВЫЕ <КоличествоКонтрагентов>
	|	*,
	|	Контрагенты.ИНН КАК ИНН
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты";
		
	Если Количество = 0 Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "<КоличествоКонтрагентов>","1");
	Иначе	
		Запрос.Текст = 
		СтрЗаменить(Запрос.Текст, "<КоличествоКонтрагентов>",Формат(Количество,"ЧДЦ=0; ЧГ=0"));
	КонецЕсли;	
	
	Пакет = Запрос.ВыполнитьПакет();
	ДеревоКонтрагенты = Пакет[0].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
	hsТаблицаКонтрагенты = Справочники.hsИнтегратор.КоллекцияВhsТаблицу(ДеревоКонтрагенты, ИмяФункцииЗамен(ИмяЗаменОтвета));
	
	Ответ = Новый Структура;
	Ответ.Вставить("Контрагенты",hsТаблицаКонтрагенты);
	
	Возврат Ответ;
	
КонецФункции	

//////////////////////////////////////////////////////////////////////
// Модуль содержит функции, вызываемые через HTTP-сервис hsExchange
// Коллекция Параметры передаётся клиентом, функция возвращает 
// коллекцию, передаваемую клиенту. 
// 
// Имя функции, передаваемое клиентом должно совпадать с именем одной
// из функций модуля.

Функция ТестОбмена_2_1(Параметры = Неопределено, СлужебнаяИнформация = Неопределено,ИмяЗаменПараметров = Неопределено,ИмяЗаменОтвета = Неопределено) Экспорт
	
	// Объекты передаются с преобразованием в hsТаблицы
	Запрос = Новый Запрос;
	Количество = Параметры.КоличествоДокументов;
	
	// Поскольку запрос "по звездочке", в результат запроса на сервере 
	// попадут ссылки на ПВХ и характеристики, которые не поддерживаются мобильной платформой
	// Поэтому в мобильном приложении в справочнике контрагентов
	// удалить реквизит ДополнительныеРеквизиты.Свойство (все равно не заполняется)
	// и у реквизита ДополнительныеРеквизиты.Значение
	// заменить тип с Характеристика.ДополнительныеРеквизитыИСведения (характеристика в моб.приложении не поддерживается)
	//              на составной (любая ссылка, примитивные типы)
	// иначе будет "вылет" с ошибкой SDBL
	Запрос.Текст =
	"ВЫБРАТЬ <КоличествоДокументов>
	|	*
	|ИЗ
	|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг";
		
	Если Количество = 0 Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "<КоличествоДокументов>","");
	Иначе	
		Запрос.Текст = 
		СтрЗаменить(Запрос.Текст, "<КоличествоДокументов>"," ПЕРВЫЕ " + XMLСтрока(Количество));
	КонецЕсли;	
	
	Пакет = Запрос.ВыполнитьПакет();
	ДеревоДокументы = Пакет[0].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
	hsТаблицаДокументы = Справочники.hsИнтегратор.КоллекцияВhsТаблицу(ДеревоДокументы, ИмяФункцииЗамен(ИмяЗаменОтвета));
	
	Ответ = Новый Структура;
	Ответ.Вставить("Документы",hsТаблицаДокументы);
	
	Возврат Ответ;
	
КонецФункции	

Функция ТестОбмена_3_1(Параметры = Неопределено, СлужебнаяИнформация = Неопределено,ИмяЗаменПараметров = Неопределено,ИмяЗаменОтвета = Неопределено) Экспорт
	
	// Объекты передаются с преобразованием в hsТаблицы
	Запрос = Новый Запрос;
	КоличествоЗаписей = Параметры.КоличествоЗаписей;
	
	// Поскольку запрос "по звездочке", в результат запроса на сервере 
	// попадут ссылки на ПВХ и характеристики, которые не поддерживаются мобильной платформой
	// Поэтому в мобильном приложении в справочнике контрагентов
	// удалить реквизит ДополнительныеРеквизиты.Свойство (все равно не заполняется)
	// и у реквизита ДополнительныеРеквизиты.Значение
	// заменить тип с Характеристика.ДополнительныеРеквизитыИСведения (характеристика в моб.приложении не поддерживается)
	//              на составной (любая ссылка, примитивные типы)
	// иначе будет "вылет" с ошибкой SDBL
	Запрос.Текст =
	"ВЫБРАТЬ <КоличествоЗаписей>
	|	*
	|ИЗ
	|	РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
	|;
	|ВЫБРАТЬ <КоличествоЗаписей>
	|	*
	|ИЗ
	|	РегистрСведений.СчетаУчетаРасчетовСКонтрагентами КАК СчетаУчетаРасчетовСКонтрагентами";
	
	Если КоличествоЗаписей = 0 Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "<КоличествоЗаписей>","");
	Иначе	
		Запрос.Текст = 
		СтрЗаменить(Запрос.Текст, "<КоличествоЗаписей>"," ПЕРВЫЕ " + XMLСтрока(КоличествоЗаписей));
	КонецЕсли;	
	
	
	Пакет = Запрос.ВыполнитьПакет();
	БухРегистр = Пакет[0].Выгрузить();
	hsРегистрБухгалтерии = Справочники.hsИнтегратор.КоллекцияВhsТаблицу(БухРегистр, ИмяФункцииЗамен(ИмяЗаменОтвета));
	
	СвРегистр = Пакет[1].Выгрузить();
	hsРегистрСведений = Справочники.hsИнтегратор.КоллекцияВhsТаблицу(СвРегистр, ИмяФункцииЗамен(ИмяЗаменОтвета));
	
	Ответ = Новый Структура;
	Ответ.Вставить("РегистрБухгалтерии",hsРегистрБухгалтерии);
	Ответ.Вставить("РегистрСведений"   ,hsРегистрСведений);
	
	Возврат Ответ;
	
КонецФункции	

Функция СоответствиеТипов() // ключ - имя hsТипа клиента, значение - имя hsТипа сервера
	
	Соответствие = Новый Соответствие;
	//                     тип в базе клиента                       тип в базе сервера
	Соответствие.Вставить("СПР.Номенклатура1"                    , "СПР.Номенклатура");
	Соответствие.Вставить("СПР.Контрагенты1"                     , "СПР.Контрагенты");
	Соответствие.Вставить("СПР.СтраныМира1"                      , "СПР.СтраныМира");
	Соответствие.Вставить("СПР.ЗначенияСвойствОбъектов1"         , "СПР.ЗначенияСвойствОбъектов");
	Соответствие.Вставить("ДОК.РеализацияТоваровУслуг1"          , "ДОК.РеализацияТоваровУслуг");
	Соответствие.Вставить("ПВХ.ДополнительныеРеквизитыИСведения1", "ПВХ.ДополнительныеРеквизитыИСведения");
	Соответствие.Вставить("ПВХ.ВидыСубконтоХозрасчетные1"        , "ПВХ.ВидыСубконтоХозрасчетные");
	Соответствие.Вставить("ПРЧ.ЮрФизЛицо1"                       , "ПРЧ.ЮрФизЛицо");
	Соответствие.Вставить("ПСЧ.Хозрасчетный1"                    , "ПСЧ.Хозрасчетный");
	Соответствие.Вставить("СПР.НоменклатурныеГруппы1"            , "СПР.НоменклатурныеГруппы");
	Соответствие.Вставить("СПР.Субконто1"                        , "СПР.Субконто");
	Соответствие.Вставить("ПРЧ.ВидыРасчетовПоДоговорам1"         , "ПРЧ.ВидыРасчетовПоДоговорам");
	
	Возврат Соответствие;
	
КонецФункции	

Функция ОбратноеСоответствиеТипов() // ключ - имя hsТипа сервера, значение - имя hsТипа клиента
	
	Возврат Справочники.hsИнтегратор.РеверсСоответствия(СоответствиеТипов());
	
КонецФункции	

Функция ЗаменыОтвета(Имя,                             // Имя в источнике    
	Значение,                        // Значение в источнике
	КонтекстОбъекта = Неопределено,  // строка таблицы значений, поля которой соответствуют реквизитам строки
	КонтекстСтроки = Неопределено) 
	Экспорт
	
	ТипОбъекта = "";  // тип объекта метаданных ("Документ", "Справочник", "Перечисление" и т.д.) в приемнике
	// типы в источнике и приемнике могут отличаться (справочник в документ и др.)
	ИмяОбъекта = "";  // имя объекта метаданных в приемнике 
	ЗначениеРеквизита = Неопределено;  // преобразованное для получения приемником Значение
	
	Если КонтекстОбъекта = Неопределено Тогда  
		// если нет контекста объекта, это запрос имени типа
		ИмяТипаНаКлиенте = ОбратноеСоответствиеТипов().Получить(Имя);
		Возврат ?(ИмяТипаНаКлиенте = Неопределено, Имя, ИмяТипаНаКлиенте);
	Иначе	
		ТипЗн = Справочники.hsИнтегратор.ДанныеРеквизита(Имя, Значение, ТипОбъекта, ИмяОбъекта, ЗначениеРеквизита);
	КонецЕсли;
	
	// пример переопределения имени предопределенного счета для базы клиента
	Если Имя = "ИмяПредопределенныхДанных"
		И КонтекстОбъекта <> Неопределено 
		И Значение = "РасчетыСПокупателямиИЗаказчиками" 
		И Лев(КонтекстОбъекта._hs_Ссылка_Ссылка,4)= "ПСЧ." Тогда
		Значение = "РасчетыСоВсякими";    // такое имя предопределенных данных у счета на клиенте
		Возврат Значение; 
	КонецЕсли;	
	
	Если Не Справочники.hsИнтегратор.ЭтоСсылка(Значение) 
		Тогда
		Возврат Значение;
	КонецЕсли;
	
	
	ИмяТипаНаСервере = ТипОбъекта + "." + ИмяОбъекта;
	ИмяТипаНаКлиенте = ОбратноеСоответствиеТипов().Получить(ИмяТипаНаСервере);
	Если ИмяТипаНаКлиенте <> Неопределено Тогда
		Лексемы = СтрРазделить(ИмяТипаНаКлиенте,"."); 
		ТипОбъекта = Лексемы[0];
		ИмяОбъекта = Лексемы[1];
	КонецЕсли;

	Возврат Справочники.hsИнтегратор.hsСсылка(ТипОбъекта, ИмяОбъекта, ЗначениеРеквизита);
	
КонецФункции	

Функция БитыеСсылкиЗаменаПараметров(БитыеСсылки) Экспорт
	
	Замена = Новый Соответствие;
	Для каждого Эл Из БитыеСсылки Цикл
		Ключ = СоответствиеТипов().Получить(Эл.Ключ);
		Если Ключ <> Неопределено Тогда
			Замена.Вставить(Ключ, Эл.Значение);
		Иначе	
			Замена.Вставить(Эл.Ключ, Эл.Значение);
		КонецЕсли;
	КонецЦикла;
	Возврат Замена;
	
КонецФункции

Функция ТекстыЗапросовБитыхСсылок()
	
	// если не хотим передавать клиенту лишнюю информацию об объектах,
	// которая всё равно не используется на клиенте, вместо "универсального"
	// запроса объекта по "звездочке", укажем конкретные поля в запросе
	// Все подобные запросы должны включать условие
	// 
	//  |ГДЕ
	//  |	<ИмяТаблицы>.Ссылка В(&Ссылки)";	
	//
	// ... можно вынести эту функцию в модуль повторного использования, но
	//     тогда нельзя будет перегружать модуль из доп.обработки
	//     
	Тексты = Новый Соответствие;
	
	// определение возвращаемых клиенту данных для битых ссылок справочника СтраныМира
	Тексты.Вставить("СПР.СтраныМира",
	"ВЫБРАТЬ
	|	СтраныМира.Ссылка КАК Ссылка,
	|	СтраныМира.Наименование КАК Наименование,
	|	СтраныМира.НаименованиеПолное КАК НаименованиеПолное,
	|	СтраныМира.КодАльфа2 КАК КодАльфа2,
	|	СтраныМира.КодАльфа3 КАК КодАльфа3,
	|	СтраныМира.ПометкаУдаления КАК ПометкаУдаления
	|ИЗ
	|	Справочник.СтраныМира КАК СтраныМира
	|ГДЕ
	|	СтраныМира.Ссылка В(&Ссылки)");
	
	Возврат Тексты;
	
КонецФункции

Функция ЗапросБитыхСсылок(Параметры = Неопределено, 
	СлужебнаяИнформация = Неопределено,
	ИмяФункцииЗаменДляПараметров = Неопределено,
	ИмяФункцииЗаменДляОтвета = Неопределено) Экспорт
	
	// ВАЖНО !
	// "ТекстыЗапросовБитыхСсылок" - зарезервированное имя параметра, используется в функции hsИнтегратор.ЗапросБитыхСсылок()
	
	Параметры.Вставить("ТекстыЗапросовБитыхСсылок", ТекстыЗапросовБитыхСсылок());
	Возврат hsИнтегратор.ЗапросБитыхСсылок(Параметры, СлужебнаяИнформация, ИмяФункцииЗаменДляПараметров, ИмяФункцииЗаменДляОтвета, ИмяМодуля());
	
КонецФункции	

Функция ЗапросОбновленияОбъектов(Параметры = Неопределено, 
	СлужебнаяИнформация = Неопределено,
	ИмяФункцииЗаменДляПараметров = Неопределено,
	ИмяФункцииЗаменДляОтвета = Неопределено) Экспорт
	
	// ВАЖНО !
	// "ТекстыЗапросовБитыхСсылок" - зарезервированное имя параметра, используется в функции hsИнтегратор.ЗапросБитыхСсылок()
	
	Параметры.Вставить("ТекстыЗапросовБитыхСсылок", ТекстыЗапросовБитыхСсылок());
	Возврат hsИнтегратор.ЗапросОбновленияОбъектов(Параметры, СлужебнаяИнформация, ИмяФункцииЗаменДляПараметров, ИмяФункцииЗаменДляОтвета, ИмяМодуля());

КонецФункции	

Функция ПолученоФотоКонтрагента(Параметры = Неопределено, 
	СлужебнаяИнформация = Неопределено,
	ИмяФункцииЗаменДляПараметров = Неопределено,
	ИмяФункцииЗаменДляОтвета = Неопределено) Экспорт

    Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Параметры.GUID);
	Об = Ссылка.ПолучитьОбъект();
	Об.Фото = Новый ХранилищеЗначения(Параметры.ДвДанные);
	Об.Записать();
	
КонецФункции	
#КонецОбласти 


Технология обмена hsИнтегратор является универсальной,  работает под управлением платформы 1С:Предприятие, начиная с версии 8.3.9 под Windows, Linux, на мобильной платформе.

Однако для мобильной платформы имеются следующие ограничения:

  • hsИнтегратор работает только в качестве клиента (HTTP-сервисы мобильная платформа не поддерживает).
  • код расширения hsИнтегратор необходимо непосредственно внедрять в мобильную конфигурацию (мобильная платформа не поддерживает расширения)
  • в мобильной платформе отсутствует ряд объектов метаданных (планы видов характеристик, планы счетов и др.). Поэтому, при необходимости, данные таких объектов необходимо передавать, например, как элементы справочников.
11

Скачать файлы

Наименование Файл Версия Размер
Выгрузка демобазы клиента, расширение hsИнтегратор и файл hsИнтегратор.odt с описанием технологии и настройки.
.zip 4,48Mb
19.05.19
3
.zip 4,48Mb 3 Скачать
hsИнтегратор.odt. Описание возможностей и настройки обмена с демонстрационной базой «Бухгалтерия предприятия, редакция 3.0».
.odt 1,35Mb
19.05.19
2
.odt 1,35Mb 2 Скачать

См. также

Специальные предложения

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение