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");
КонецЦикла;