Имя: Пароль:
1C
1С v8
v8: выгрузка из 1С в Excel с помощью ADO,как указать с какой строки грузить?
0 Shur1cIT
 
25.11.13
11:00
нашел два примера формировании строки, но не пойму где указывать начало строки загрузки? мне дополнять лист необходимо а не с нуля добавлять

Command.CommandText = "INSERT INTO [МояТаблица]
|(Символьный, Дата, Целый, Дробный)
|values ('АБВГДЕЁ', '12/4/1955', '1234567', '12345,6789')";
Command.Execute();
1 Shur1cIT
 
25.11.13
11:24
может быть не INSERT INTO использовать ? а что тогда?
2 Apokalipsec
 
25.11.13
11:25
ну по логике ADD
3 Shur1cIT
 
25.11.13
11:30
не могу примера найти, может это как-то по-другому делают?
4 Apokalipsec
 
25.11.13
11:33
ладно, зайдем с другой стороны, ты это делаешь в цикле и добавляешь единичку к строке в которую это вставляешь?
5 Shur1cIT
 
25.11.13
11:35
да это в цикле ,единицы нет просто добавляться данные
6 Shur1cIT
 
25.11.13
11:37
по оле у меня выгружалось так, сейчас на ADO переделываю

    НомерСтроки = НомерСтрокиДляНачалаЗагрузки;
    Для Каждого Строка ИЗ ТабПлатежей Цикл
        Лист.Cells(НомерСтроки, 1).Value  = Строка.Дата;//Формат(Строка.Дата,"ДЛФ=D");  
        Лист.Cells(НомерСтроки, 2).Value  = СокрЛП(Строка.КодГр);
        Лист.Cells(НомерСтроки, 3).Value  = СокрЛП(Строка.КодСтатьи);
        Лист.Cells(НомерСтроки, 4).Value  = Строка.Дебет;//Число(Формат(Строка.Дебет ,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 5).Value  = Строка.Кредит;//Число(Формат(Строка.Кредит,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 7).Value  = СокрЛП(Строка.Контрагент);
        Лист.Cells(НомерСтроки, 8).Value  = СокрЛП(Строка.НазначениеПлатежа);
        Лист.Cells(НомерСтроки, 10).Value = Строка(Строка.Неделя-Смещение)+"-я неделя";
        Лист.Cells(НомерСтроки, 12).Value = ПолучитьКомпаниюВФорматеДДС(Строка.Компания);
        Лист.Cells(НомерСтроки, 13).Value = СокрЛП(Строка.РуководительЦФО);
        Лист.Cells(НомерСтроки, 14).Value = Строка.ДебетВВалюте;//Число(Формат(Строка.ДебетВВалюте ,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 15).Value = Строка.КредитВВалюте;//Число(Формат(Строка.КредитВВалюте,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 16).Value = Формат(Строка.КурсНаДату   ,"ЧЦ=15; ЧДЦ=2; ЧГ=");
        НомерСтроки = НомерСтроки + 1;
        Сообщить(НомерСтроки);
    КонецЦикла;
7 Apokalipsec
 
25.11.13
11:40
а как сейчас выгружается? код приведи.
8 Shur1cIT
 
25.11.13
11:46
Это раньше так было в связи с тем что очень часто сие глючит и работает медленно решил переделать на ADO, но заткнулся по причине отсутствие в адо возможности указания номера строки вставки

