Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Доступ в другую базу на том же SQL-сервере (число прочтений - 6683 )
mistyx
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 25. Февраля 2010
Доступ в другую базу на том же SQL-сервере
26. Февраля 2010 :: 10:44
Печать  
Добрый день.

Есть несколько баз, часть из которых имеет одинаковую структуру, а часть - нет. Пишется обработка, которая должна выгружать данные из всех баз поочередно. На этом форуме была предложена идея (greets to Z1) о доступе к разным базам из одной. Т.е. обработка запускается в одной базе, а дальше - с помощью изменения ODBCDataBase - обрабатываются все базы подряд.

При попытке обработать первую нестандартную (в рамках моей системы) базу получаю сообщение о невозможности типизации имени документа, который отсутствует в базе, где запускается обработка. Можно ли как-то заставить 1С брать типы документов (ну и все остальное, очевидно) из той базы, к которой производится текущее подключение?

С уважением, /me.

ЗЫ: Естественно, ссылки на ФАК приветствуются в той же мере, что и прямые ответы Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Доступ в другую базу на том же SQL-сервере
Ответ #1 - 26. Февраля 2010 :: 10:55
Печать  
Лучше видеть реальный запрос
и дословно какое на него пишется сообщение.

PS для нестандартных баз не  используй метапарсер
и используй родные имена таблиц и реквизитов ( как они заданы в sql)
  
Наверх
 
IP записан
 
slawa
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 125
Зарегистрирован: 05. Октября 2006
Re: Доступ в другую базу на том же SQL-сервере
Ответ #2 - 26. Февраля 2010 :: 11:22
Печать  
Делай так:
БД = СоздатьОбъект("ODBCDataBase");
Попытка
     БД.ПрисоединитьИБ(_ПутьМД, "Администратор", _пароль);
