Имя: Пароль:
 
1C
1C 7.7
v7: 1c++ подключение к другой базе 1с 77
0 dk
 
27.09.17
14:02
Вроде была возможность натравить 1с++ на другой мд и на другой скуль чтобы нормально запрос выполнялся вида "SELECT * FROM $Справочник.Товары"
как подключиться к другому нашел, а как указать чтобы брал другой MD?
1 Дык ё
 
27.09.17
14:04
2 dk
 
27.09.17
14:08
(1) спб, видимо хелп в моей 1с-ке старый нет там такого метода
3 dk
 
27.09.17
14:15
что-то не выходит каменный цветок
4 dk
 
27.09.17
14:33

Функция ПолучитьДанныеСклада()
    Перем Результат;
    
    Результат = СоздатьОбъект("ТаблицаЗначений");
    Результат.НоваяКолонка("УИД", "Строка", 9);
    Результат.НоваяКолонка("Документ_дата", "Дата");
    
    Каталог1С    = "\\****\base\sklad\";     
    СерверSQL    = "*****";
    БазаSQL        = "sklad2014";
    userSQL        = "*****";
    pwdSQL        = "******";    
    
    БазаПодкл = СоздатьОбъект("ODBCDatabase");
    БазаПодкл.ПрисоединитьИБ(Каталог1С);
    СтрокаСоединения = "DRIVER=SQL Server;SERVER="+СокрЛП(СерверSQL)+";UID="+СокрЛП(userSQL)+";PWD="+СокрЛП(pwdSQL)+";DATABASE="+СокрЛП(БазаSQL)+";";
    Если БазаПодкл.Соединение(СтрокаСоединения) = 0 Тогда        
        Сообщить("Не удалось подключится к базе " + БазаSQL + " - проверьте параметры подключения!");
        Возврат Результат;
    КонецЕсли;
    
    ЗапросСклад = СоздатьОбъект("ODBCRecordSet");
    ЗапросСклад.УстБД(БазаПодкл);
    
    ТекстЗапроса = "
    |SELECT $Поставка.УИД УИД
    |    , MAX(NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101')) Документ_дата
    |FROM $Документ.ВводОВХ AS ВводОВХ With (NOLOCK)
    |    INNER JOIN $Документ.Поставка AS Поставка With (NOLOCK) ON $ВводОВХ.Основание = $ВидДокумента36.Поставка + Поставка.IDDOC
    |    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ВводОВХ.IDDOC = Журнал.IDDOC
    |WHERE (Журнал.DATE_TIME_IDDOC >= :д1) AND ((Журнал.CLOSED & 1)=1)
    |GROUP BY
    |    $Поставка.УИД
    |";
    
    ЗапросСклад.УстановитьТекстовыйПараметр("д1", ДобавитьМесяц(НачДата, -12));
    
    ЗапросСклад.ВыполнитьИнструкцию(ТекстЗапроса, Результат);
    
    Возврат Результат;
    
КонецФункции


Матерится на
ЗапросСклад.ВыполнитьИнструкцию(ТекстЗапроса, Результат);
{C:\USERS\******\ОТЧЕТ ПО СБРОСУ.ERT(38)}: Meta name parser error: объект не найден "$Документ.ВводОВХ"
5 dk
 
27.09.17
14:51

Функция ПолучитьДанныеСклада()
    Перем Результат;
    
    Результат = СоздатьОбъект("ТаблицаЗначений");
    Результат.НоваяКолонка("УИД", "Строка", 9);
    Результат.НоваяКолонка("Документ_дата", "Дата");
    
    Каталог1С    = "\\****\base\sklad\";    
    СерверSQL    = "*****";
    БазаSQL        = "sklad2014";
    userSQL        = "*****";
    pwdSQL        = "******";    
    
    БазаПодкл = СоздатьОбъект("ODBCDatabase");
    СтрокаСоединения = "DRIVER=SQL Server;SERVER="+СокрЛП(СерверSQL)+";UID="+СокрЛП(userSQL)+";PWD="+СокрЛП(pwdSQL)+";DATABASE="+СокрЛП(БазаSQL)+";";
    Если БазаПодкл.Соединение(СтрокаСоединения) = 0 Тогда        
        Сообщить("Не удалось подключится к базе " + БазаSQL + " - проверьте параметры подключения!");
        Возврат Результат;
    КонецЕсли;
    БазаПодкл.ПрисоединитьИБ(Каталог1С);
    
    ЗапросСклад = СоздатьОбъект("ODBCRecordSet");
    ЗапросСклад.УстБД(БазаПодкл);
    
    ТекстЗапроса = "
    |SELECT $Поставка.УИД УИД
    |    , MAX(NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101')) Документ_дата
    |FROM $Документ.ВводОВХ AS ВводОВХ With (NOLOCK)
    |    INNER JOIN $Документ.Поставка AS Поставка With (NOLOCK) ON $ВводОВХ.Основание = $ВидДокумента36.Поставка + Поставка.IDDOC
    |    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ВводОВХ.IDDOC = Журнал.IDDOC
    |WHERE (Журнал.DATE_TIME_IDDOC >= :д1) AND ((Журнал.CLOSED & 1)=1)
    |GROUP BY
    |    $Поставка.УИД
    |";
    
    ЗапросСклад.УстановитьТекстовыйПараметр("д1", ДобавитьМесяц(НачДата, -12));
    
    ЗапросСклад.ВыполнитьИнструкцию(ТекстЗапроса, Результат);
    
    Возврат Результат;
    
КонецФункции


Вот так заработало
6 Ёпрст
 
27.09.17
14:55
Можно пользовать ПрисоединитьМД.
Это, если нужно, чтоб метапарсер понимал id-ники второй базы.

ЗЫ: если че, можно писать с помощью метапарсера запрос к обоим базам одновременно.
7 Ёпрст
 
27.09.17
14:57
Процедура Сформировать()
    
    
    рс=создатьОбъект("ODBCRecordSet");
    
     ТекстЗапроса = "
    |SELECT
    |    СпрНаш.DESCR as КлиентосВЭтойбазе  -- наименование клиентоса в  этой базе, можно и не присоединять справочник, а просто типизировать
    |    ,Спр.DESCR as КлиентосВУдаленнойБазе --наименование клиентоса в удаленной базе
    |FROM $Справочник.Контрагенты СпрНаш
    |left join dataBase2.dbo.@Справочник.Контрагенты Спр on СпрНаш.Code = Спр.Code
    |";    
    глМД = СоздатьОбъект("MetaDataWork");
    ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
    глМД2 = СоздатьОбъект("MetaDataWork");
    ПутьКБазе2 = "D:\полный путьк базе данных\";
    глМД2.ПрисоединитьМД(ПутьКБазе2+"1Cv7.md");
    ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
    ТекстЗапроса=глМД2.ОбрМетаСКЛ(ТекстЗапроса);
    
    Т = рс.ВыполнитьИнструкцию(ТекстЗапроса);
    Т.ВыбратьСтроку();

КонецПроцедуры
8 Ёпрст
 
27.09.17
14:58
Это, для прилинкованного сервера, или для базы на одном скульсервере
9 dk
 
27.09.17
15:04
Ёпрст спб, прикольно
----
можно попробовать прилинковаться прямо в запросе через opendatasource
10 dk
 
27.09.17
15:58
еще нюансик выполз
БазаПодкл.ПрисоединитьИБ(Каталог1С);
{C:\USERS\****\ОТЧЕТ ПО СБРОСУ.ERT(51)}: Введенный пароль неверен.
----
в одну базу норм цепляется, а в 2 филиала по vpn матерится
сетевые каталоги филиалов открываются в проводнике нормально
Есть идеи?
11 dk
 
27.09.17
16:00
query analyzer норм с указанными логинами и паролями цепляется в филиалы
12 dk
 
28.09.17
07:50
вверх
13 FN
 
28.09.17
08:33
Укажи логин пароль пользователя 1с, а не скуля
14 varelchik
 
28.09.17
09:15
Дарю.
Функция глСоединение(ТипСоединения="",ПутьИБ="",Пользователь="Admin",Пароль="111111",ИмяСервера="") Экспорт
    Каталог=КаталогИБ();
    Если Врег(ТипСоединения)="SQL" Тогда
        Попытка
            БД =СоздатьОбъект("ODBCDataBase");
            Запрос=СоздатьОбъект("ODBCRecordSet");
            Если ПустоеЗначение(ПутьИБ)=0 Тогда
                БД.ПрисоединитьИБ(ПутьИБ,Пользователь,Пароль);
                Запрос.УстБД(БД);
            КонецЕсли;
            Возврат Запрос;
        Исключение
            Возврат 0;
        КонецПопытки;
    ИначеЕсли Врег(ТипСоединения)="ОЛЕ" Тогда
        Попытка
            БД = СоздатьОбъект("OLEDBData");  
            Если ПустоеЗначение(ПутьИБ)=0 Тогда
                БД.ПрисоединитьИБ(ПутьИБ);
            Иначе
                СтрокаСоединения = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + Каталог
                + ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";;
                БД.Соединение(СтрокаСоединения);
            КонецЕсли;
            Команда=БД.СоздатьКоманду();
            Команда.УстановитьКаталогВремТаблиц(КаталогВременныхФайлов());
            Возврат Команда;
        Исключение
            Возврат глСоединение("ДБФ",ПутьИБ);
        КонецПопытки;
    ИначеЕсли Врег(ТипСоединения)="ДБФ" Тогда
        Попытка
            
            БД =СоздатьОбъект("ODBCDataBase");
            Если ПустоеЗначение(ПутьИБ)=0 Тогда
                БД.ПрисоединитьИБ(ПутьИБ);
            Иначе
                БД.Соединение("DRIVER={Microsoft Visual FoxPro Driver};Deleted=Yes;
                |Null=Yes;Collate=RUSSIAN;Exclusive=No;SourceType=DBF;SourceDB="+Каталог);
            КонецЕсли;
            Запрос=СоздатьОбъект("ODBCRecordSet");
            Запрос.УстБД(БД);
            Возврат Запрос;
        Исключение
            Возврат 0;
        КонецПопытки;
    ИначеЕсли Врег(ТипСоединения)="SQLITE" Тогда
        база = СоздатьОбъект("SQLiteBase");
        база.Открыть(":memory:");
        Запрос = база.НовыйЗапрос();
        Запрос.ВыполнитьЗапрос("PRAGMA journal_mode=WAL");
        Возврат Запрос;
    ИначеЕсли Врег(ТипСоединения)="SQL_NEW" Тогда
        Попытка
            БД =СоздатьОбъект("ODBCDataBase");
            Запрос=СоздатьОбъект("ODBCRecordSet");
            СтрокаСоединения="Driver={SQL Server};Server="+ИмяСервера+";Database="+ПутьИБ+";Uid="+Пользователь+";Pwd="+Пароль+";";
            
            Бд.Соединение(СтрокаСоединения);
            Запрос.УстБД(БД);
            Возврат Запрос;
        Исключение
            Возврат 0;
        КонецПопытки;
    Иначе
        МФ=СоздатьОбъект("MetaInfoClasses");
        Если МФ.ЭтоSQL_Версия()=1 Тогда
            Возврат глСоединение("SQL");
        Иначе
            Возврат глСоединение("SQLite");
        КонецЕсли;
    КонецЕсли;
КонецФункции    // глСоединение
15 varelchik
 
28.09.17
09:16
Пользователь именно 1С.
16 dk
 
28.09.17
11:51
спасибо
подключение через логин пароль каталог 1с заработало
17 dk
 
03.10.17
11:33
щас проверил - подключение по OLE решает еще 1 старую проблему получения остатков на ТА (когда ТА в базах в разных месяцах)
1c++  и точка актуальности
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.