Смещение = 0;
    Смещение = ПолучитьСмещениеНеделиМесяца(ДатаНачала);
    ТабПлатежей = ПолучитьДанныеДляВыгрузки();
    xlCalculationAutomatic = -4105;
    xlCalculationManual    = -4135;
    Попытка
        // Загрузка объекта Microsoft Excel
        Состояние("Выгрузка данных из 1С в Microsoft Excel...");
        ExcelПриложение = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Ошибка при запуске Microsoft Excel."
        + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
        Возврат;
    КонецПопытки;
    Книга = ExcelПриложение.WorkBooks.Open(ФайлДДС);
    ExcelПриложение.Visible = 1;    
    Лист = Книга.WorkSheets(СокрЛП(ИмяЛистаДляВыгрузки));// лист для загрузки    
    ExcelПриложение.Calculation  = xlCalculationManual;
    
    НомерСтроки = НомерСтрокиДляНачалаЗагрузки;
    Для Каждого Строка ИЗ ТабПлатежей Цикл
        Лист.Cells(НомерСтроки, 1).Value  = Строка.Дата;//Формат(Строка.Дата,"ДЛФ=D");  
        Лист.Cells(НомерСтроки, 2).Value  = СокрЛП(Строка.КодГр);
        Лист.Cells(НомерСтроки, 3).Value  = СокрЛП(Строка.КодСтатьи);
        Лист.Cells(НомерСтроки, 4).Value  = Строка.Дебет;//Число(Формат(Строка.Дебет ,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 5).Value  = Строка.Кредит;//Число(Формат(Строка.Кредит,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 7).Value  = СокрЛП(Строка.Контрагент);
        Лист.Cells(НомерСтроки, 8).Value  = СокрЛП(Строка.НазначениеПлатежа);
        Лист.Cells(НомерСтроки, 10).Value = Строка(Строка.Неделя-Смещение)+"-я неделя";
        Лист.Cells(НомерСтроки, 12).Value = ПолучитьКомпаниюВФорматеДДС(Строка.Компания);
        Лист.Cells(НомерСтроки, 13).Value = СокрЛП(Строка.РуководительЦФО);
        Лист.Cells(НомерСтроки, 14).Value = Строка.ДебетВВалюте;//Число(Формат(Строка.ДебетВВалюте ,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 15).Value = Строка.КредитВВалюте;//Число(Формат(Строка.КредитВВалюте,"ЧЦ=15; ЧДЦ=2; ЧГ="));
        Лист.Cells(НомерСтроки, 16).Value = Формат(Строка.КурсНаДату   ,"ЧЦ=15; ЧДЦ=2; ЧГ=");
        НомерСтроки = НомерСтроки + 1;
        Сообщить(НомерСтроки);
    КонецЦикла;
    Сообщить("Конец выгрузки!");    
    ExcelПриложение.Calculation  = xlCalculationAutomatic;
9 Shur1cIT
 
25.11.13
12:06
вопрос при выгрузке по ОЛЕ есть ли возможность подключиться к уже открытому файлу Excell пользователя?
10 acsent
 
25.11.13
12:08
Разве INSERT не добавляет строку снизу???
11 Shur1cIT
 
25.11.13
12:14
(10) добавляет, только не всегда она корректно низ определить сможет, так как строки частично по формулам уже заполнены будут
12 Serginio1
 
25.11.13
12:39
(0)

Процедура СоздатьПараметрыИТекст(СтрКолонки,Стр,Cmd)
    Имя=СтрКолонки.Имя;
    ТипЗначения=СтрКолонки.ТипЗначения;
    Если ТипЗначения.СодержитТип(Тип("Строка")) Тогда
        Стр=Стр+Имя+" NTEXT,";
        Cmd.Parameters.Append(Cmd.CreateParameter(Имя,203,1,255,"1"));

    ИначеЕсли ТипЗначения.СодержитТип(Тип("Число")) Тогда
        КвалификаторыЧисла=Типзначения.КвалификаторыЧисла;
        Разрядность=КвалификаторыЧисла.Разрядность;
        РазрядностьДробнойЧасти=КвалификаторыЧисла.РазрядностьДробнойЧасти;
        Стр=Стр+Имя+" Numeric("+Разрядность+","+РазрядностьДробнойЧасти+"),";
        // Парам=Cmd.CreateParameter(Имя,131,1,Разрядность,);
        Парам=Cmd.CreateParameter(Имя,6,1,Разрядность,);
        Парам.NumericScale = РазрядностьДробнойЧасти;
        Парам.Precision = Разрядность-РазрядностьДробнойЧасти-?(РазрядностьДробнойЧасти=0,0,1);
        
        Cmd.Parameters.Append(Парам);
    ИначеЕсли ТипЗначения.СодержитТип(Тип("Дата")) Тогда    
        Стр=Стр+Имя+" DateTime,";
        Cmd.Parameters.Append(Cmd.CreateParameter(Имя,135,1));
    ИначеЕсли ТипЗначения.СодержитТип(Тип("Булево")) Тогда    
        Стр=Стр+Имя+" BOOLEAN,";
        Cmd.Parameters.Append(Cmd.CreateParameter(Имя,11,1));
        
        
    КонецЕсли;    
    
    
КонецПроцедуры

Процедура СоздатьТаблицуИКоманд(Тз,Соединение,Команд)
    Стр="Create TABLE  Лист1 (";
    
    Колонки=Тз.Колонки;
    Для каждого СтрКолонки из колонки Цикл
        СоздатьПараметрыИТекст(СтрКолонки,Стр,Команд)
    КонецЦикла;    
    
    Стр=Лев(Стр,СтрДлина(Стр)-1)+")";

    Соединение.Execute(Стр);    
КонецПроцедуры
Процедура ЗаписатьТзВЭксель(тз)
    
    // Допустимые типы
    // adDouble = 5 Значение с плавающей точкой двойной точности
    // adDAte = 7 Дата
    // adCurrency = 6 Денежная сумма
    // adBoolean = 11 Булево
    // adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL
    // adLongVarWChar = 203 Длинное строковое значение
    
    
    
    ИмяФайлаЭксель = "D:\Export.xlsx"; // Имя создаваемого файла
    
    Файл=Новый Файл(ИмяФайлаЭксель);
    Если файл.Существует() Тогда
        УдалитьФайлы(ИмяФайлаЭксель);
    КонецЕсли;    
    
    СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+ИмяФайлаЭксель;
    СтрокаПодключения = СтрокаПодключения + ";Mode=Share Deny Write; Extended Properties = "+"""Excel 12.0"+";HDR=Yes;IMEX=1"";";
    ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ИмяФайлаЭксель+";Extended Properties=Excel 12.0 Xml;";
    Connection = Новый COMОбъект("ADODB.Connection");
    
    
    
    // Создаем соединение
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(ActiveConnection);
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;
    
    СоздатьТаблицуИКоманд(Тз,Connection,Command);
    
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(СтрокаПодключения);
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;
    
    Параметры= Command.Parameters;    
    ТекстВопросов=" VALUES(";
    ТекстКоманды= "INSERT INTO [Лист1](";
    Для каждого парам из Параметры Цикл
        ТекстКоманды=ТекстКоманды+парам.Name+",";
        ТекстВопросов=ТекстВопросов+"?,"
    КонецЦикла;    
    ТекстКоманды=Лев(ТекстКоманды,стрДлина(ТекстКоманды)-1)+") "+Лев(ТекстВопросов,стрДлина(ТекстВопросов)-1)+")";
    Сообщить(ТекстКоманды);
    Command.CommandText=ТекстКоманды;
    
    
    Command.prepared=истина;
    
    

    Для каждого Выборка из Тз Цикл
        Для каждого парам из Параметры Цикл
            Значение=Выборка[Парам.Name];
            Если Парам.Type=203 Тогда
                Парам.Size=СтрДлина(Значение)+1;
            КонецЕсли;    
            Парам.Value=Значение;
            
        КонецЦикла;    
        
        
        Command.Execute();
    КонецЦикла;
    //
    // Закрываем соединение
    Command = Неопределено;
    Connection.Close();
    Connection = Неопределено;
    
КонецПроцедуры
13 WildSery
 
25.11.13
12:44
(12) Молодец! А теперь прочитай, что было нужно.
(11) Вставляй не в страницу, а в неименованный диапазон, типа
"INSERT INTO [Sheet1$A10:O10]"
В этом случае вставка будет в первую незанятую строку после 10й, не важно, что за пределами диапазона.
14 Shur1cIT
 
25.11.13
13:11
ок спасибо
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.