1C Odata получение данных справочника из другой базы

В примере рассмотрим задачу при которой в программе 1С документооборот необходимо формировать заявку на закупку, но при этом соответствующего справочника в документообороте нет.

Данные о номенклатуре необходимо получать из справочника номенклатуры из 1С:Бухгалтерии.

Публикация справочника через Odata в базе источнике

На стороне базы источника при публикации информационной базы достаточно отметить флаг Публиковать стандартный интерфейс OData и опубликовать на веб-сервере.

Кроме этого необходимо в режиме предприятия добавить состав объектов публикуемых через Odata, сделать можно с помощью обработки.

Код обработки выглядит так:

После публикации можно проверить работу веб-сервиса через обычный браузер введя строку :

http://localhost/buh/odata/standard.odata/Catalog_Номенклатура?$format=json

Возможные имена ресурсов для объектов конфигурации

Объект конфигурацииПрефикс имени в URL
СправочникCatalog
ДокументDocument
Журнал документовDocumentJournal
КонстантаConstant
План обменаExchangePlan
План счетовChartOfAccounts
План видов расчетаChartOfCalculationTypes
План видов характеристикChartOfCharacteristicTypes
Регистр сведенийInformationRegister
Регистр накопленияAccumulationRegister
Регистр расчетаCalculationRegister
Регистр бухгалтерииAccountingRegister
Бизнес-процессBusinessProcess
ЗадачаTask

В строке указывается, что нам необходимо получить данные справочника Номенклатура в формате json. Сервис потребует авторизацию, необходимо ввести пользователя информационной базы и пароль:

Вот пример возвращаемых данных:

Получение данных через HTTP сервис в базе приемнике

Теперь необходимо на стороне приемника вывести данные в форму для выбора пользователем. В таком виде это реализовано у меня.

Задача решается с помощью http сервиса получающего данные из json, вот код функции которая получает данные из odata и переводит в массив.

Я в расширении создал общий модуль ТМЦ_ОбщийМодульПовтИспользование, в котором разместил данную функцию и передаю в качестве результата массив УИДов и наименований номенклатуры.

Функция ЗагрузкаНоменклатурыИзODATA() Экспорт;

	СерверИсточник = "localhost";
	Сообщение = Новый СообщениеПользователю;
	Попытка
	// Создать HTTP-соединение с сервером localhost.
	HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
	
	HTTPСоединение = Новый HTTPСоединение(
        СерверИсточник, // сервер (хост)
        80, // порт, по умолчанию для http используется 80, для https 443
        "ВолковАВ", // пользователь для доступа к серверу (если он есть)
        "12345", // пароль для доступа к серверу (если он есть)
        , // здесь указывается прокси, если он есть
        , // таймаут в секундах, 0 или пусто - не устанавливать
          // защищенное соединение, если используется https
    );
	Исключение

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

	// Сформировать строку URL.
	АдресРесурса = "/buh/odata/standard.odata/Catalog_Номенклатура?$format=json&$select=Ref_Key, Description&$orderby=Code asc";
	
	Заголовки = Новый Соответствие(); 
	Заголовки.Вставить("Content-Type", "application/json");

	// Создать HTTP-запрос на основе URL.
	HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
	
	Попытка
		// Получить ответ сервера в виде объекта HTTPОтвет.
		Результат = HTTPСоединение.Получить(HTTPЗапрос);
		// Получить содержимое ответа сервера в виде строки.
		РезультатСтрока = Результат.ПолучитьТелоКакСтроку("UTF-8"); 
		Сообщение.Текст = РезультатСтрока; 
		//Сообщение.Сообщить();
		
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(РезультатСтрока);
		
		ОбъектJSON = ПрочитатьJSON(ЧтениеJSON, Истина,,,,,,);
		МассивПолученный = ОбъектJSON.Получить("value");
				
		Возврат МассивПолученный;
		
	Исключение
		
		// Вывести сообщение об ошибке при получении ответа сервера.
		Сообщение.Текст = ОписаниеОшибки(); 
		Сообщение.Текст = "Ошибка";
		Сообщение.Сообщить();
		Возврат Ложь;
		
	КонецПопытки;
	
КонецФункции

Далее данный массив можно вывести в табличную часть на форму, обращаясь к функции через общий модуль ТМЦ_ОбщийМодульПовтИспользование.ЗагрузкаНоменклатурыИзODATA().

У меня это реализовано на общей форме, при открытии которой происходит вызов функции получения номенклатуры и вывод ее в таблицу значений.

МассивПолученный = ТМЦ_ОбщийМодульПовтИспользование.ЗагрузкаНоменклатурыИзODATA();
	
	Для Каждого Строка ИЗ МассивПолученный Цикл	
		НоваяСтрока 				= ЭтаФорма.НоменклатураТЗ.Добавить();
		НоваяСтрока.Наименование 	= Строка.Получить("Description");
		НоваяСтрока.Ref_Key 		= Строка.Получить("Ref_Key");
	КонецЦикла;

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *