Имя: Пароль:
1C
1С v8
Преобразование к типу "Дата" при загрузке из Excel через ADO
,
0 ac13
 
27.12.18
08:59
Колонка с датой конечно отображается в виде даты, но совсем не той.

ПодключениеADODB = "MicrosoftJetOLEDB40";
ФайлEXCEL = ИмяФайла;

СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";

ADODBConnection = Новый COMОбъект("ADODB.Connection");
ADODBConnection.ConnectionString = СonnectionString;
ADODBConnection.Open();
ADODBConnection.CursorLocation = 3;

Catalog = Новый COMОбъект("ADOX.Catalog");
Catalog.ActiveConnection = СonnectionString;

КолЛистов = Catalog.Tables.Count;
ИмяЛиста = СокрЛП(Catalog.Tables(0).Name);
ИмяЛиста = Лев(ИмяЛиста, СтрДлина(ИмяЛиста)-1);

ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";

ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);

КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;
КолвоКолонокExcel = ADODBRecordset.Fields.Count;

ТаблицаРезультат = Новый ТаблицаЗначений;
Для ит = 1 ПО КолвоКолонокExcel Цикл
    Поле = ADODBRecordset.Fields.Item(ит - 1);
    ИмяКолонки = "К_" + ит;
    Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", ".")));
КонецЦикла;

НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.НомерСтроки = 1;
Для ит = 1 ПО КолвоКолонокExcel Цикл
    ИмяКолонки = "К_" + ит;
    Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
    НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
КонецЦикла;

НомерСтроки = 1;
Пока ADODBRecordset.EOF() = 0 Цикл
    НомерСтроки = НомерСтроки + 1;
    Если НомерСтроки < НачСтрока Тогда
        ADODBRecordset.MoveNext();
        Продолжить;
    КонецЕсли;
    Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
        Прервать;
    КонецЕсли;
    
    НоваяСтрока = ТаблицаРезультат.Добавить();
    НоваяСтрока.НомерСтроки = НомерСтроки;
        
    Для ит = 1 ПО КолвоКолонокExcel Цикл
        Поле = ADODBRecordset.Fields.Item(ит - 1);
        Если Поле.ActualSize = 0 Тогда
            Продолжить;
        КонецЕсли;
        ЗначениеЯчейки = Строка(Поле.Value);        
        ИмяКолонки = "К_" + ит;
        НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
        ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
        ДлинаСтроки   = СтрДлина(СокрЛП(ЗначениеЯчейки));
        ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
    КонецЦикла;
    ADODBRecordset.MoveNext();
КонецЦикла;
1 asady
 
27.12.18
09:25
(0) попробуй вместо
ЗначениеЯчейки = Строка(Поле.Value);  
поюзать
ЗначениеЯчейки = Строка(Поле.Value2);
2 ac13
 
10.01.19
15:48
(1) не помогает, у меня в колонке с датой есть и другие (текстовые) значения
3 ac13
 
10.01.19
16:07
В файле экселя дата вот в таком виде 41990,5960416667
По факту это дата 18.12.2018
Загружаю в 1С, там 17.12.2014
4 Сияющий в темноте
 
10.01.19
16:09
на vbscript это vbDouble, переводится в дату просто CDate
а в 1с дата линуксовая,так что или самому считать в днях от начала даты и умножить на 86400.
5 ac13
 
10.01.19
16:16
(4) не понял от начала какой даты нужно считать?
6 ac13
 
10.01.19
16:32
то, что предлагается тут Вычленение даты из строки - как лучше? так же переводит дату вместо 18.12.2018 вот это 17.12.2014
7 Сияющий в темноте
 
10.01.19
21:09
С какой точно не помню,но сразу вычисляется как CStr(CDate(1)) в том же VbScript
и понятно,что CDate(0) ничего не покажет
8 breezee
 
11.01.19
06:03
(3) Если так на всех датах - просто добавьте день))
9 spectre1978
 
11.01.19
06:34
(3) вообще наличие дробной части, если я верно помню, предполагает что у этой даты есть ещё и время. Оно нужно?
10 spectre1978
 
11.01.19
06:53
Начало времен обычно 31.12.1899. с учётом того что 41990 это около 115 лет (неточно, потому что я не учел високосные года), то 2014 год кажется верной цифрой. Покорежиться этот дабл нигде не мог?
11 Sserj
 
11.01.19
07:18
А помоему можно просто
ЗначениеЯчейки = Поле.Text
12 НЕА123
 
11.01.19
08:34
13 NorthWind
 
11.01.19
08:35
(12) А что характерно, разница между 1899 и 1904 как раз и есть оно самое! Спасибо, пригодится для общего развития. Не знал...
14 NorthWind
 
11.01.19
08:44
C++Builder:
    double Src = 41990.5960416667 + 1462; // Константа из (12)
    Label1->Caption = TDateTime (Src).DateTimeString ();
Результат:
18.12.2018 14:18:18
15 NorthWind
 
11.01.19
08:49
(3) добавь 1462 дня. Правильным подходом будет сделать в обработке настройку "использовать даты Excel для Mac" и при взведенном крыжике добавлять 1462. Иначе не добавлять.
16 ac13
 
11.01.19
14:45
Спасибо большое, очень помогли