Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Подключение к сторонней базе (число прочтений - 4272 )
ElenaSh
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 17. Мая 2018
Подключение к сторонней базе
17. Мая 2018 :: 12:28
Печать  
Добрый день!
Есть задача загружать данные из сторонней базы (тоже 1С).
Проблема: судя по ругани на имена колонок, запрос выполняется к текущей базе.
Делаю следующее:
Код
Выбрать все
глМД = СоздатьОбъект("MetaDataWork");
рс = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|SELECT ПоступлениеТоваров.IDDOC [Ссылка $Документ.ПоступлениеТоваров]
...
|FROM _1SJOURN AS Журнал With (NOLOCK)
|	INNER JOIN $Документ.ПоступлениеТоваров AS ПоступлениеТоваров With (NOLOCK) ON Журнал.IDDOC = ПоступлениеТоваров.IDDOC
..."
	IDДата1 = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(Дата1),2,8);
	IDДата2 = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(Дата2),2,8);
	рс.УстановитьТекстовыйПараметр("Дата1", Дата1);
	рс.УстановитьТекстовыйПараметр("Дата2", Дата2);

	рс.Отладка();

	ПутьКБазе = "\\...\";
	глМД.ПрисоединитьМД(ПутьКБазе+"1Cv7.md");

	ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);

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

[/code]

ошибка: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'sp35986'. - это поле, которое присутствует только в сторонней базе
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1537
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #1 - 17. Мая 2018 :: 13:35
Печать  
Ну, наверное, надо базу присоединить. Как-то так
Код
Выбрать все
рс = СоздатьОбъект("ODBCRecordset");
DataBase = СоздатьОбъект("ODBCDatabase");
DataBase.ПрисоединитьИБ(Путь, Имя, Пароль);
рс.УстБД(DataBase);
ТекстЗапроса = "
|SELECT ПоступлениеТоваров.IDDOC [Ссылка $Документ.ПоступлениеТоваров]
...
 

  

FormEx developer
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #2 - 18. Мая 2018 :: 07:26
Печать  
и типизировать значения "другой" базы в объект "этой" базы не имеет смысла.
[Ссылка $Документ.ПоступлениеТоваров] - это тут не сработает
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #3 - 18. Мая 2018 :: 07:34
Печать  
по теме. Чтобы делать запрос к сторонней базе, при этом используя парсер запроса, есть два пути:
1. Подцепится к md и пропарсить запрос (это вы сделали) и соединится с самой базой данных (это не сделали)
2. сделать то и другое за раз. Как написал Альф - ПрисоединитьИБ
  

1&&2&&3
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Подключение к сторонней базе
Ответ #4 - 01. Октября 2018 :: 14:15
Печать  
А есть ли способ выполнить прямой запрос к сторонней базе из 1cv8?
Интеграторы сделали обмен данными между 1cv7 и 1cv8 через OLE подключение к базе 1cv7 и там выполняется штатный запрос. Работает это всё очень медленно. Имеется положительный опыт ускорения штатных запросов их заменой на прямые. Но как это сделать, не совсем понятно. Буду рад любой наводке...
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #5 - 02. Октября 2018 :: 05:03
Печать  
svrozhkov писал(а) 01. Октября 2018 :: 14:15:
А есть ли способ выполнить прямой запрос к сторонней базе из 1cv8?
Интеграторы сделали обмен данными между 1cv7 и 1cv8 через OLE подключение к базе 1cv7 и там выполняется штатный запрос. Работает это всё очень медленно. Имеется положительный опыт ускорения штатных запросов их заменой на прямые. Но как это сделать, не совсем понятно. Буду рад любой наводке...

Мой любимый вариант: по метаданным генерим view'хи с русскими именами, и далее где и как угодно пользуемся ими, а не напрямую табличками.
Собственно, тогда и метапарсер практически не нужен, и запросы прямо в студии колупать можно (ибо всё по-русски написано).
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Подключение к сторонней базе
Ответ #6 - 02. Октября 2018 :: 06:21
Печать  
Допустим, сам запрос я могу через .Отладка(1) уже в готовом виде получить в базе 1cv7.
А как его выполнить из 1cv8?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #7 - 02. Октября 2018 :: 08:29
Печать  
svrozhkov писал(а) 02. Октября 2018 :: 06:21:
Допустим, сам запрос я могу через .Отладка(1) уже в готовом виде получить в базе 1cv7.
А как его выполнить из 1cv8?

Через ADO DB например. Примеров можно найти.
прям первый в выдаче:  http://www.script-coding.com/ADO.html
  
Наверх
 
IP записан
 
Bosma
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 16. Января 2012
Re: Подключение к сторонней базе
Ответ #8 - 10. Декабря 2018 :: 14:24
Печать  
мы в 8-ке сделали регистр сведений со структурой 1С 7.7
вида:
измерения:
TypeObj,KindObj,IDObj,PropName,PropID,EnumID (надеюсь названия говорят сами за себя)

и далее текст запроса формируем таким образом:

IDObj_ЗБ=ПЗСТ24("IDObj","Документ","ЗаявкаБуферная");
Command  = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection   = Connection;
Command.CommandText =
select
DH"+IDObj_ЗБ+".IDDOC
from DH"+IDObj_ЗБ+"
inner join _1SJOURN
on _1SJOURN.IDDOC=DH"+IDObj_ЗБ+".IDDOC
where
СТ24"EnumID","Перечисление","СтатусыОбмена","НеобходимоПередать")+"' --СтатусОбмена=НеобходимоПередать
and _1SJOURN.CLOSED=0 --Не проведен
and _1SJOURN.ISMARK=0 --Не помечен на удаление
and  --Обработана=0";

функция ПЗСТ24 возвращает значения по переданным условиям

не так удобно, как вьюхи, зато делать можно, что угодно.
Используем и для чтения и для записи


что-то пример коряво вставляется, но принцип, думаю понятен
  
Наверх
 
IP записан
 
Bosma
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 16. Января 2012
Re: Подключение к сторонней базе
Ответ #9 - 11. Декабря 2018 :: 09:24
Печать  
ADirks писал(а) 02. Октября 2018 :: 05:03:
Мой любимый вариант: по метаданным генерим view'хи с русскими именами, и далее где и как угодно пользуемся ими, а не напрямую табличками.
Собственно, тогда и метапарсер практически не нужен, и запросы прямо в студии колупать можно (ибо всё по-русски написано).


а есть скрипт по генерации view'х?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #10 - 11. Декабря 2018 :: 09:53
Печать  
Bosma писал(а) 11. Декабря 2018 :: 09:24:
ADirks писал(а) 02. Октября 2018 :: 05:03:
Мой любимый вариант: по метаданным генерим view'хи с русскими именами, и далее где и как угодно пользуемся ими, а не напрямую табличками.
Собственно, тогда и метапарсер практически не нужен, и запросы прямо в студии колупать можно (ибо всё по-русски написано).


а есть скрипт по генерации view'х?

Мнгабукаф, в одно сообщение не влезает


Перем Запрос;
//===========================================================

Функция Ошибка(стрСообщение)
     Сообщить(стрСообщение, "!");
     ЗаписьЖурналаРегистрации(стрСообщение,, "ОшибкаПриОбновленииФункцийSQL",, 5);
     //ВЛог("Общие.БД", стрСообщение);
     Возврат 0;
КонецФункции

Функция СписокВСтроку(Сп, Разделитель = ",", ВключатьПустыеЗначения = 0, РазделительПредставления = "") Экспорт
     Перем н, Стр, Значение, Представление, Зпт;
     
     Стр = ""; Зпт = "";
     Для н = 1 По Сп.РазмерСписка() Цикл
           Значение = Строка( Сп.ПолучитьЗначение(н, Представление) );
           Если (ПустаяСтрока(Значение) = 0) ИЛИ (ВключатьПустыеЗначения = 1) Тогда
                 Стр = Стр + Зпт + Значение;
                 Если РазделительПредставления <> "" Тогда
                       Стр = Стр + РазделительПредставления+СокрЛП(Представление);
                 КонецЕсли;
                 Зпт = Разделитель;
           КонецЕсли;
     КонецЦикла;
     
     Возврат Стр;
КонецФункции

