Имя: Пароль:
1C
1С v8
Формат даты при связке рекордсет - эксель - 1С
,
0 nikolas260579
 
30.05.17
11:14
Здравствуйте. Наверное, стандартный вопрос, но пока не могу найти ответ. Через АДО читаю экселевский файл. При этом возникает косяк с датами. Т.е. в ячейке стоит дата и время, например 23.05.2017 8:52
, формат - все форматы. А при чтении этой колонки с датами через 1с-ку я получаю значение "42878.369444". Т.е. текстовый формат. Почему так?  В локальных настройках надо что-то изменить? Или в коде указать формат даты? Заранее спасибо.


Connection = Новый COMОбъект("ADODB.Connection");
        Recordset  = Новый COMОбъект("ADODB.Recordset");
        ВПервойСтрокеДанные = Истина;
        
        Connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Файл + ";Extended Properties=""Excel 12.0;" + ?(ВПервойСтрокеДанные, "HDR=NO;", "HDR=YES;") + "IMEX=1;""";
        Connection.Open();
        Recordset = Connection.OpenSchema(20);
        Если Не Recordset.EOF Тогда
            ////проверим имена листов
            //Для Каждого Поле Из Recordset.Fields()Цикл
            //    
            //КонецЦикла;
            
            ИмяЛиста = Recordset.Fields("TABLE_NAME").Value;    
        Иначе
            ТекстСообщения = ТекстСообщения + Символы.ПС + "- Лист с данными не обнаружен";
            Отказ = Истина;
            Возврат Ложь;
        КонецЕсли;    
        Recordset.Close();    
    Исключение
        Инфо = ИнформацияОбОшибке();
        ТекстСообщения = ТекстСообщения + Символы.ПС + "- Ошибка: Описание='" + Инфо.Описание + ?(Инфо.Причина = Неопределено, "", ", " + Инфо.Причина.Описание) + "', Модуль='" + Инфо.ИмяМодуля + "', Строка='" + Инфо.НомерСтроки + ":" + Инфо.ИсходнаяСтрока + "'";
        Отказ = Истина;
        Возврат Ложь;
    КонецПопытки;


ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "]";
        Recordset.Open(ТекстЗапроса, Connection);
1 h-sp
 
30.05.17
12:13
к чему этот кусок программы? Где тут даты?
2 nikolas260579
 
30.05.17
13:42
(1) вот здесь я текст получаю, а не дату

Пока Recordset.EOF() = Ложь Цикл
    Значение_ДатаВремя          =  СокрЛП(Recordset.Fields.Item(0).Value);
3 dezss
 
30.05.17
13:44
а если
    Значение_ДатаВремя          =  Дата(Recordset.Fields.Item(0).Value);
что получишь?
или можно даже так попробовать
    Значение_ДатаВремя          =  Дата(СокрЛП(Recordset.Fields.Item(0).Value));
4 dezss
 
30.05.17
13:45
просто не забывай, что СокрЛП всегда вернет строку, он не работает с датами.
5 nikolas260579
 
30.05.17
13:47
(3) Вылетает ошибка: "Преобразование к типу дата не может быть выполнено".
6 nikolas260579
 
30.05.17
13:49
Recordset.Fields.Item(0).DataFormat = Неопределено. Может, тут что кроется?
7 dezss
 
30.05.17
13:54
(5) значит он не считает это датой.
а если указать тип не общий, а дата, прокатывает?
8 nikolas260579
 
30.05.17
13:57
а в экселе между значением даты в текстовом формате и разностью дат от 01.01.1900 есть разница? Просто я посчитал разность дат между началами дней 23.05.2017  и 01.01.1900, у меня получилось 42876. Если это дата с плавающей точкой, то вроде без часов, минут, секунд должно быть 42878?

(5) у меня не прошло пока
9 Rokford
 
30.05.17
14:35
(3),(5)
Просто для преобразования в дату строка должна быть не "23.05.2017", а "2017.05.23" (в СП прописано).

Как вариант (без учета часов и минут)
массивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СокрЛП(Recordset.Fields.Item(0).Value), ".");
Значение_ДатаВремя          =  Дата(массивДата[2], массивДата[1], массивДата[0])
10 nikolas260579
 
30.05.17
14:41
(9)массивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СокрЛП(Recordset.Fields.Item(0).Value), ".");
по причине:
Произошла исключительная ситуация (ADODB.Field): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
11 nikolas260579
 
30.05.17
14:44
Вопрос: почему, если я в экселе в функцию ДАТАЗНАЧ вставляю свою дату 23.05.2017 8:52, то получаю "42878.369444". Если я делаю РАЗНОСТЬДАТ() в запросе 1С, то получаю 42876?
12 nikolas260579
 
30.05.17
14:44
где копать?
13 Операция 1Ы
 
30.05.17
15:09
потому что

РАЗНОСТЬДАТ

имеет числовой результат с 10 цифрами в целой части. Дробная часть отсутствует.
14 nikolas260579
 
30.05.17
15:20
РазницаВСекундах = ДатаКон - ДатаНач;
   РазницаВДнях = РазницаВСекундах/86400;

ДатаКон = 23.05.2017 8:52, датанач = 01.01.1900 00:00:00.
Получилось 42876.36944. Пока не понял, где я 2 дня потерял.
15 SSSSS_AAAAA
 
30.05.17
16:20
(14) Опорной датой в некоторых случаях служит 30-12-1899
16 nikolas260579
 
30.05.17
16:33
(14)Спасибо, в экселе дате 01.01.1900, как оказалось, уже по умолчанию присвоено значение 1, и конечной дате - тоже 1. Вот два дня и взялись.
17 nikolas260579
 
30.05.17
16:33
(15), а не (14)
Ошибка? Это не ошибка, это системная функция.