|
|
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
Коллеги, есть задача в сторонней системе (Cognos) построить отчеты и OLAP кубы на данных, которые хранятся в 1с. Cognos не имеет своего коннектора к 1с. 1c 8.2 + MS SQL Server. Попробовал подключится к базе, которую 1с использует для работы. Оттуда можно достать кое-какую информацию, но связи между таблицами мне установить не удалось. Т.к. в полях, где, по-моему скромному мнению, должны храниться id-шники хранится <binary data>. Поэтому появились вопросы, подскажите где знаете: 1) Есть ли у 1c 8.2 что-то вроде публикации данных в реляционку (пофиг в каком виде и как будут называться таблицы, главное чтобы можно было установить связи между таблицами и получить любые данные)? 2) Может есть какие-то сторонние разработки для осуществления публикации (см. п. 1) 3) Каким образом Вы осуществляли интеграцию 1с с внешними системами (хотябы одностороннюю). П.С. Ручками писать процедуры выгрузки в файлы или реляционку для кажого объекта 1с не предлагать )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 00:00 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
ПолучитьСтруктуруХраненияБазыДанных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 01:26 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
ole com xml (txt ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 03:05 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
Программист 1сПолучитьСтруктуруХраненияБазыДанных Вы мне даете функцию 1с. Спасибо за функцию. Но пограммировать в 1с нет времени и компетенций. Я просил ответить на один из трех вопросов. По существу вы не дали ответ ни на один их них. Т.к. в структуре таблиц разобраться не сложно и я это, вроде, сделал. Вопрос в том, что связей между таблицами нет. Вернее они где-то зашиты в полях с Binary Data, поэтому работать с базой, в которой 1с хранит данные - не вариант. Нужна витрина в любом виде (пусть таблицы и поля в них хоть как убого называются. Главное чтобы можно было на основе просто джоина связать эти таблицы и получить требуемые данные). Мои вопросы относился к тому, чтобы быстро можно было выгружать данные в такую витрину. А также последний вопрос был о том, как Вы это делаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 03:47 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
1) 1c не является реляционной БД. А есть попытка отобразить иерархические данные на реляционные БД. Система закрыта. Никакой прямой выгрузки и загрузки никогда не будет - это маркетинговая политика. 2) Т.к. система закрыта - то все разработки будут действовать до следущей версии 3) Для интеграции только работать с ADO. Если нужны функции работы с данными 1с - пишите - можно предоставить. Например функция, которая описывает связи между данными: Procedure SaveTableReferencies() export П = Новый Структура; ТекстЗапроса = "ВЫБРАТЬ | КОЛИЧЕСТВО(СвязиДанных.Ссылка) |ИЗ | Справочник.СвязиДанных КАК СвязиДанных |ГДЕ | СвязиДанных.ПервичнаяТаблица = &ПервичнаяТаблица | И СвязиДанных.КолонкаПервичнойТаблицы = &КолонкаПервичнойТаблицы | И СвязиДанных.СвязаннаяТаблица = &СвязаннаяТаблица | И СвязиДанных.КолонкаСвязаннойТаблицы = &КолонкаСвязаннойТаблицы"; СвязиДанных = Справочники.СвязиДанных; НачатьТранзакцию(РежимУправленияБлокировкойДанных.Автоматический); // сохраняем данные о связях справочников for each Справочник in Метаданные.Справочники do // Обрабатываем реквизиты for each Реквизит in Справочник.Реквизиты do ТипыР = Реквизит.Тип.Типы(); for i = 0 to ТипыР.count() - 1 do МетаТип = Метаданные.НайтиПоТипу(ТипыР[i]); if not IsNull(МетаТип) then Менеджер = ПолучитьМенеджерОбъекта(МетаТип.Имя); if not IsNull(Менеджер) then П.Clear(); П.Вставить("ПервичнаяТаблица",mid(Справочник.ПолноеИмя(),find(Справочник.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаПервичнойТаблицы",Реквизит.Имя); П.Вставить("СвязаннаяТаблица",mid(МетаТип.ПолноеИмя(),find(МетаТип.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаСвязаннойТаблицы","Ссылка"); cnt = Выполнить_Запрос_1С_Результат(ТекстЗапроса,П); if cnt = 0 then Объект = СвязиДанных.СоздатьЭлемент(); Объект.ПервичнаяТаблица = П.ПервичнаяТаблица; Объект.КолонкаПервичнойТаблицы = П.КолонкаПервичнойТаблицы; Объект.СвязаннаяТаблица = П.СвязаннаяТаблица; Объект.КолонкаСвязаннойТаблицы = П.КолонкаСвязаннойТаблицы; Объект.ТипСвязи = "ЛЕВОЕ СОЕДИНЕНИЕ"; Объект.Записать(); endif; endif; endif; enddo; enddo; // Обрабатываем табличные части for each ТабличнаяЧасть in Справочник.ТабличныеЧасти do П.Clear(); П.Вставить("ПервичнаяТаблица",mid(Справочник.ПолноеИмя(),find(Справочник.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаПервичнойТаблицы","Ссылка"); П.Вставить("СвязаннаяТаблица",СтрЗаменить(СтрЗаменить(mid(ТабличнаяЧасть.ПолноеИмя(),find(ТабличнаяЧасть.ПолноеИмя(),".") + 1),"ТабличнаяЧасть.",""),".","")); П.Вставить("КолонкаСвязаннойТаблицы","Ссылка"); cnt = Выполнить_Запрос_1С_Результат(ТекстЗапроса,П); if cnt = 0 then Объект = СвязиДанных.СоздатьЭлемент(); Объект.ПервичнаяТаблица = П.ПервичнаяТаблица; Объект.КолонкаПервичнойТаблицы = П.КолонкаПервичнойТаблицы; Объект.СвязаннаяТаблица = П.СвязаннаяТаблица; Объект.КолонкаСвязаннойТаблицы = П.КолонкаСвязаннойТаблицы; Объект.ТипСвязи = "ЛЕВОЕ СОЕДИНЕНИЕ"; Объект.Записать(); endif; enddo; //Добавляем Владельцев for each Владелец in Справочник.Владельцы do П.Clear(); П.Вставить("ПервичнаяТаблица",mid(Владелец.ПолноеИмя(),find(Владелец.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаПервичнойТаблицы","Ссылка"); П.Вставить("СвязаннаяТаблица",mid(Справочник.ПолноеИмя(),find(Справочник.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаСвязаннойТаблицы","Ссылка"); cnt = Выполнить_Запрос_1С_Результат(ТекстЗапроса,П); if cnt = 0 then Объект = СвязиДанных.СоздатьЭлемент(); Объект.ПервичнаяТаблица = П.ПервичнаяТаблица; Объект.КолонкаПервичнойТаблицы = П.КолонкаПервичнойТаблицы; Объект.СвязаннаяТаблица = П.СвязаннаяТаблица; Объект.КолонкаСвязаннойТаблицы = П.КолонкаСвязаннойТаблицы; Объект.ТипСвязи = "ЛЕВОЕ СОЕДИНЕНИЕ"; Объект.Записать(); endif; enddo; enddo; // сохраняем данные о связях документов for each Документ in Метаданные.Документы do // Обрабатываем реквизиты for each Реквизит in Документ.Реквизиты do ТипыР = Реквизит.Тип.Типы(); for i = 0 to ТипыР.count() - 1 do МетаТип = Метаданные.НайтиПоТипу(ТипыР[i]); if not IsNull(МетаТип) then Менеджер = ПолучитьМенеджерОбъекта(МетаТип.Имя); if not IsNull(Менеджер) then //П.Clear(); //П.Вставить("ПервичнаяТаблица",Документ.ПолноеИмя()); //П.Вставить("КолонкаПервичнойТаблицы",Реквизит.Имя); //П.Вставить("СвязаннаяТаблица",МетаТип.ПолноеИмя()); //П.Вставить("КолонкаСвязаннойТаблицы","Ссылка"); //cnt = Выполнить_Запрос_1С_Результат(ТекстЗапроса,П); //if cnt = 0 then // Объект = СвязиДанных.СоздатьЭлемент(); // Объект.ПервичнаяТаблица = П.ПервичнаяТаблица; // Объект.КолонкаПервичнойТаблицы = П.КолонкаПервичнойТаблицы; // Объект.СвязаннаяТаблица = П.СвязаннаяТаблица; // Объект.КолонкаСвязаннойТаблицы = П.КолонкаСвязаннойТаблицы; // Объект.ТипСвязи = "ЛЕВОЕ СОЕДИНЕНИЕ"; // Объект.Записать(); //endif; П.Clear(); П.Вставить("ПервичнаяТаблица",mid(Документ.ПолноеИмя(),find(Документ.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаПервичнойТаблицы",Реквизит.Имя); П.Вставить("СвязаннаяТаблица",mid(МетаТип.ПолноеИмя(),find(МетаТип.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаСвязаннойТаблицы","Ссылка"); cnt = Выполнить_Запрос_1С_Результат(ТекстЗапроса,П); if cnt = 0 then Объект = СвязиДанных.СоздатьЭлемент(); Объект.ПервичнаяТаблица = П.ПервичнаяТаблица; Объект.КолонкаПервичнойТаблицы = П.КолонкаПервичнойТаблицы; Объект.СвязаннаяТаблица = П.СвязаннаяТаблица; Объект.КолонкаСвязаннойТаблицы = П.КолонкаСвязаннойТаблицы; Объект.ТипСвязи = "ЛЕВОЕ СОЕДИНЕНИЕ"; Объект.Записать(); endif; endif; endif; enddo; enddo; // Обрабатываем табличные части for each ТабличнаяЧасть in Документ.ТабличныеЧасти do П.Clear(); П.Вставить("ПервичнаяТаблица",mid(Документ.ПолноеИмя(),find(Документ.ПолноеИмя(),".") + 1)); П.Вставить("КолонкаПервичнойТаблицы","Ссылка"); П.Вставить("СвязаннаяТаблица",СтрЗаменить(СтрЗаменить(mid(ТабличнаяЧасть.ПолноеИмя(),find(ТабличнаяЧасть.ПолноеИмя(),".") + 1),"ТабличнаяЧасть.",""),".","")); П.Вставить("КолонкаСвязаннойТаблицы","Ссылка"); cnt = Выполнить_Запрос_1С_Результат(ТекстЗапроса,П); if cnt = 0 then Объект = СвязиДанных.СоздатьЭлемент(); Объект.ПервичнаяТаблица = П.ПервичнаяТаблица; Объект.КолонкаПервичнойТаблицы = П.КолонкаПервичнойТаблицы; Объект.СвязаннаяТаблица = П.СвязаннаяТаблица; Объект.КолонкаСвязаннойТаблицы = П.КолонкаСвязаннойТаблицы; Объект.ТипСвязи = "ЛЕВОЕ СОЕДИНЕНИЕ"; Объект.Записать(); endif; enddo; enddo; ЗафиксироватьТранзакцию(); СП = Новый СообщениеПользователю; СП.Текст = "Данные сохранены !"; СП.Сообщить(); endprocedure ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 08:19 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
oleg_shishkin, большое спасибо за исчерпывающий ответ по всем пунктам. Запостил еще здесь Также получил полезные советы. Наиболее полезным оказался этот тред ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 13:08 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
Evgeniy Shubin, если надо функции работы с binary могу выложить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 13:36 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
oleg_shishkinEvgeniy Shubin, если надо функции работы с binary могу выложить Было бы полезно. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 17:23 |
|
||
|
Интеграция 1с со внешними системами
|
|||
|---|---|---|---|
|
#18+
Evgeniy Shubin, Функции конвертации Binary -> hex string и обратно. Если надо работу что-то с ADO пишите create function dbo.sp_hexadecimal ( @binvalue varbinary(255) ) returns nvarchar(255) as begin declare @charvalue nvarchar(255) ,@i int ,@length int ,@hexstring nchar(16) ,@tempint int ,@firstint int ,@secondint int select @charvalue = '0x' select @i = 1 select @length = datalength(@binvalue) -- select @hexstring = '0123456789abcdef' select @hexstring = '0123456789ABCDEF' while (@i <= @length) begin select @tempint = convert(int, substring(@binvalue,@i,1)) select @firstint = floor(@tempint/16) select @secondint = @tempint - (@firstint*16) select @charvalue = @charvalue + substring(@hexstring, @firstint+1, 1) + substring(@hexstring, @secondint+1, 1) select @i = @i + 1 end return ( @charvalue ) end go ALTER FUNCTION dbo.HexStrToVarBinary(@hexstring nvarchar(8000)) RETURNS varbinary(8000) AS BEGIN declare @a varbinary(8000) select @a = cast('' as xml).value('xs:hexBinary( substring(sql:variable("@hexstring"), sql:column("t.pos")) )', 'varbinary(max)') from (select case substring(@hexstring, 1, 2) when '0x' then 3 else 0 end) as t(pos) return @a END go ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 19:29 |
|
||
|
|

start [/forum/topic.php?fid=28&gotonew=1&tid=1521845]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
149ms |
get topic data: |
10ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 457ms |

| 0 / 0 |