Функция СоздатьПредставление(Имя, ТекстЗапроса_Создание, фПересоздавать)
     //Проверка наличия, и удаление при необходимости
     Если фПересоздавать = 1 Тогда
           ТекстЗапроса = "Set NoCount ON
           |If OBJECT_ID('dbo."+Имя+"') Is Not Null
           |      DROP VIEW "+Имя+"
           |SELECT 1
           |";
     Иначе
           ТекстЗапроса = "Set NoCount ON
           |SELECT CASE WHEN OBJECT_ID('dbo."+Имя+"') Is Null THEN 1 ELSE 0 END
           |";
     КонецЕсли;
     
     Попытка
           фСоздавать = Запрос.ВыполнитьСкалярный(ТекстЗапроса);
     Исключение
           Ошибка(ТекстЗапроса_Создание+"
           |"+Запрос.ПолучитьОписаниеОшибки());
           Возврат 0;
     КонецПопытки;

     Если фСоздавать = 0 Тогда
           Возврат 1;
     КонецЕсли;
     
     //Собственно создание View
     Если Запрос.Выполнить(ТекстЗапроса_Создание) <> 1 Тогда
           Ошибка(ТекстЗапроса_Создание+"
           |"+Запрос.ПолучитьОписаниеОшибки());
           Возврат 0;
     КонецЕсли;
     
     Возврат 1;
КонецФункции

  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #11 - 11. Декабря 2018 :: 09:53
Печать  
Функция СоздатьПредставление_Регистр(МетаРег, фПересоздавать)
     фОшибокНет = 1;
     ИмяТаблицыДвижений = РадугаСервис.ИмяТаблицыДвижений(МетаРег.Идентификатор);
     ИмяТаблицыИтогов = РадугаСервис.ИмяТаблицыИтогов(МетаРег.Идентификатор);
     
     сзКолонки = СоздатьОбъект("СписокЗначений");
     сзДопКолонкиДвижений = СоздатьОбъект("СписокЗначений");

     Для н = 1 По МетаРег.Измерение() Цикл
           МетаИзм = МетаРег.Измерение(н);
           Колонка = "SP"+РадугаСервис.ИДИзмеренияРегистра(МетаРег.Идентификатор, МетаИзм.Идентификатор) + " as "+МетаИзм.Идентификатор;
           сзКолонки.ДобавитьЗначение(Колонка);
     КонецЦикла;
     
     стрРесурсыДвижений = ""; ЗптРД = "";
     Для н = 1 По МетаРег.Ресурс() Цикл
           МетаРес = МетаРег.Ресурс(н);
           ИмяРесурса = МетаРес.Идентификатор;
           Колонка = "SP"+РадугаСервис.ИДРесурсаРегистра(МетаРег.Идентификатор, ИмяРесурса);

           сзКолонки.ДобавитьЗначение(Колонка + " as "+ИмяРесурса);
           
           сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 0 THEN "+Колонка+" ELSE 0 END "+ИмяРесурса+"Приход");
           сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 1 THEN "+Колонка+" ELSE 0 END "+ИмяРесурса+"Расход");
     КонецЦикла;
     
     сзДопКолонкиДвижений.ДобавитьЗначение("DebKred");
     сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 0 THEN 1 ELSE -1 END ЗнакДвижения");
     сзДопКолонкиДвижений.ДобавитьЗначение("LineNo_ LineNo_");
     сзДопКолонкиДвижений.ДобавитьЗначение("LineNo_ НомерСтроки");
     сзДопКолонкиДвижений.ДобавитьЗначение("ActNo ActNo");
     сзДопКолонкиДвижений.ДобавитьЗначение("ActNo НомерДвижения");
     
     Если МетаРег.БыстраяОбработкаДвижений = 1 Тогда
           стрДатаДок = "Substring(Date_Time_IDDoc, 7, 2)+'.'+Substring(Date_Time_IDDoc, 5, 2)+'.'+Substring(Date_Time_IDDoc, 3, 2)";
           дДатаДок = "Convert(DateTime, Left(Date_Time_IDDoc, 8), 112)";

           сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc IDDoc");
           сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc идДок9");
           сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc идДокДвижения9");

           сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc Date_Time_IDDoc");
           сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc идДокДвижения23");
           сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc ПозицияДокументаДвижения");
           сзДопКолонкиДвижений.ДобавитьЗначение(стрДатаДок+" стрДатаДок");
           сзДопКолонкиДвижений.ДобавитьЗначение(дДатаДок+" ДатаДок");

           сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef IDDocDef");
           сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef ВидДок");
           сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef идВидДокДвижения10");
     КонецЕсли;


     стрКолонки = СписокВСтроку(сзКолонки, ","+РазделительСтрок+СимволТабуляции);
     Если ПустаяСтрока(стрКолонки) = 1 Тогда //регистр без измерений - не будем для него создавать вьюху
           Возврат 1;
     КонецЕсли;

     //Движения
     сзКолонки_Реквизиты = СоздатьОбъект("СписокЗначений");
     Для н = 1 По МетаРег.Реквизит() Цикл
           МетаРекв      = МетаРег.Реквизит(н);
           Колонка            = "SP"+РадугаСервис.ИДРеквизитаРегистра(МетаРег.Идентификатор, МетаРекв.Идентификатор) + " as "+МетаРекв.Идентификатор;
           сзКолонки_Реквизиты.ДобавитьЗначение(Колонка);
     КонецЦикла;

     ИмяПредставления = "рег"+МетаРег.Идентификатор;
     ТекстЗапроса = "
     |CREATE VIEW "+ИмяПредставления+"
     |AS
     |SELECT
     |      "+стрКолонки+",
     |      "+СписокВСтроку(сзКолонки_Реквизиты, ","+РазделительСтрок+СимволТабуляции)+ ?(сзКолонки_Реквизиты.РазмерСписка() = 0, "", ",") + "
     |      "+СписокВСтроку(сзДопКолонкиДвижений, ","+РазделительСтрок+СимволТабуляции)+"
     |FROM "+ИмяТаблицыДвижений+" (NoLock)
     |";

     Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
           фОшибокНет = 0;
     КонецЕсли;
     
     //Итоги
     ИмяПредставления = "рег"+МетаРег.Идентификатор+"Итоги";
     ТекстЗапроса = "
     |CREATE VIEW "+ИмяПредставления+"
     |AS
     |SELECT
     |      "+стрКолонки+",
     |      Period Period,
     |      Period ПериодИтогов
     |FROM "+ИмяТаблицыИтогов+" (NoLock)
     |";
     
     Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
           фОшибокНет = 0;
     КонецЕсли;

     Возврат фОшибокНет;
КонецФункции
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #12 - 11. Декабря 2018 :: 09:54
Печать  
Функция СоздатьПредставление_Справочник(МетаСпр, фПересоздавать)
     ИмяСправочника = МетаСпр.Идентификатор;
     ИмяТаблицы = РадугаСервис.ИмяТаблицыСправочника(ИмяСправочника);
     идСправочника10 = РадугаСервис.ИДСправочника(ИмяСправочника);
     
     сзРеквизиты = СоздатьОбъект("СписокЗначений");
     сзРеквизиты.ДобавитьЗначение("ROW_ID ROW_ID");
     сзРеквизиты.ДобавитьЗначение("ID ID");
     сзРеквизиты.ДобавитьЗначение("ID идЭлемент");
     
     сзРеквизиты.ДобавитьЗначение("IsMark IsMark");
     сзРеквизиты.ДобавитьЗначение("IsMark ПометкаУдаления");

     Если МетаСпр.КоличествоУровней > 1 Тогда
           сзРеквизиты.ДобавитьЗначение("IsFolder IsFolder");
           сзРеквизиты.ДобавитьЗначение("IsFolder ЭтоГруппа");
           сзРеквизиты.ДобавитьЗначение("ParentID ParentID");
           сзРеквизиты.ДобавитьЗначение("ParentID идРодитель");
     КонецЕсли;
     Если МетаСпр.Владелец.Выбран() = 1 Тогда
           сзРеквизиты.ДобавитьЗначение("ParentExt ParentExt");
           сзРеквизиты.ДобавитьЗначение("ParentExt идВладелец");
     КонецЕсли;
     Если МетаСпр.ДлинаКода > 0 Тогда
           сзРеквизиты.ДобавитьЗначение("Code Code");
           сзРеквизиты.ДобавитьЗначение("Code Код");
     КонецЕсли;
     Если МетаСпр.ДлинаНаименования > 0 Тогда
           сзРеквизиты.ДобавитьЗначение("Descr Descr");
           сзРеквизиты.ДобавитьЗначение("RTrim(Descr) Наименование");
     КонецЕсли;
     
     сзРеквизиты.ДобавитьЗначение("VerStamp VerStamp");
     
     сзРеквизиты.ДобавитьЗначение("'ID,11,"+идСправочника10+",' + ID РасшифровкаДляОтчетов");
     Если МетаСпр.Реквизит("ExchangeID").Выбран() = 1 Тогда
           ExchangeID = "SP"+РадугаСервис.ИДРеквизитаСправочника(ИмяСправочника, "ExchangeID");
           сзРеквизиты.ДобавитьЗначение("'ExID,11,"+идСправочника10+",' + "+ExchangeID+" РасшифровкаДляОтчетовВнешняя");
     Иначе
           сзРеквизиты.ДобавитьЗначение("'' РасшифровкаДляОтчетовВнешняя");
     КонецЕсли;
     
     Для н = 1 По МетаСпр.Реквизит() Цикл
           МетаРекв = МетаСпр.Реквизит(н);
           Если МетаРекв.Периодический = 1 Тогда
                 Продолжить;
           КонецЕсли;
           ИмяРеквизита = МетаРекв.Идентификатор;
           ИмяКолонки = "SP"+РадугаСервис.ИДРеквизитаСправочника(ИмяСправочника, ИмяРеквизита);
           сзРеквизиты.ДобавитьЗначение(ИмяКолонки+" "+ИмяРеквизита);
     КонецЦикла;
     
     Зпт = ",
     |      ";
     стрРеквизиты = СписокВСтроку(сзРеквизиты, Зпт);

     
     ИмяПредставления = "спр"+ИмяСправочника;
     ТекстЗапроса = "
     |CREATE VIEW "+ИмяПредставления+" AS
     |SELECT
     |      "+стрРеквизиты+"
     |FROM "+ИмяТаблицы+" (NoLock)
     |";
     
     Возврат СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать);
КонецФункции

Функция СоздатьПредставление_ЖурналДокументов(фПересоздавать)
     стрДатаДок = "Substring(Date_Time_IDDoc, 7, 2)+'.'+Substring(Date_Time_IDDoc, 5, 2)+'.'+Substring(Date_Time_IDDoc, 3, 2)";
     дДатаДок = "Convert(DateTime, Left(Date_Time_IDDoc, 8), 112)";

     сзКолонки = СоздатьОбъект("СписокЗначений");
     сзКолонки.ДобавитьЗначение("ROW_ID ROW_ID");
     сзКолонки.ДобавитьЗначение("IDJOURNAL");
     сзКолонки.ДобавитьЗначение("IDJOURNAL идЖурнал10");
     сзКолонки.ДобавитьЗначение("IDDoc");
     сзКолонки.ДобавитьЗначение("IDDoc идДок9");
     сзКолонки.ДобавитьЗначение("IDDocDef");
     сзКолонки.ДобавитьЗначение("IDDocDef идВидДок10");
     сзКолонки.ДобавитьЗначение("IDDocDef ВидДок");
     сзКолонки.ДобавитьЗначение("AppCode");
     сзКолонки.ДобавитьЗначение("DATE_TIME_IDDOC");
     сзКолонки.ДобавитьЗначение("DATE_TIME_IDDOC ПозицияДокумента");
     сзКолонки.ДобавитьЗначение("DATE_TIME_IDDOC идДок23");
     сзКолонки.ДобавитьЗначение(стрДатаДок+" стрДатаДок");
     сзКолонки.ДобавитьЗначение(дДатаДок+" ДатаДок");
     сзКолонки.ДобавитьЗначение("'№'+Rtrim(DocNo)+' от '+"+стрДатаДок+" НомерДата");
     сзКолонки.ДобавитьЗначение("DNPrefix");
     сзКолонки.ДобавитьЗначение("DOCNO");
     сзКолонки.ДобавитьЗначение("LTrim(RTrim(DOCNO)) НомерДок");
     сзКолонки.ДобавитьЗначение("Closed");
     сзКолонки.ДобавитьЗначение("Closed&1 Проведен");
     сзКолонки.ДобавитьЗначение("IsMark");
     сзКолонки.ДобавитьЗначение("IsMark ПометкаУдаления");
     сзКолонки.ДобавитьЗначение("ActCnt");
     сзКолонки.ДобавитьЗначение("VerStamp");
     
     Для н = 1 По Метаданные.Регистр() Цикл
           МетаРег = Метаданные.Регистр(н);
           КолонкаРекв = "RF"+РадугаСервис.ИДОбъекта(МетаРег);
           сзКолонки.ДобавитьЗначение(КолонкаРекв);
     КонецЦикла;


     Для н = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
           МетаРекв = Метаданные.ОбщийРеквизитДокумента(н);
           Если МетаРекв.Сортировка = 1 Тогда
                 ИмяРекв = МетаРекв.Идентификатор;
                 КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
                 сзКолонки.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
                 сзКолонки.ДобавитьЗначение(КолонкаРекв+" "+КолонкаРекв);
           КонецЕсли;
     КонецЦикла;
     
     МетаРекв = Метаданные.ОбщийРеквизитДокумента("идДок13");
     КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
     сзКолонки.ДобавитьЗначение("'ID,12,' + "+КолонкаРекв+" РасшифровкаДляОтчетов");

     //КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта( Метаданные.ОбщийРеквизитДокумента("ExchangeID") );
     //сзКолонки.ДобавитьЗначение("'ExID,12,' + "+КолонкаРекв+" РасшифровкаДляОтчетовВнешняя");
     
     сзКолонки.ДобавитьЗначение("dbo.ПредставлениеДокумента(IDDoc, 1, 1) ПредставлениеДокумента");

     //стрПредставление = "(SELECT ПредставлениеДокумента FROM " + ИмяВторойБазы + ".ОбщиеРеквизиты ОбщиеРеквизиты (NoLock) WHERE ОбщиеРеквизиты.идДок = _1SJourn.IDDOC) ПредставлениеДокумента";
     //сзКолонки.ДобавитьЗначение(стрПредставление);
     

     стрКолонки = СписокВСтроку(сзКолонки, ","+РазделительСтрок+СимволТабуляции);

     ИмяПредставления = "ЖурналДокументов";
     ТекстЗапроса = "
     |CREATE VIEW "+ИмяПредставления+" AS
     |SELECT
     |      "+стрКолонки+"
     |FROM _1SJourn (NoLock)
     |";
     
     Возврат СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать);