Исключение
КонецПопытки;
Если БД.ЕстьСоединение()=0 Тогда
     БД = 0;
     Сообщить("Ошибка подключения к внешней базе """+ТипБазы+"""", "!!!");
     _ПутьМД = "";
     Возврат 0;
КонецЕсли;
RS = СоздатьОбъект("ODBCRecordSet");
RS.УстБД(БД);
RS.мд.ПрисоединитьМД(_ПутьМД+"1cv7.md"); //фигня    МД-шник загружается дважды

//Строку "фигня" можно будет убрать когда исправят ошибку в 1cpp.dll (баг № 3560) ("столетней давности")

Далее можно отдавать запросы RS. Они будут обрабатываться метапарсером внешней базы.
« Последняя редакция: 26. Февраля 2010 :: 12:36 - slawa »  
Наверх
 
IP записан
 
slawa
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 125
Зарегистрирован: 05. Октября 2006
Re: Доступ в другую базу на том же SQL-сервере
Ответ #3 - 26. Февраля 2010 :: 11:35
Печать  
баг № 3560 тебе не помешает если не будешь пользоваться RS.мд
  
Наверх
 
IP записан
 
mistyx
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 25. Февраля 2010
Re: Доступ в другую базу на том же SQL-сервере
Ответ #4 - 26. Февраля 2010 :: 11:57
Печать  
Z1, с учетом дополнения от slawa запрос выглядит так:

Код
Выбрать все
БазаДанных = СоздатьОбъект("ODBCDataBase");

СтрокаСоединения = "Driver={SQL Server};Server=BS-SERVER;Database=" + ИмяБазы + ";Uid=" + Логин + ";Pwd=" + Пароль + ";";

БазаДанных.ПрисоединитьИБ(КаталогБазы, Логин, Пароль, СтрокаСоединения);

Обработчик = СоздатьОбъект("ODBCRecordset"); Обработчик.УстБД(БазаДанных);

Обработчик.МД.ПрисоединитьМД(КаталогБазы + "1cv7.md");

ТекстЗапроса = "SELECT TOP 10 IDDoc as [ID $Документ.РеализацияТары] FROM " + ИмяБазы + ".dbo.$Документ.РеализацияТары (nolock)";

Результат = Обработчик.ВыполнитьИнструкцию(ТекстЗапроса);
	  
Результат.ВыбратьСтроки(); 



Переменные ИмяБазы, КаталогБазы, Логин и Пароль определены ранее и определены правильно. И параметры базы относятся именно к той базе, где живет нужный тип документа. Переменная КаталогБазы оканчивается на "\".

В ответ получаю: Meta name parser error: объект не найден "$Документ.РеализацияТары". Это совершенно логично для базы, из которой запускается запрос, в ней такого типа документа, разумеется, нет. Однако все-таки хочется парсить таблицу $Документ.РеализацияТары с использованием структуры базы, в которой он есть.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Доступ в другую базу на том же SQL-сервере
Ответ #5 - 26. Февраля 2010 :: 12:07
Печать  
Попробуйте все наоборот.
Сначала решите задачу в  терминах sql получите большой работающий sql запрос( в родный идентефикаторах баз желательно вообще в qa) потом уже займетесь типизацией результатов.
  
Наверх
 
IP записан
 
slawa
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 125
Зарегистрирован: 05. Октября 2006
Re: Доступ в другую базу на том же SQL-сервере
Ответ #6 - 26. Февраля 2010 :: 12:18
Печать  
Код
Выбрать все
ТекстЗапроса = "SELECT TOP 10 IDDoc as [ID $Документ.РеализацияТары] FROM " + ИмяБазы + ".dbo.$Документ.РеализацияТары (nolock)";
 



"ИмяБазы+dbo." - не требуется. Это и так предполагается при присоединении базы

что-то я не могу понять, что ты хочешь получить в поле [ID $Документ.РеализацияТары] если такого документа вообще нет в локальной базе ?

хотя даже если и есть документ, с таким наименование, то типизировать, его,  все равно не получится. (коды то разные)


  
Наверх
 
IP записан
 
mistyx
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 25. Февраля 2010
Re: Доступ в другую базу на том же SQL-сервере
Ответ #7 - 26. Февраля 2010 :: 12:27
Печать  
slawa писал(а) 26. Февраля 2010 :: 12:18:
что-то я не могу понять, что ты хочешь получить в поле [ID $Документ.РеализацияТары] если такого документа вообще нет в локальной базе ?

хотя даже если и есть документ, с таким наименование, то типизировать, его,  все равно не получится. (коды то разные)


Вот как раз эту типизацию я и хотел провести. А почему нет, если к рекордсету подключается мд-файл, в котором такой тип документа описан и все действия производятся с базой, в которой такие документы есть? Или я хочу невозможного?
  
Наверх
 
IP записан
 
slawa
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 125
Зарегистрирован: 05. Октября 2006
Re: Доступ в другую базу на том же SQL-сервере
Ответ #8 - 26. Февраля 2010 :: 12:33
Печать  
mistyx писал(а) 26. Февраля 2010 :: 12:27:
slawa писал(а) 26. Февраля 2010 :: 12:18:
что-то я не могу понять, что ты хочешь получить в поле [ID $Документ.РеализацияТары] если такого документа вообще нет в локальной базе ?

хотя даже если и есть документ, с таким наименование, то типизировать, его,  все равно не получится. (коды то разные)


Вот как раз эту типизацию я и хотел провести. А почему нет, если к рекордсету подключается мд-файл, в котором такой тип документа описан и все действия производятся с базой, в которой такие документы есть? Или я хочу невозможного?


нужно получать не таблицу с документами неизвестного, в локальной базе, вида, а конкретные значения. (строки, числа)
и с ним дальше разбираться
  
Наверх
 
IP записан
 
mistyx
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 25. Февраля 2010
Re: Доступ в другую базу на том же SQL-сервере
Ответ #9 - 26. Февраля 2010 :: 12:55
Печать  
slawa писал(а) 26. Февраля 2010 :: 12:33:
нужно получать не таблицу с документами неизвестного, в локальной базе, вида, а конкретные значения. (строки, числа)
и с ним дальше разбираться

Трабл заключается в том, что мне нужно на выход отдавать все ID-номера в обертке ЗначениеВСтрокуВнутр(), чтобы в них участвовал номер таблицы, по которому мы дальше производим синхронизацию данных. Соответственно, очень хочется производить эту типизацию на лету, чтобы ID-номера лежали в одном (почти уникальном) поле.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Доступ в другую базу на том же SQL-сервере
Ответ #10 - 26. Февраля 2010 :: 13:02
Печать  
mistyx писал(а) 26. Февраля 2010 :: 12:55:
slawa писал(а) 26. Февраля 2010 :: 12:33:
нужно получать не таблицу с документами неизвестного, в локальной базе, вида, а конкретные значения. (строки, числа)
и с ним дальше разбираться

Трабл заключается в том, что мне нужно на выход отдавать все ID-номера в обертке ЗначениеВСтрокуВнутр(), чтобы в них участвовал номер таблицы, по которому мы дальше производим синхронизацию данных. Соответственно, очень хочется производить эту типизацию на лету, чтобы ID-номера лежали в одном (почти уникальном) поле.

Кто то кого-то не понимает
сделайте как написано в 5.
Для типизации в общий запрос добавляем номер базы данных
select  top 100  id,1 as glob_bd from  db1.dbo.cs1
union all
select  top 100  id,2 from  db2.dbo.cs1
union all
select  top 100  id,3 from  db3.dbo.cs1213  -- нестандарная база

Когда такой запрос нужный вам со всякими ограничениями дополнениями заработает только тогда можно что-то думать о типизации результатов, используя  glob_bd или усложнив работающий запрос.
  
Наверх
 
IP записан
 
slawa
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 125
Зарегистрирован: 05. Октября 2006
Re: Доступ в другую базу на том же SQL-сервере
Ответ #11 - 26. Февраля 2010 :: 13:06
Печать  
Попытаюсь промедитировать Улыбка
Все-таки ты хочешь синхронизировать базы одинаковой структуры, но с разными IDшниками объектов.
Такие могли получиться если при загрузке изменений в конфигурацию использовалась операция "Объединение баз", а не "Загрузка измененной базы"

Так ?

Тогда 1cpp.dll, в текущей реализации, тебе не поможет. ИМХО
Тебе придется самому сопоставлять разные ID, для одинаковых (по наименованию) объектов.
  
Наверх
 
IP записан
 
mistyx
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 25. Февраля 2010
Re: Доступ в другую базу на том же SQL-сервере
Ответ #12 - 26. Февраля 2010 :: 13:20
Печать  
Z1 писал(а) 26. Февраля 2010 :: 13:02:
Кто то кого-то не понимает
сделайте как написано в 5.
Для типизации в общий запрос добавляем номер базы данных
select  top 100  id,1 as glob_bd from  db1.dbo.cs1
union all
select  top 100  id,2 from  db2.dbo.cs1
union all
select  top 100  id,3 from  db2.dbo.cs1213  -- нестандарная база

Когда такой запрос нужный вам со всякими ограничениями дополнениями заработает только тогда можно что-то думать о типизации результатов, используя  glob_bd или усложнив работающий запрос.

Однозначно, не понимаю я - потому что не работает запрос у меня Улыбка

Сожалею, что не ответил раньше на Ваше предыдущее сообщение. Запрос в виде

Код
Выбрать все
ТекстЗапроса = "SELECT TOP 10 IDDoc FROM " + ИмяБазы + ".dbo.$Документ.РеализацияТары (nolock)"; 



без типизации загружаемого поля нормально отрабатывает. Ошибка возникает именно при попытке типизации возвращаемого значения. А типизация как раз нужна для того, чтобы в одном поле получить уникальную для базы строку, совмещающую в себе номер таблицы с документом и номер самого документа. Кстати, с документами вполне можно обойтись без типизации, потому что ID документа уникален. А вот со справочниками такой финт ушами не получится, потому что нам приходится сливать в единую таблицу, например, Номенклатуру, Материалы и ОсновныеСредства. И здесь уже ни о какой уникальности, к сожалению, не может быть и речи. При этом справочники точно также будут разные в разных базах. Вот как-то так...
  
Наверх
 
IP записан
 
mistyx
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 25. Февраля 2010
Re: Доступ в другую базу на том же SQL-сервере
Ответ #13 - 26. Февраля 2010 :: 13:23
Печать  
slawa писал(а) 26. Февраля 2010 :: 13:06:
Попытаюсь промедитировать Улыбка
Все-таки ты хочешь синхронизировать базы одинаковой структуры, но с разными IDшниками объектов.
Такие могли получиться если при загрузке изменений в конфигурацию использовалась операция "Объединение баз", а не "Загрузка измененной базы"

Так ?

Тогда 1cpp.dll, в текущей реализации, тебе не поможет. ИМХО
Тебе придется самому сопоставлять разные ID, для одинаковых (по наименованию) объектов.

Правильно медитируешь, можешь записываться в телепаты Улыбка

Базы делал не я, делали их не для меня, однако возиться сейчас приходится с ними именно мне.

Собственно, последние несколько часов я домогаюсь тебя и Z1 на тему упрощения моей работы - чтобы можно было запускать одну обработку в одной базе, которая сама подключится ко всем остальным базам и все сделает.

Может быть, есть альтернативные, более простые варианты автоматизации обработки нескольких баз, различных по структуре? Опять-таки, ссылки на ФАК вполне привествуются Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Доступ в другую базу на том же SQL-сервере
Ответ #14 - 26. Февраля 2010 :: 13:25
Печать  
да потому что неправильно фраза построена
dbo.$Документ.РеализацияТары

$Документ.РеализацияТары т.к. перед $ точка то скорее всего метапарсер это все пропускает и не подставляет нужной таблицы sql

Чтобы увидеть это используйте метод
Отладка(1)

Также можно используя отладка(1) получить в каждой базе
запрос к родной базе потом  их соеденить union all

Я совсем запутался я думал что тебе нужен общий результат на множестве баз ( ну типа сумма всех приходных накладных за период или что то такое )
я сейчас я понимаю что не понимаю зачем тебе нужен общий запрос

Так что лучше еще раз сформулируй задачу в человеческих терминах.

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать