|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Добрый день ! У меня возник следующий вопрос - есть самописная конфигурация на 1С 8.2, база в файловом варианте на сервере Win 2008 R2. Необходимо с заданной периодичностью организовать выгрузку данных (справочников и документов) из 1С в SQL-ю базу (не 1С - овскую), которая в свою очередь развернута на MS SQL 2012. Структура данных - достаточно развернутая, т.е. это не просто перекачка данных один в один из 1С в SQL. Периодичность обмена данными - предположительно 1 раз в 2 минуты. Я никогда не занимался вопросами интеграции между 1С 8 и SQL Server, в связи с чем вопросы: - Какие прикладные механизмы 1С 8 предпочтительнее задействовать для обмена данными в данном случае - имеет ли смысл задействовать регламентные задания, которые будут с заданной периодичностью запускать написанную мной обработку обмена или предпочтительнее что то еще ? - Какие win - довые механизмы желательно задействовать для доступа к объектам SQL с учетом достаточно высокой интенсивности обмена данными - имеет ли смысл использовать ODBC, OLE DB или что то еще ? - Как все-таки правильнее было бы организовать обмен - в обработке прописывать всю процедуру обмена или просто генерировать SQL - скрипт, который и передавать на выполнение серверу ? Простите за некоторый сумбур в вопросах, просто я даже не знаю, с какой стороны приступить ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 16:34 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
>имеет ли смысл задействовать регламентные задания база файловая... их нельзя будет повесить просто на сервер приложений - на клиетской машине должен будет всегда запущен "бот"... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 16:37 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Я думал завести специального пользователя, под которым будет постоянно запущена 1С-ка и под которым соответственно будет периодически запускаться обработка. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 16:42 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
>- Какие win - довые механизмы желательно задействовать для доступа к объектам SQL с учетом достаточно высокой интенсивности обмена данными - имеет ли смысл использовать ODBC, OLE DB или что то еще кроме интенсивности еще надо знать средний объем в одном цикле обмена вариантов море... от прямой записи через ado до подготовки средствами 1с файла xml ( http://v8.1c.ru/overview/xdto.htm) и засасыванием его средствами sql типа dts люди более опытные еще вариантов накидать могут я думаю ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 16:43 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
FduchunЯ думал завести специального пользователя, под которым будет постоянно запущена 1С-ка и под которым соответственно будет периодически запускаться обработка. ну да, так в файловом режиме это и крутится ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 16:44 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Касательно объема - точно сказать не могу пока, но, с прикладной точки зрения, наибольший прирост ожидается в отношении 3 таблиц, средний прирост по которым за день - около 100 строк в каждой. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 17:02 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Fduchun, так и выгружать прирост - только измененные данные, а не все таблицы целиком ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 17:09 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
А каким-образом можно выгружать только те данные, которые были внесены/изменены с момента последней выгрузки - ввести некоторое поле-счетчик, которое обновлять после каждой выгрузки ? И соответственно выгружать данные только в соответствии с значением данного поля ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 17:16 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
FduchunА каким-образом можно выгружать только те данные, которые были внесены/изменены с момента последней выгрузки - ввести некоторое поле-счетчик, которое обновлять после каждой выгрузки ? И соответственно выгружать данные только в соответствии с значением данного поля ? Два основных варианта: 1. на уровне платформы - организовать План Обмена,в состав которого включены нужные типы данных. Изменения платформа будет фиксировать сама, остается использовать механизм сообщения обмена для выделения этих изменений. Недостаток - все изменения надо обрабатывать-передавать одновременно, в одном сообщении, что не всегда подходит: стиль "это изменение отправим сейчас, а это - когда-нибудь в другой раз" так просто не пройдет. 2. Подписка на событие ,например на "ПослеЗаписи" для нужных типов данных, и регистр сведений, в котором ссылки на изменения складывать/забирать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 17:24 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Просто сама структура выгрузки значительно усложняется - например, где гарантия, что выгруженные данные были загружены в базу ? Получается нужно будет передавать из SQL в 1С номер последней удачной загрузки и выгружать данные анализируя данные показатель… Насколько это корректно, вот в чем вопрос... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 17:27 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
FduchunПросто сама структура выгрузки значительно усложняется - например, где гарантия, что выгруженные данные были загружены в базу ? Получается нужно будет передавать из SQL в 1С номер последней удачной загрузки и выгружать данные анализируя данные показатель… Насколько это корректно, вот в чем вопрос... Механизм сообщений обмена это учитывает: обмен двустороний, в ответном сообщении должна содержаться квитанция с номером принятого последнего принятого сеанса. Пока такая квитанция не будет получена, платформа не удаляет из таблицы изменений объекты (точнее - ссылки на них), которые выгружались в этом или более поздних сеансах, и будет предлагать к выгрузке в следующих. И только когда квитанция с номером принятого сообщения придет - все ссылки, которые выгружались в подтвержденном сеансе, из таблиц изменений будут удалены. Таблицы изменений,кстати, можно и отдельно читать, запросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 17:33 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
pailFduchunПросто сама структура выгрузки значительно усложняется - например, где гарантия, что выгруженные данные были загружены в базу ? Получается нужно будет передавать из SQL в 1С номер последней удачной загрузки и выгружать данные анализируя данные показатель… Насколько это корректно, вот в чем вопрос... Механизм сообщений обмена это учитывает: обмен двустороний, в ответном сообщении должна содержаться квитанция с номером принятого последнего принятого сеанса. Пока такая квитанция не будет получена, платформа не удаляет из таблицы изменений объекты (точнее - ссылки на них), которые выгружались в этом или более поздних сеансах, и будет предлагать к выгрузке в следующих. И только когда квитанция с номером принятого сообщения придет - все ссылки, которые выгружались в подтвержденном сеансе, из таблиц изменений будут удалены. Таблицы изменений,кстати, можно и отдельно читать, запросами. +1. Эти вещи уже есть на уровне платформы, ими надо просто нормально воспользоваться ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2013, 18:34 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Попробуйте через COM, вызывайте 1С-ку когда нужно и берите из нее, что нужно. В 1С-ке создайте модуль специально для обмена, в модуле пропишите запросы, которые вернет удобные данные, там же сделайте преобразование если нужно и т.п., там же можно предусмотреть логику: выгружать только измененные данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 05:05 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
А где можно почитать об этом ? Интересует прежде всего практическая реализация - может литературу какую специализированную подскажете. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 09:33 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Хотелось бы уточнить, под настройкой обмена данными вы имеете в виду универсальный обмен данными в формате XML ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 09:46 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
формально - что-то типа этого http://v8.1c.ru/metod/books/book.jsp?id=288 но я ее не листал, не знаю что внутри ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 10:46 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
FduchunХотелось бы уточнить, под настройкой обмена данными вы имеете в виду универсальный обмен данными в формате XML ? не обязательно xml... xml это обертка, формат данных. план обмена, таблицы регистрации изменений, узлы - это независимые инструменты ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 10:49 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
т.е. вы например создаете план обмена в который вносите список объектов подвергаемых обмену, выгребаете запросами измененные данные из сервисных таблиц (таблицы изменений) и пишете все через ado/recordset прямо в базу sql... или формируете xml файлик, который подсовываете sql то что жирным - не зависит от способа доставки ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 10:52 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
DeosfenПопробуйте через COM, вызывайте 1С-ку когда нужно и берите из нее, что нужно. В 1С-ке создайте модуль специально для обмена, в модуле пропишите запросы, которые вернет удобные данные, там же сделайте преобразование если нужно и т.п., там же можно предусмотреть логику: выгружать только измененные данные. com вещь хорошая... но требует наличия (хотя бы частичного) на машине вызывающей 1с + легкий гимор с оберткой 32-разрядного com объекта 1с на 64-битной машине + актуализация этого хозяйства при смене версий 1с + может быть гимор с авторизацией и безопасностью (зависит от строения сети и отмороженности IT-безопасников) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 10:56 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
+ возможен трах с ключами лицензий 1с ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 10:57 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
можно так: 1) перевести 1с на SQL Server 2) настроить на 1с базе CDC ( http://technet.microsoft.com/ru-ru/library/bb522489(v=sql.105).aspx) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 13:55 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
или так: 1) перевести 1с на SQL Server 2) с помощью Oracle GoldenGate передавать дельты из журнала транзакций в целевую базу ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 13:57 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
Последний выдох ГПЖформально - что-то типа этого http://v8.1c.ru/metod/books/book.jsp?id=288 но я ее не листал, не знаю что внутриЯ её листал. Очень интересная и полезная книженция на 360 страниц. HTML, FTP, XML, ADO, OLE Automation, обмены, web-расширение. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 15:51 |
|
Обмен данными между 1С и MS SQL
|
|||
---|---|---|---|
#18+
как-то так:Функция CreateADOConnection(мСтруктураПараметров) Экспорт Провайдер = мСтруктураПараметров.Провайдер; Если Не(ЗначениеЗаполнено(Провайдер)) Тогда Провайдер = "SQLOLEDB"; КонецЕсли; ИмяСервера = мСтруктураПараметров.ИмяСервера; Если Не ЗначениеЗаполнено(ИмяСервера) Тогда ИмяСервера = ".<ИмяСервера>"; КонецЕсли; ИмяБД = мСтруктураПараметров.ИмяБазыДанных; Пользователь = мСтруктураПараметров.ИмяПользователя; Пароль = мСтруктураПараметров.ПарольПользователя; СтрокаПодключения = "Provider=" + Провайдер + ";Data Source=" + ИмяСервера + ";Initial Catalog=" + ИмяБД; Если Не ЗначениеЗаполнено(Пользователь) Тогда СтрокаПодключения = СтрокаПодключения + ";Integrated Security=SSPI;" Иначе СтрокаПодключения = СтрокаПодключения + ";UID=" + Пользователь + ";PWD=" + Пароль + ";"; КонецЕсли; Соединение = Новый COMОбъект("ADODB.Connection"); Соединение.ConnectionString = СтрокаПодключения; Соединение.ConnectionTimeOut = 30; Соединение.CommandTimeout = 120; Попытка #Если Клиент Тогда Состояние("Подключение к " + ИмяСервера + "" + ИмяБД); #КонецЕсли Соединение.Open(); #Если Клиент Тогда Состояние(""); #КонецЕсли Исключение ОбщегоНазначения.СообщитьОбОшибке("Операция не выполнена: " + ОписаниеОшибки()); Соединение = Неопределено; КонецПопытки; Возврат Соединение; КонецФункции //CreateADOConnection Функция RunDataImportRoutine(мИмяСервера="", мСоединение=Неопределено) Экспорт Результат = Ложь; Если мСоединение = Неопределено Тогда СтруктураПараметров = Новый Структура("Провайдер,ИмяСервера,ИмяБазыДанных,ИмяПользователя,ПарольПользователя", "SQLOLEDB", "<ИмяСервера>", "<ИмяБазыНаCервере>"); Соединение = CreateADOConnection(СтруктураПараметров); Иначе Соединение = мСоединение; КонецЕсли; Если Соединение = Неопределено Тогда Возврат Результат; КонецЕсли; ОбновитьЦеныНоменклатуры(Соединение); СтрокаЗапроса = "SELECT * FROM [<ИмяБазыНаCервере>].[dbo].[<ИмяТаблицыВСкуле>] WHERE [DBCode]=" + СокрЛП(КодУзлаБД)+" ORDER BY [Timestamp]"; ТаблицаВнешнихДанных = GetADODBRecordsetData(Соединение, СтрокаЗапроса); Для каждого ТекСтрока Из ТаблицаВнешнихДанных Цикл СтруктураПараметров = Новый Структура("IDRef, Вид, СтруктураДанных"); СтруктураПараметров.IDRef = ТекСтрока.IDRef; СтруктураПараметров.Вид = ТекСтрока.DocumentType; СтруктураПараметров.СтруктураДанных = ТекСтрока.StructuredData; ТекСсылка = ПолучитьДокумент(СтруктураПараметров); Если ЗначениеЗаполнено(ТекСсылка) Тогда СтрокаЗапроса = "DELETE FROM [<ИмяБазыНаCервере>].[dbo].[<ИмяТаблицыВСкуле>] WHERE [IDRef]="+ПреобразоватьЗначениеДляЗапроса(ТекСтрока.IDRef); EXecuteADOQuery(Соединение, СтрокаЗапроса); КонецЕсли; КонецЦикла; Результат = Истина; Возврат Результат; КонецФункции ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 16:50 |
|
|
start [/forum/topic.php?fid=28&msg=38409384&tid=1519610]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 445ms |
0 / 0 |