КонецФункции
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Подключение к сторонней базе
Ответ #13 - 11. Декабря 2018 :: 09:55
Печать  
Функция СоздатьПредставление_Документ(МетаДок, фПересоздавать)
     фОшибокНет = 1;
     
     ИмяДокумента = МетаДок.Идентификатор;
     ИмяТаблицы = РадугаСервис.ИмяТаблицыШапки(ИмяДокумента);
     ИмяТаблицыТЧ = РадугаСервис.ИмяТаблицыТабличнойЧасти(ИмяДокумента);
     
     сзРеквизиты = СоздатьОбъект("СписокЗначений");
     сзРеквизиты.ДобавитьЗначение("IDDoc");
     сзРеквизиты.ДобавитьЗначение("IDDoc идДок9");
     
     Для н = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
           МетаРекв = Метаданные.ОбщийРеквизитДокумента(н);
           Если МетаРекв.Сортировка = 0 Тогда
                 ИмяРекв = МетаРекв.Идентификатор;
                 КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
                 сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
           КонецЕсли;
     КонецЦикла;

     Для н = 1 По МетаДок.РеквизитШапки() Цикл
           МетаРекв = МетаДок.РеквизитШапки(н);
           ИмяРекв = МетаРекв.Идентификатор;
           КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
           сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
     КонецЦикла;

     Для н = 1 По МетаДок.РеквизитТабличнойЧасти() Цикл
           МетаРекв = МетаДок.РеквизитТабличнойЧасти(н);
           Если МетаРекв.ИтогПоКолонке = 1 Тогда
                 ИмяРекв = МетаРекв.Идентификатор;
                 КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
                 сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
           КонецЕсли;
     КонецЦикла;

     стрРеквизиты = СписокВСтроку(сзРеквизиты, ","+РазделительСтрок+СимволТабуляции);

     ИмяПредставления = "док"+ИмяДокумента;
     ТекстЗапроса = "
     |CREATE VIEW "+ИмяПредставления+"
     |AS
     |SELECT
     |      "+стрРеквизиты+"
     |FROM "+ИмяТаблицы+" (NoLock)
     |";
     
     Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
           фОшибокНет = 0;
     КонецЕсли;

     // Табличная часть
     Если МетаДок.РеквизитТабличнойЧасти() > 0 Тогда
           сзРеквизиты = СоздатьОбъект("СписокЗначений");
           сзРеквизиты.ДобавитьЗначение("IDDoc");
           сзРеквизиты.ДобавитьЗначение("IDDoc идДок9");
           сзРеквизиты.ДобавитьЗначение("LineNo_");
           сзРеквизиты.ДобавитьЗначение("LineNo_ НомерСтроки");
           Для н = 1 По МетаДок.РеквизитТабличнойЧасти() Цикл
                 МетаРекв = МетаДок.РеквизитТабличнойЧасти(н);
                 ИмяРекв = МетаРекв.Идентификатор;
                 КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
                 сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
           КонецЦикла;
     
           стрРеквизиты = СписокВСтроку(сзРеквизиты, ","+РазделительСтрок+СимволТабуляции);

           //вариант 1
           ИмяПредставления = "док"+ИмяДокумента+"ТЧ";
           ТекстЗапроса = "
           |CREATE VIEW "+ИмяПредставления+" AS
           |SELECT
           |      "+стрРеквизиты+"
           |FROM "+ИмяТаблицыТЧ+" (NoLock)
           |";
           
           Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
                 фОшибокНет = 0;
           КонецЕсли;

           //вариант 2
           ИмяПредставления = "докТЧ"+ИмяДокумента;
           ТекстЗапроса = "
           |CREATE VIEW "+ИмяПредставления+" AS
           |SELECT
           |      "+стрРеквизиты+"
           |FROM "+ИмяТаблицыТЧ+" (NoLock)
           |";
           
           Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
                 фОшибокНет = 0;
           КонецЕсли;
     КонецЕсли;
     
     Возврат 1;
