Введение в Open Data Protocol
В 1С Предприятие 8.3.5.1068 появилась поддержка автоматического REST-сервиса. Теперь платформа может автоматически формировать REST интерфейс для всего прикладного решения. Вы привычным образом публикуете его на веб-сервере, и после этого сторонние системы могут обращаться к вашему приложению с помощью HTTP запросов. В качестве протокола доступа платформа использует протокол OData версии 3.0. Это открытый веб-протокол для запроса и обновления данных. Он позволяет оперировать данными, используя в качестве запросов HTTP-команды. Получать ответы можно в различных форматах, но пока присутствует поддержка формата Atom/XML.
7 причин, почему интеграция стала приятной
- Платформа автоматически генерирует REST интерфейс, не нужно никакого программирования;
- Прозрачная интеграция прикладного решения с интернет-сайтами, мобильными приложениями и прочими системами;
- Реализация сторонними средствами дополнительной функциональности без изменения конфигурации;
- Загрузка данных в прикладное решение и выгрузка данных из него;
- Управление составом объектов метаданных, доступных через стандартный сервис OData API на лету;
- Ограничения прав доступа пользователей также действительны для запросов OData;
- Универсальность и кроссплатформенность.
Подготовительный этап
- Версия платформы «1С:Предприятие 8» — не ниже 8.3.5.1068;
- Режим совместимости конфигурации — "Не использовать" или не ниже "Версия 8.3.5";
- Включен флаг "Публиковать стандартный интерфейс OData";
- Определить состав объектов метаданных, доступных через стандартный сервис OData;
- Проверить работоспособность сервиса по ссылкам:
http://{АдресВебСервера}/{ИмяПубликации}/odata/standard.odata;
http://{АдресВебСервера}/{ИмяПубликации}/odata/standard.odata/$metadata; - Посмотреть, проходит ли валидацию описание сервиса по ссылке.
Возникают трудности? Посмотрите видео:
Если возникают проблемы с валидацией, нужно обратиться по адресу https://partners.v8.1c.ru/forum/. Использовать веб-сервис все равно можно, даже если валидация не удалась.
Обработка для определения состава метаданных, доступных через стандартный сервис OData, прикреплена в конце статьи.
Интеграция с Excel
Бывают случаи, когда нужно получить данные из информационной базы «1С:Предприятие 8» и быстро обработать их. Работая с бизнес-аналитиками, руководителями потребность в данных есть всегда. Чаще всего информацию получить сложно без привлечения программиста, да и процесс передачи понимания, что же нужно, не так прост. С помощью стандартного сервиса OData, можно получать данные прямо в Excel, использовать все возможности Excel для анализа данных, построения моделей, формирования сводных таблиц и т. п. Самое приятное, что все расчеты будут автоматически обновляться при изменении данных в «1С:Предприятие 8». Рассмотрим поэтапно:
- Нужно настроить внешний источник данных в Excel
- Настроить подключение к REST сервису «1С:Предприятие 8»
- Отмечаем нужные таблицы, в примере "Справочник.Валюты" и "РегистрСведений.КурсыВалют"
- Импортируем данные из «1С:Предприятие 8»
Для получения детальной информации посмотрите видео:
Интеграция с .NET системами
Ни для кого не секрет, что появляется множество новых систем, с которыми нужно интегрироваться. На живом примере видел, что связывание систем - очень долгий и сложный процесс. Почему бы его не упростить? Сделаем программу на c# (Windows Forms Application), которая будет выводить курсы валют. Рассмотрим поэтапно:
- необходимый инструментарий: Microsoft Visual Studio (в примере используется Visual Studio Community 2015), DataSvcUtil.exe (обычно идет вместе с Visual Studio Community 2015);
- сохраним описание REST сервиса в файл metadata.csdl;
- с помощью утилиты DataSvcUtil.exe сформируем прокси класс, которые будет делать всю работу по взаимодействию с REST сервисом «1С:Предприятие 8». Вот так выглядит командная строка:
C:\Users\Designer>"C:\Program Files (x86)\Microsoft WCF Data Services\5.6.4\bin\tools\DataSvcUtil.exe" /in:D:\Public_OData\metadata.csdl /out:D:\Public_Odata\metadata.cs /version:3.0; - создаем проект Windows Forms Application
- добавляем в проект прокси класс metadata.cs;
- в файле App.config пропишем параметры доступа к REST сервису:
<connectionStrings> <add name="ProductionOData" connectionString="http://wall-e.ktc.local/dt/odata/standard.odata" /> <add name="UserOData" connectionString="username" /> <add name="PasswordOData" connectionString="password" /> </connectionStrings>
- добавим необходимые References в проект
- добавим на форму DataGridView и настроим
- при загрузке формы добавим код для получения курсов валют из REST сервиса:
// Получаем ссылку на REST сервис
Uri serviceRoot = new Uri(ConfigurationManager.ConnectionStrings["ProductionOData"].ConnectionString);
// Инициализируем сервис
EnterpriseV8 V8Base = new EnterpriseV8(serviceRoot);
// Задаем пользователя и пароль в «1С:Предприятие 8»
V8Base.Credentials = new NetworkCredential(ConfigurationManager.ConnectionStrings["UserOData"].ConnectionString,
ConfigurationManager.ConnectionStrings["PasswordOData"].ConnectionString);
// Получаем список значений справочника валюты
List<Catalog_Валюты> currencyCatalog = new List<Catalog_Валюты>();
IEnumerable<Catalog_Валюты> currencyResponse = V8Base.Catalog_Валюты.Execute();
foreach (var item in currencyResponse)
{
currencyCatalog.Add(item);
}
// Выводим курсы валют в dataGridView, подставляя Description из списка значений справочника валют
IEnumerable<InformationRegister_КурсыВалют> coursesResponse = V8Base.InformationRegister_КурсыВалют.Execute();
foreach (var item in coursesResponse)
{
string[] record =
{
item.Period.ToString(),
currencyCatalog.Find(x => x.Ref_Key == item.Валюта_Key).Description,
item.Курс.ToString()
};
dataGridView2.Rows.Add(record);
} - Запускаем на выполнение и любуемся
Интеграция с системами на базе Android
Сказать, что мобильные приложения это хорошо — ничего не сказать. Преимуществ, которые они дают, очень много:
- решения для увеличения продаж;
- вся информация о вашей компании в смартфоне клиентов;
- важные показатели бизнеса всегда под рукой;
- улучшение качества бизнес-процессов;
- продвижение своего приложения позволяет компании повысить собственный имидж.
Сделаем мобильное приложение Android, которое будет выводить курсы валют. Рассмотрим поэтапно:
- необходимый инструментарий: Eclipse JAVA (создание прокси класса для взаимодействия с REST сервисом «1С:Предприятие 8»), библиотеки restlet.org (JAVA SE, Android) и Android Studio для создания приложения;
- создаем новый проект в Eclipse -> Java Project. Добавляем необходимые внешние библиотеки restlet.org (JAVA SE):
- org.restlet.jar
- org.restlet.ext.odata.jar
- org.restlet.ext.freemarker.jar
- org.restlet.ext.atom.jar
- org.restlet.ext.xml.jar
- org.freemarker_2.3\org.freemarker.jar
- к сожалению, библиотека org.restlet.ext.odata.jar не умеет создавать прокси классы из файлов *.csdl и REST сервисов, где необходима авторизация. Покопавшись в исходниках Restlet, добавил возможность прохождения авторизации REST и дальнейшей генерации прокси классов, новая версия библиотеки есть в архиве в конце статьи. Официально, пока не известно когда мои изменения попадут в основную ветку Restlet, обсуждение этой задачи здесь;
- добавим код формирования прокси классов:
import java.net.URI; import org.restlet.data.ChallengeResponse; import org.restlet.data.ChallengeScheme; import org.restlet.data.Reference; import org.restlet.ext.odata.Generator; public class Main { public static void main(String[] arg) throws Exception { String serviceURL = "http://wall-e.ktc.local/dt/odata/standard.odata"; Generator ODataGen = new Generator(new Reference(URI.create(serviceURL)), "ODataConnector"); ODataGen.setCredentials(new ChallengeResponse(ChallengeScheme.HTTP_BASIC, "username", "password")); ODataGen.generate("D:\\Public_OData\\eclipse\\proxy_generated\\"); } }
- запускаем, через несколько мгновений классы должны быть готовы;
- создаем новый проект в Android Studio, заполняем все необходимые поля;
- переходим в каталог проекта, далее в директорию mobile\libs\, копируем внешние библиотеки restlet.org (Android):
- org.restlet.jar
- org.restlet.ext.odata.jar
- org.restlet.ext.atom.jar
- org.restlet.ext.xml.jar
- возвращаемся в корень проекта и переходим в mobile\src\main\res\layout\, добавляем описание layout item.xml, который будем использовать для вывода данных в gridView. Описание item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tvText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:minHeight="40dp" android:textSize="20sp" android:text=""> </TextView> </LinearLayout>
- в файл mobile\src\main\AndroidManifest.xml добавляем строки, связанные с доступом приложения (перед блоком <application></application>):
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <permission android:name="android.permission.INTERNET"/>
- в файл \mobile\build.gradle добавляем строки связанные с внешними библиотеками restlet.org (Android), чтобы включить их сборку проекта:
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') wearApp project(':wear') compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.google.android.gms:play-services:7.8.0' compile files('libs/org.restlet.ext.odata.jar') compile files('libs/org.restlet.ext.xml.jar') compile files('libs/org.restlet.jar') compile files('libs/org.restlet.ext.atom.jar') }
- создаем папку ProxyClass в \mobile\src\main\java и копируем в нее файлы созданные на 5 шаге:
- добавляем в файл StandardOdataService.java, запись:
package ProxyClass;
- во все файлы в папке \mobile\src\main\java\ProxyClass\standardodata добавим следующее:
package ProxyClass.standardodata;
- к сожалению, библиотека Restlet не знает такой тип, как Type="Collection(Edm.String)" и формирует прокси класс с ошибкой, создавая неизвестный тип CollectionStringEdm. Переходим в файл \mobile\src\main\java\ProxyClass\standardodata\TypeDescription.java и заменяем CollectionStringEdm на List<String>;
- исправляем ошибки namespace'ов в файлах прокси класса;
- в Android Studio на активити добавляем gridView и настраиваем:
- вот так выглядит процедура при создании:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); setContentView(R.layout.activity_main); /* Инициализируем OData сервис */ StandardOdataService service = new StandardOdataService(); service.setCredentials(new ChallengeResponse(ChallengeScheme.HTTP_BASIC, "username", "password")); /* Создаем соответствие межу GUID'ом валюты и ее Description */ Map<String, String> hashTable = new HashMap<String, String>(); Query<Catalog_Валюты> currencyCatalog = service.createCatalog_ВалютыQuery("/Catalog_Валюты"); for (Catalog_Валюты data : currencyCatalog) { hashTable.put(data.getRef_key(), data.getDescription()); } /* Подготавливаем заголовки таблицы */ List<String> listData = new Vector<String>(); listData.add("Период"); listData.add("Валюта"); listData.add("Курс"); /* Получаем курсы валют, СрезПоследних(), и добавляем в список для вывода * подставляем Description из соответствия валют */ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Query<InformationRegister_КурсыВалют> coursesResponse = service.createInformationRegister_КурсыВалютQuery("/InformationRegister_КурсыВалют/SliceLast"); for (InformationRegister_КурсыВалют data : coursesResponse) { listData.add( formatter.format(data.getPeriod())); listData.add( hashTable.get(data.getВалюта_key())); listData.add( Double.toString(data.getКурс())); } /* Выводим данные на активити */ ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.tvText, listData); GridView dataGridView = (GridView)findViewById(R.id.gridView); dataGridView.setAdapter(adapter); }
Возникают трудности? Видео 6-17 шагов:
Послесловие
Интегрироваться с «1С:Предприятие 8» стало на порядок проще, надеюсь информация будет полезна сообществу.
Автоматически генерируемый REST интерфейс прикладных решений 1С:Предприятия
Расширение поддержки протокола OData