- Обзор
- Установка
- Использование
- Проверка подключения
- Power Query и другие ETL инструменты
- Дополнительные материалы
Реализовано несколько механизмов получения данных из 1С:
- .NET провайдер на основе 1С ComConnector с использованием технологии позднего связывания (Late binding)
- ADO.NET провайдер на основе 1С ComConnector с использованием технологии позднего связывания (Late binding)
- Web service 1С
- ADO.NET провайдер на основе Web service. Данный провайдер сделан для ускорения преобразования xml-значений в таблицу в случае, если встроенные инструменты ETL не позволяют сделать это эффективно. Например, в Power Query ответ Web service быстрее обработать через ADO.NET в случае запроса большого набора данных.
Для примитивных типов:
- boolean
- DateTime
- decimal
- string
возвращаются соответствющие значения, для ссылочных типов возвращается UUID (Universally Unique Identifier), для перечислений: Имя
При установке ADO.NET провайдеры регистрируются в:
%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\Config\machine.config%SYSTEMROOT%\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
Обращение к провайдерам возможно через фабрики DbProviderFactories.GetFactory(factoryName)
- Загрузите последний релиз
- Запустите
setup.exeот имениадминистратора
Создание Web service через конфигуратор 1С
public void DotNetTest()
{
// Проектируем строку подключения к 1С
var builder = new OneSConnectionStringBuilder
{
Srvr = "192.168.189.129", // Адрес сервера
Ref = "AccountingServer", // Имя базы данных
Usr = "Integration", // Имя пользователя
Pwd = "Integration123" // Пароль
//File = "...", // Для файл-серверного варианта
};
// Создаем объект подключения
using (var dbConnection = new OneSConnector())
{
// Подключаемся
dbConnection.Connect(builder);
// Создаем запрос
using (var dbCommand = new OneSQuery(dbConnection))
{
// Устанавливаем текст запроса
dbCommand.Text = @"ВЫБРАТЬ 1, ДАТАВРЕМЯ(2018, 03, 15, 1, 2, 3), ""Привет"", ИСТИНА";
// Выполняем запрос
using (var queryResult = dbCommand.Execute())
{
// Получаем результат в виде объекта DataTable
var dataTable = queryResult.DeserializeFromValueTable();
Assert.IsNotNull(dataTable);
var decimalValue = (decimal)dataTable.Rows[0][0];
var dateTimeValue = (DateTime)dataTable.Rows[0][1];
var stringValue = (string)dataTable.Rows[0][2];
var boolValue = (bool)dataTable.Rows[0][3];
Assert.AreEqual(1m, decimalValue);
Assert.AreEqual(new DateTime(2018, 03, 15, 1, 2, 3), dateTimeValue);
Assert.AreEqual("Привет", stringValue);
Assert.AreEqual(true, boolValue);
}
}
}
}public void DotNetDbStorageStructureInfo()
{
// Проектируем строку подключения к 1С
var builder = new OneSConnectionStringBuilder
{
Srvr = "192.168.189.129", // Адрес сервера
Ref = "AccountingServer", // Имя базы данных
Usr = "Integration", // Имя пользователя
Pwd = "Integration123" // Пароль
//File = "...", // Для файл-серверного варианта
};
// Создаем объект подключения
using (var connector = new OneSConnector())
{
// Подключаемся
connector.Connect(builder);
// Получаем информацию о структуре БД
using (var valueTable = connector.GetDbStorageStructureInfo(null, true))
{
// Сериализуем в Xml
var xmlString = connector.SerializeToXml(valueTable);
// Формируем XDocument
var document = XDocument.Parse(xmlString);
Assert.IsNotNull(document);
}
}
}public void AdoDotNetTest()
{
// Проектируем строку подключения к 1С
var builder = new OneSDbConnectionStringBuilder()
{
ProgId = "V83.ComConnector",// Идентификатор COM-объекта
Srvr = "192.168.189.129", // Адрес сервера
Ref = "AccountingServer", // Имя базы данных
Usr = "Integration", // Имя пользователя
Pwd = "Integration123" // Пароль
};
// Создаем объект подключения
using (var dbConnection = new OneSDbConnection())
{
// Устанавливаем строку подключения
dbConnection.ConnectionString = builder.ConnectionString;
// Подключаемся
dbConnection.Open();
// Создаем запрос
using (var dbCommand = new OneSDbCommand())
{
dbCommand.Connection = dbConnection;
// Устанавливаем текст запроса
dbCommand.CommandText = @"ВЫБРАТЬ 1, ДАТАВРЕМЯ(2018, 03, 15, 1, 2, 3), ""Привет"", ИСТИНА";
// Выполняем запрос
using (var queryResult = dbCommand.ExecuteReader())
{
// Получаем результат в виде объекта DataTable
var dataTable = new DataTable();
dataTable.Load(queryResult);
Assert.IsNotNull(dataTable);
var decimalValue = (decimal)dataTable.Rows[0][0];
var dateTimeValue = (DateTime)dataTable.Rows[0][1];
var stringValue = (string)dataTable.Rows[0][2];
var boolValue = (bool)dataTable.Rows[0][3];
Assert.AreEqual(1m, decimalValue);
Assert.AreEqual(new DateTime(2018, 03, 15, 1, 2, 3), dateTimeValue);
Assert.AreEqual("Привет", stringValue);
Assert.AreEqual(true, boolValue);
}
}
}
}Формирование запроса на получение данных:
public void WebServiceTest()
{
var builder = new WebServiceConnectionStringBuilder
{
Address = "http://192.168.189.129", // Адрес сервера
UriNamespace = "http://10.10.15.150/WebIntegration", // URI пространства имен
Database = "AccountingServer", // Имя БД
ServiceFileName = "WebIntegration.1cws", // Имя файла публикации
UserName = "Integration", // Имя пользователя
Password = "Integration123" // Пароль
};
const string query = @"ВЫБРАТЬ 1, ДАТАВРЕМЯ(2018, 03, 15, 1, 2, 3), ""Привет"", ИСТИНА";
var serviceRequest = new WebServiceRequest(builder, query);
serviceRequest.QueryData();
var dataTable = serviceRequest.ResulTable;
Assert.IsNotNull(dataTable);
var decimalValue = (decimal)dataTable.Rows[0][0];
var dateTimeValue = (DateTime)dataTable.Rows[0][1];
var stringValue = (string)dataTable.Rows[0][2];
var boolValue = (bool)dataTable.Rows[0][3];
Assert.AreEqual(1m, decimalValue);
Assert.AreEqual(new DateTime(2018, 03, 15, 1, 2, 3), dateTimeValue);
Assert.AreEqual("Привет", stringValue);
Assert.AreEqual(true, boolValue);
}Использование провайдера аналогично использованию ADO.NET провайдера на основе ComConnector:
WebServiceConnectionStringBuilder- для проектирования строки подключенияWebServiceConnection- для создания подключенияWebServiceCommand- для запроса данных
Для проверки подключения можно воспользоваться утилитой Pike.ConnectionTest.exe
В настройках утилиты присутствуют 2 секции параметров:
SettingsConnection- настройки провайдера ADO.NET на основе 1С ComConnectorSettingsWebService- настройки Web service и провайдера ADO.NET на основе Web service
Настройки для тестирования необходимо установить до запуска приложения.
При запуске приложения необходимо выбрать символ, который соответствует тестируемому подключению.
В случае успешного подключения будет выведено сообщение CONNECTION SUCCEEDED!.
Power Query и другие средства интеграции, поддерживающие работу с ADO.NET могут быть использованы для получения данных:
let
query = AdoDotNet.Query(
"Pike.OneS.WebService.WebServiceDbProviderFactory",
"Address=http://192.168.189.129;UriNamespace=http://10.10.15.150/WebIntegration;Database=AccountingServer;ServiceFileName=WebIntegration.1cws;UserName=Integration",
"ВЫБРАТЬ 1 КАК Номер, ДАТАВРЕМЯ(2018, 03, 15, 0, 0, 0) КАК Дата, ""Привет"" КАК Строка, ИСТИНА КАК Флаг")
in
queryВ папке проекта Excel отражены примеры на Power Query для получения данных через:
- ADO.NET ComConnector
- Web service
- ADO.NET Web service