КонецФункции

Функция СоздатьПредставление_Календарь(МетаКалендарь)
     ИмяПредставления = "календарь"+МетаКалендарь.Идентификатор;
     ТекстЗапроса = "
     |CREATE VIEW "+ИмяПредставления+" AS
     |SELECT
     |      Календарь.Date Дата,
     |      Календарь.DayLen Часы,
     |      CASE WHEN Календарь.DayLen != 0 THEN 1 ELSE 0 END Дни
     |FROM
     |      Cl Календарь With (NoLock)
     |WHERE
     |      Календарь.Id = $Календарь."+МетаКалендарь.Идентификатор+"
     |";
     
     Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, 1) = 0 Тогда
           фОшибокНет = 0;
     КонецЕсли;
     
     Возврат 1;
КонецФункции


Функция СоздатьПредставленияПоМетаданным(фПересоздавать)
     Если фПересоздавать = 1 Тогда
           КомментарийДляЖурнала = "Полное пересоздание";
     Иначе
           КомментарийДляЖурнала = "Проверка наличия";
     КонецЕсли;
     ЗаписьЖурналаРегистрации(КомментарийДляЖурнала,, "СоздатьПредставленияПоМетаданным",, 3);
     
     фОшибокНет = 1;
     
     Для н = 1 По Метаданные.Регистр() Цикл
           МетаРег = Метаданные.Регистр(н);
           Если СоздатьПредставление_Регистр(МетаРег, фПересоздавать) = 0 Тогда
                 фОшибокНет = 0;
           КонецЕсли;
     КонецЦикла;

     Для н = 1 По Метаданные.Справочник() Цикл
           МетаСпр = Метаданные.Справочник(н);
           Если СоздатьПредставление_Справочник(МетаСпр, фПересоздавать) = 0 Тогда
                 фОшибокНет = 0;
           КонецЕсли;
     КонецЦикла;
     
     Если СоздатьПредставление_ЖурналДокументов(фПересоздавать) = 0 Тогда
           фОшибокНет = 0;
     КонецЕсли;
     
     Для н = 1 По Метаданные.Документ() Цикл
           МетаДок = Метаданные.Документ(н);
           Если СоздатьПредставление_Документ(МетаДок, фПересоздавать) = 0 Тогда
                 фОшибокНет = 0;
           КонецЕсли;
     КонецЦикла;

     Для н = 1 По Метаданные.Календарь() Цикл
           МетаКалендарь = Метаданные.Календарь(н);
           Если СоздатьПредставление_Календарь(МетаКалендарь) = 0 Тогда
                 фОшибокНет = 0;
           КонецЕсли;
     КонецЦикла;

     Возврат фОшибокНет;
КонецФункции

//===========================================================
//===========================================================
Запрос = СоздатьОбъект("ODBCRecordSet");
  
Наверх
 
IP записан
 
Bosma
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 16. Января 2012
Re: Подключение к сторонней базе
Ответ #14 - 14. Декабря 2018 :: 08:10
Печать  
спасибо!!!!! век живи - век учись. Подправил для своих нужд, супер!

Не сочтите за наглость, а нет ли похожего скрипта для 1С8, знаю, что не по теме, но все же
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать