Обмен между 1С:Предприятие 8 и совершенно другой системой на базе SQL.
Подскажите, как настроить обмен между 1С: Предприятие 8 и другой базой данных на базе SQL?
В нашем международном концерне работа с клиентами ведется в программе на базе SQL и Access. Эта программа раз в сутки считывает данные из других систем, в том числе и 1С: Предприятие (серверный вариант). Т.е. программа подключается к базе и зная где и в какой таблице хранятся данные, запрашивает их. Табличную структуру пришлось перед этим долго изучать.
Но табличная структура 1С: Предприятия меняется с переходом на новую платформу 8.2
И программа не будет знать в какой таблице находятся т.е. или иные данные. Мы это уже протестировали. Т.е. программистам надо снова исследовать табличную структуру уже на новой платформе.
Как настроить обмен, который бы не зависел от табличной структуры базы? Неужели только выгрузкой в XML и дальнейшей его загрузкой? :?:
В нашем международном концерне работа с клиентами ведется в программе на базе SQL и Access. Эта программа раз в сутки считывает данные из других систем, в том числе и 1С: Предприятие (серверный вариант). Т.е. программа подключается к базе и зная где и в какой таблице хранятся данные, запрашивает их. Табличную структуру пришлось перед этим долго изучать.
Но табличная структура 1С: Предприятия меняется с переходом на новую платформу 8.2
И программа не будет знать в какой таблице находятся т.е. или иные данные. Мы это уже протестировали. Т.е. программистам надо снова исследовать табличную структуру уже на новой платформе.
Как настроить обмен, который бы не зависел от табличной структуры базы? Неужели только выгрузкой в XML и дальнейшей его загрузкой? :?:
По теме из базы знаний
- Как организовать консолидацию данных из трех десятков предприятий, не привлекая программистов на местах?
- Многопоточный CI-контур для 1С c Packer, Vagrant и Jenkins. Часть 1. Описание системы и обзор инструментария
- Обзор программного продукта 1С:Шина
- Применение 1С:Аналитики и Дата акселератора, или Как получить в 1С прозрачность и скорость обработки данных для прямого доступа и контроля руководителя
- Соображения о поиске работы и проблемах при первом внедрении ЕРП в 2024 г. Стаж в 1С 25 лет
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
А что за лицензионное соглашение? Производится же обмен данными между УТ и БП. А если у нас БП или другая программа не на базе 1С, что тогда делать? Во всем мире это норма. Если у нас данные хранятся на SQL, мы их вправе считывать при помощи любого интерфейса. Или?
Я подключился к базе таким образом.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cntr As Object
Dim trade As Object
Dim Элемент As Object
Dim СправочникКонтрагентов As Object
Set cntr = CreateObject("V81.COMConnector")
Set trade = cntr.Connect("File=""С:\My Documents\InfoBase1"";Usr=""Администратор"";")
Set СправочникКонтрагентов = trade.Справочники.Контрагенты
End Sub
Как мне перебрать из элементы справочника? Дело в том, что программист, той программы, которая собирается забирать данные, по-русски совсем не может. Поэтому мне надо ему помогать писать скрипт на VB.
Да еще, а как подсоединяться к серверному варианту базы?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cntr As Object
Dim trade As Object
Dim Элемент As Object
Dim СправочникКонтрагентов As Object
Set cntr = CreateObject("V81.COMConnector")
Set trade = cntr.Connect("File=""С:\My Documents\InfoBase1"";Usr=""Администратор"";")
Set СправочникКонтрагентов = trade.Справочники.Контрагенты
End Sub
Как мне перебрать из элементы справочника? Дело в том, что программист, той программы, которая собирается забирать данные, по-русски совсем не может. Поэтому мне надо ему помогать писать скрипт на VB.
Да еще, а как подсоединяться к серверному варианту базы?
(6)
опыта нет писать VB, но наверное будет выглядеть как-то так:
Dim Запрос as object
Запрос = trade.NewObject("Запрос")
Запрос.Текст = "ВЫБРАТЬ Т.Наименование, Т.ИНН, Т.КПП ИЗ Справочник.Контрагенты КАК Т"
Dim Выборка as object
Выборка = Запрос.Выполнить().Выбрать();
....
второй вариант бы выглядел так:
Dim ТЗКонтаргенты as object
ТЗКонтрагенты = trade.ПолучитьКонтрагентов()
как работать с таблицей честно не знаю, но в любом случае можно получить количество строк и строку получить по индексу: ТЗКонтрагенты.Получить(Индекс)
опыта нет писать VB, но наверное будет выглядеть как-то так:
Dim Запрос as object
Запрос = trade.NewObject("Запрос")
Запрос.Текст = "ВЫБРАТЬ Т.Наименование, Т.ИНН, Т.КПП ИЗ Справочник.Контрагенты КАК Т"
Dim Выборка as object
Выборка = Запрос.Выполнить().Выбрать();
....
второй вариант бы выглядел так:
Dim ТЗКонтаргенты as object
ТЗКонтрагенты = trade.ПолучитьКонтрагентов()
как работать с таблицей честно не знаю, но в любом случае можно получить количество строк и строку получить по индексу: ТЗКонтрагенты.Получить(Индекс)
Вот так у меня работает.
Dim cntr As Object
Dim trade As Object
Dim Клиенты As Object
Dim Результат As String
'In den naechsten 2.Zeilen wird die Verbindung hergestellt
Set cntr = CreateObject("V81.COMConnector")
Set trade = cntr.Connect("srvr=""сервер1"";Ref=""Trade"";Usr=""Администратор"";Pwd=""пароль"";")
Set Клиенты = trade.Catalogs.Контрагенты.Select()
т= 1
Do While Клиенты.Next()
Результат = Результат & Клиенты.Наименование & "; "
Loop
MsgBox (Результат)
А вот запрос выполнить из базы Access не получается. Кто нибудь мог бы подсказать, как запрос на VBA сделать, и вытащить данные из 1С?
Dim cntr As Object
Dim trade As Object
Dim Клиенты As Object
Dim Результат As String
'In den naechsten 2.Zeilen wird die Verbindung hergestellt
Set cntr = CreateObject("V81.COMConnector")
Set trade = cntr.Connect("srvr=""сервер1"";Ref=""Trade"";Usr=""Администратор"";Pwd=""пароль"";")
Set Клиенты = trade.Catalogs.Контрагенты.Select()
т= 1
Do While Клиенты.Next()
Результат = Результат & Клиенты.Наименование & "; "
Loop
MsgBox (Результат)
А вот запрос выполнить из базы Access не получается. Кто нибудь мог бы подсказать, как запрос на VBA сделать, и вытащить данные из 1С?
Set мойзапрос = trade.NewObject("Запрос","Выбрать Контрагенты.Ссылка ИЗ Справочник.Контрагенты КАК Контрагенты")
Вверху все работает. А вот следующие строки выдают ошибку.
Выборка = мойзапрос.Выполнить().Выбрать();
Выборка = мойзапрос.Execute().Choose()
Что я неправильно делаю? Как получить выборку, чтобы потом перебрать ее?
Вверху все работает. А вот следующие строки выдают ошибку.
Выборка = мойзапрос.Выполнить().Выбрать();
Выборка = мойзапрос.Execute().Choose()
Что я неправильно делаю? Как получить выборку, чтобы потом перебрать ее?
Если у вас обмен происходит через SQL таблицу,то почему не использовать COMObject("ADODB.Connection")
СтрокаПодключения="Provider=SQLOLEDB.1;Password=Пароль;Persist Security Info=True;User ID=billing_daemon;Initial Catalog=Таблица;Data Source=имяБазы";
Попытка
DataBaseConnection = Новый COMObject("ADODB.Connection");
Кодировка = "windows-1251";
DataBaseConnection.ConnectionString =СтрокаПодключения ;
DataBaseConnection.Open();
Команда=Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection=DataBaseConnection;
RS = Новый COMОбъект("ADODB.Recordset");
НаборЗаписей=RS;
Запрос = Новый Запрос;
Запрос.Текст =
|"Выбрать
|
|
;
ВыборкаРез=Запрос.Выполнить().Выбрать();
Пока ВыборкаРез.Следующий()Цикл
ТекстЗапроса="INSERT INTO dbo.io_agent_debt VALUES ('"+Формат(ВыборкаРез.Data,"ДФ=""ММ/дд/гггг""")+"','"
+ВыборкаРез.Контрагент+"',"
+ВыборкаРез.ИНН+"',"
+ВыборкаРез.КПП+"',"
+ВыборкаРез.Сумма+"'," ;
Команда.CommandText=ТекстЗапроса;
НаборЗаписей.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Попытка
НаборЗаписей.Close();
исключение
КонецПопытки;
DataBaseConnection.Close();
СтрокаПодключения="Provider=SQLOLEDB.1;Password=Пароль;Persist Security Info=True;User ID=billing_daemon;Initial Catalog=Таблица;Data Source=имяБазы";
Попытка
DataBaseConnection = Новый COMObject("ADODB.Connection");
Кодировка = "windows-1251";
DataBaseConnection.ConnectionString =СтрокаПодключения ;
DataBaseConnection.Open();
Команда=Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection=DataBaseConnection;
RS = Новый COMОбъект("ADODB.Recordset");
НаборЗаписей=RS;
Запрос = Новый Запрос;
Запрос.Текст =
|"Выбрать
|
|
;
ВыборкаРез=Запрос.Выполнить().Выбрать();
Пока ВыборкаРез.Следующий()Цикл
ТекстЗапроса="INSERT INTO dbo.io_agent_debt VALUES ('"+Формат(ВыборкаРез.Data,"ДФ=""ММ/дд/гггг""")+"','"
+ВыборкаРез.Контрагент+"',"
+ВыборкаРез.ИНН+"',"
+ВыборкаРез.КПП+"',"
+ВыборкаРез.Сумма+"'," ;
Команда.CommandText=ТекстЗапроса;
НаборЗаписей.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Попытка
НаборЗаписей.Close();
исключение
КонецПопытки;
DataBaseConnection.Close();
Со многим вроде бы разобрался. И все работает. Но хотелось бы задекларировать в Access переменную ВыборкаРезв которую я выгружаю Запрос.Выполнить().Выбрать();
Если я ее не декларирую то работает так:
Set ВыборкаРез = Запрос.Выполнить().Выбрать();
Если я ее декларирую как Dim ВыборкаРез As ADODB.Recordset, то не работает. :(
Если я ее не декларирую то работает так:
Set ВыборкаРез = Запрос.Выполнить().Выбрать();
Если я ее декларирую как Dim ВыборкаРез As ADODB.Recordset, то не работает. :(
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот