Имя: Пароль:
1C
1С v8
Запись во внешний источник данных
0 just86
 
18.06.18
16:30
Здравствуйте. Подскажите, как можно записать во внешнюю базу на mssql тип данных типа Хранилище значений?

Задача передать историю изменения объекта в одной базе в другую (Версии объектов)
1 LeoKeyn
 
18.06.18
16:35
(0) Делал вроде что то вроде такой задачи. Записывал подключением к другой sql базе

Попытка
        Соединение  = Новый COMОбъект("ADODB.Connection");
        Команда     = Новый COMОбъект("ADODB.Command");
        Выборка     = Новый COMОбъект("ADODB.RecordSet");
        Соединение.ConnectionString =
            "driver={SQL Server};" +
            "server="+ИмяСервераSQL+";"+
            "uid="+ПользовательSQL+";"+
            "pwd="+ПарольSQL+";"+
            "database="+БазаДанныхSQL+";";
        Соединение.ConnectionTimeout = 30;
        Соединение.CommandTimeout = 600;
        //Открытие соединение
        Соединение.Open();
        Команда.ActiveConnection   = Соединение;
        Сообщить("Успешно!");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
2 LeoKeyn
 
18.06.18
16:39
(1) Попытка
        Соединение  = Новый COMОбъект("ADODB.Connection");
        Команда     = Новый COMОбъект("ADODB.Command");
        Выборка     = Новый COMОбъект("ADODB.RecordSet");
        Соединение.ConnectionString =
            "driver={SQL Server};" +
            "server="+ИмяСервераSQL+";"+
            "uid="+""+";"+
            "pwd="+""+";"+
            "database="+БазаДанныхSQL+";";
        Соединение.ConnectionTimeout = 30;
        Соединение.CommandTimeout = 600;
        //Открытие соединение
        Соединение.Open();
        Команда.ActiveConnection   = Соединение;
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    УИД = XMLСтрока(Объект.ДокументСсылка.УникальныйИдентификатор());
        Для Каждого Строка ИЗ Объект.Файлы Цикл
        ДвоичныйДокумент = Новый ДвоичныеДанные(Строка.ПутьКФайлу);
        ДвоичныйДокумент = Base64Строка(ДвоичныйДокумент);
        //Хранилище = Новый ХранилищеЗначения(ДвоичныйДокумент);
         ТекстТекущейИнструкции =
        "INSERT INTO "+ТаблицаSQL+"
        |([C_Link], [C_FileName], [C_File],  [C_Format])
        |VALUES ('"+УИД+"', '"+Строка.ИмяФайла+"', '"+ДвоичныйДокумент+"', '"+Строка.ФорматФайла+"')";
    Попытка
        Соединение.Execute(ТекстТекущейИнструкции,,128);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

вот нашел, я сохранял в другую базу файлы прикрепленные
3 just86
 
18.06.18
16:39
(1) Ну соединение у меня есть, запись в ту базу тоже есть, там данные отображаются. Вопрос только в типа Хранилище значений.
Делаю так:

ЗаписьXML = Новый ЗаписьXML;
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
        ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла);
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ЗаписатьXML(ЗаписьXML, ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(), НазначениеТипаXML.Явное);
        ЗаписьXML.Закрыть();
        ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
        ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные);
        
        УдалитьФайлы(ИмяВременногоФайла);

и потом пытаюсь передать Хранилище данных в ту базу.
Там хранилище не читается. Получить() возвращает неопределено
4 LeoKeyn
 
18.06.18
16:42
(3) у меня тоже не получалось вроде и я как строку сохранял Base64Строка
5 just86
 
18.06.18
16:44
(4) отлично. спасибо. тоже буду гонять строку
6 LeoKeyn
 
18.06.18
16:47
(5) Пожалуйста :-) долго мучался с этим :-) приятно поделиться

Поделюсь, думаю поможет:

Получение данных


Попытка
        Соединение  = Новый COMОбъект("ADODB.Connection");
        Команда     = Новый COMОбъект("ADODB.Command");
        Выборка     = Новый COMОбъект("ADODB.RecordSet");
        Соединение.ConnectionString =
            "driver={SQL Server};" +
            "server="+ИмяСервераSQL+";"+
            "uid="+""+";"+
            "pwd="+""+";"+
            "database="+БазаДанныхSQL+";";
        Соединение.ConnectionTimeout = 30;
        Соединение.CommandTimeout = 600;
        //Открытие соединение
        Соединение.Open();
        Команда.ActiveConnection   = Соединение;
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Если Объект.ДокументСсылка.Пустая() Тогда
        ТекстИнструкции =
        "SELECT
      | *
  | FROM [Recourses].[dbo].[RecoursessFiles]"
    Иначе
        ТекстИнструкции =
        "SELECT
        | *
        | FROM "+ТаблицаSQL+"
        | WHERE C_Link='"+XMLСтрока(Объект.ДокументСсылка.УникальныйИдентификатор())+"'";
    КонецЕсли;
    
    /////////////////////////////////////////
    //Читаем записи
    
    //Попытка
        Команда.CommandText = ТекстИнструкции;
        Выборка = Команда.Execute();
        Если Выборка.BOF = Ложь Тогда
            Выборка.MoveFirst();
            Пока Выборка.EOF = Ложь Цикл
                //Сообщить("[C_DateTime]="+Дата(Выборка.Fields("C_DateTime").Value)
                //    +", [C_Char]="+СокрЛП(Выборка.Fields("C_Char").Value)
                //    +", [C_Numeric]="+Число(Выборка.Fields("C_Numeric").Value));
                    Строчка = Объект.Файлы.Добавить();
                    УИДСтрока = Выборка.Fields("C_Link").Value;
                    Строчка.Основание = ПолучитьСсылку(УИДСтрока);
                    Строчка.ИмяФайла = Выборка.Fields("C_FileName").Value;
                    Строчка.ПутьКФайлу = Выборка.Fields("C_File").Value;
                    Строчка.ФорматФайла = Выборка.Fields("C_Format").Value;
                    //Сообщить(Выборка.Fields("C_Link").Value+", "+Выборка.Fields("C_FileName").Value+", "+Выборка.Fields("C_File").Value+", "+Выборка.Fields("C_Format").Value+", ");
                Выборка.MoveNext();
            КонецЦикла;
        КонецЕсли;


И перевод из двоичного вида



ТекущаяСтрока = Элементы.Файлы.ТекущиеДанные;
    Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
Диалог = Новый ДиалогВыбораФайла(Режим);
Диалог.Заголовок = "Выбор файла для сохранения";
//Диалог.Фильтр = "Файл двоичных данных (*.bin)|*.bin";
    
Если Не Диалог.Выбрать() Тогда
   Возврат ;
Иначе
   ИмяФайла= Диалог.Каталог;
КонецЕсли;
Файл = ТекущаяСтрока.ПутьКФайлу;
Файл = Base64Значение(Файл);
ПолныйПутьКФайлу = СтрЗаменить(ИмяФайла+"\"+ТекущаяСтрока.ИмяФайла, "\\", "\");
Файл.Записать(ПолныйПутьКФайлу);