Имя: Пароль:
1C
1С v8
Выгрузить выборку в ТЗ
0 antihacker
 
23.10.17
07:05
Всем привет !

Вот так получаю данные из внешнего источника

        //Подключаемся к SQL
Connection = Новый COMОбъект("ADODB.Connection");

СтрокаПодключения = "Provider=SQLOLEDB.1; Password='Protect1';Persist Security Info=True;User ID='fortrexport';Initial Catalog='Documentation_TR_2012'; Data Source='skyzmo053vapp2';";

Connection.Open(СтрокаПодключения);  

Результат = Новый COMОбъект("ADODB.Command");

//Результат = СистемныйМодуль.ПодключитьВнешнийИсточник("Protect@1","sa","SKD","skyzmo039vapp1");
попытка
Результат.ActiveConnection = Connection ; // работаем через это соединение
исключение
сообщить("не подключен");
конецпопытки;

Результат.CommandTimeOut = "1500"; // таков тайм-аут

Результат.CommandType = "adCmdText"; // исполняем в точности процедуру

Результат.CommandText ="SELECT dbo.dogovor.* FROM  dbo.dogovor";    

Выборка = Результат.Execute(); // выполняем процедуру


Можно как товсе это выгрузить в ТЗ ?
1 mehfk
 
23.10.17
07:10
2 vJet
 
23.10.17
07:16
Вот мой старинный код, помещает результат запроса в тз
<code>
комманд = Новый COMОбъект("ADODB.Command");
        комманд.ActiveConnection = соединениеСбазой;
        комманд.CommandText = текстЗапроса;
        комманд.CommandType = 1;
        Для Каждого параметр из Параметры Цикл
            ПараметрЗапроса = комманд.CreateParameter(параметр.Ключ,135,1,,параметр.Значение);
            комманд.Parameters.Append(ПараметрЗапроса);    
        КонецЦикла;
        Попытка
            наборЗаписей = комманд.Execute();
        Исключение
            Сообщить(ОписаниеОшибки(),СтатусСообщения.Внимание);
            Сообщить(ИнформацияОбОшибке(),СтатусСообщения.Информация);
            комманд = Неопределено;
            наборЗаписей = Неопределено;
            Возврат Неопределено;
КонецПопытки;
    Пока наборЗаписей.EOF()=0 Цикл
        новаяСтрока = табТоваров.Добавить();
        новаяСтрока.Код = наборЗаписей.Fields("Code").value;
        новаяСтрока.Наименование = наборЗаписей.Fields("Name").value;
        новаяСтрока.Группа = наборЗаписей.Fields("gName").value;
        новаяСтрока.ШтрихКод = наборЗаписей.Fields("Barcode").value;
        новаяСтрока.Цена = наборЗаписей.Fields("price").value;
//        элементНоменклатура = Справочники.Номенклатура.НайтиПоРеквизиту("кодUniverse",новаяСтрока.Код);
        //Если не элементНоменклатура.Пустая() Тогда
        //    новаяСтрока.Номенклатура = элементНоменклатура;
        //    новаяСтрока.ГруппаНоменклатуры = элементНоменклатура.Родитель;
        //    новаяСтрока.ВидНоменклатуры = элементНоменклатура.ОбщепитВидНоменклатуры;
        //    новаяСтрока.НоменклатурнаяГруппа = элементНоменклатура.НоменклатурнаяГруппа;
        //КонецЕсли;
        наборЗаписей.MoveNext();
    КонецЦикла;
    наборЗаписей.Close();</code>
3 vJet
 
23.10.17
07:32
(2) Ой не очистил пример, извиняюсь. Но суть думаю понятна.
4 Fram
 
23.10.17
07:46
(2) это невероятно тормозной способ - перебирать рекордсет построчно.
(0) используй GetRows. получишь массив массивов. вот его уже преобразуй в ТЗ - это быстро, сотни тысяч строк за пару секунд
5 1dvd
 
23.10.17
07:48
(4) эм... а как перекинуть массив массив без перебора? Точнее даже без цикла в цикле?
6 Fram
 
23.10.17
07:51
(5) никак.. перебор массива происходит в разы быстрее чем рекордсета. под "преобразуй" имел ввиду перебирай
7 antihacker
 
23.10.17
12:33
Здесь нет проблем с производительностью. Просто очень много колонок. Лень создавать ТЗ с колонками.
8 Fram
 
23.10.17
17:22
(7) дык автоматизируй. список колонок программно вытаскивается из рекордсета
9 zenik
 
23.10.17
17:27
Функция RS2ТЗ(ADORecordset) Экспорт
    тз = Новый ТаблицаЗначений;
    Если ADORecordset.Fields.Count > 0 Тогда
        Для к = 0 По ADORecordset.Fields.Count - 1 Цикл
            ИмяКолонки = ADORecordset.Fields.Item(к).Name;
            //Сообщить(""+ИмяКолонки+" = "+ADORecordset.Fields.Item(к).Type);
            Если
                ADORecordset.Fields.Item(к).Type = 3
                или ADORecordset.Fields.Item(к).Type = 5
                или ADORecordset.Fields.Item(к).Type = 131
            Тогда
                тз.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Число"));
            Иначе
                тз.Колонки.Добавить(ИмяКолонки);
            КонецЕсли;
        КонецЦикла;
        с = 0;
        Пока ADORecordset.EOF = 0 Цикл
            СтрокаТаблицы = тз.Добавить(); с = с + 1;
            Состояние("Подготовка таблицы значений... "+с);
            Для к = 0 По ADORecordset.Fields.Count - 1 Цикл
                Попытка
                    Значение = ADORecordset.Fields(к).Value;
                Исключение
                    Сообщить(ОписаниеОшибки()+"; Колонка: "+ADORecordset.Fields.Item(к).Name);
                    Значение = "";
                КонецПопытки;
                СтрокаТаблицы[к] = Значение;
            КонецЦикла;
            ADORecordset.MoveNext();
        КонецЦикла;
    КонецЕсли;
    Состояние("");
    Возврат тз;
КонецФункции
10 Fram
 
23.10.17
17:29
(9) ну, вы ему еще попу подотрите..
11 zenik
 
23.10.17
17:40
(10) Это код вымогатель... Через неделю начнет просить денег. Вот тогда я и разбогатею :D
12 antihacker
 
24.10.17
06:16
Странно почему тут не придумали выгрузку в ТЗ. Ну что же. Значит по записям.
13 mehfk
 
24.10.17
06:30
У тебя зрение плохое что-ли? Ты по ссылке в (1) ходил?
14 antihacker
 
24.10.17
07:00
Ходил. Просто я имел ввиду что то, что  встроенное.
15 mehfk
 
24.10.17
07:04
Есть встроенное, называется "Внешние источники данных".
2 + 2 = 3.9999999999999999999999999999999...