Преобразование Даты из ячейки Excel общего формата при чтении файла 1С
Всем привет. Хочу поделиться информацией, может, конечно, кто-то с этим уже разбирался, и знает другое решение проблемы, поделитесь. В общем в чем суть. Столкнулся с задачей чтения файла Excel в 1С, файл - Отчет по договору эквайринга от сбербанка. Поставляемый в Ексель файле, пример на скрине. Все бы ничего, но столкнулся с такой проблемой, что при парсинге файла, вместо даты 08.10.2019 - я получал значение 42284... И стал думать, что же это за ерунда такая... Выяснил, что формат ячейки ексель документа - видимо, "Общий", если открыть формат ячейки и выбрать и посмотреть по форматам, то как раз вместо даты, увидим это самое число. Стал думать, что это и как это получается так )) В итоге выяснил, что это номер дня, начиная с какого-то периода, стал вычислять дату отсчета... после некоторых терзаний, выяснил, что отсчет начинается с 01.01.1904.
Ну и в итоге для преобразования этого числа в нужную дату, запилил формулу:
Дата = Дата("19040101") + n * 60 * 60 *24, где n - числовое представления дня в ячейки екселя, которое вытаскивается из ячейки при чтении файла, или номер дня от 01.01.1904 года В моем случае дата была 08.10.2019 или 42284 день.
Если есть другие варианты преобразования - поделитесь.
Надеюсь информация будет полезной. )
Ну и в итоге для преобразования этого числа в нужную дату, запилил формулу:
Дата = Дата("19040101") + n * 60 * 60 *24, где n - числовое представления дня в ячейки екселя, которое вытаскивается из ячейки при чтении файла, или номер дня от 01.01.1904 года В моем случае дата была 08.10.2019 или 42284 день.
Если есть другие варианты преобразования - поделитесь.
Надеюсь информация будет полезной. )
Прикрепленные файлы:
По теме из базы знаний
- Импорт из EXCEL и других источников (xls, xlsx, xlsb, ods, sxc, dbf, mxl, csv, clipboard, sql) в 1С
- Чтец электронных таблиц (Excel)
- Загрузка из EXCEL в 1С на платформе 8.3.6/8.3.7/8.3.8/8.3.9/8.3.10 (с картинками)
- Универсальная загрузка данных формата Excel
- Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Спасибо, 1904 - то что надо, вот такую функцию себе написал по случаю:
Функция ПолучитьДатуИзЗначенияExcel(ДатаExcel, ЧастьДаты = Неопределено)
Если ЧастьДаты = Неопределено Тогда
ЧастьДаты = ЧастиДаты.ДатаВремя;
КонецЕсли;
ЦелаяЧастьДаты = Цел(ДатаExcel);
Если ЧастьДаты = ЧастиДаты.Дата Тогда
Возврат '19040101' + ЦелаяЧастьДаты * 86400;
ИначеЕсли ЧастьДаты = ЧастиДаты.Время Тогда
Возврат '00010101' + Окр((ДатаExcel - ЦелаяЧастьДаты) * 86400);
ИначеЕсли ЧастьДаты = ЧастиДаты.ДатаВремя Тогда
Возврат '19040101' + ЦелаяЧастьДаты * 86400 + Окр((ДатаExcel - ЦелаяЧастьДаты) * 86400);
Иначе
ВызватьИсключение "Неправильно заполнен параметр ЧастьДаты";
КонецЕсли;
КонецФункции
Показать
Писал загрузку из Excel, обнаружил эту же проблему.
Поискал в справке Excel (по F1)
...
В Microsoft Excel для Macintosh и Microsoft Excel для Windows поддерживаются две системы дат: 1900 и 1904. По умолчанию в Microsoft Office Excel для Windows установлена система дат 1900, а в Microsoft Office Excel для Macintosh — 1904.
...
При пересохранении в другой тип (пробовал в Excel 97-2003) система дат остаётся той же.
При копировании из одной книги в другую проблема остаётся. MicroSoft рекомендует бороться следующим образом:
Устранение проблемы копирования
В пустую ячейку введите число 1462.
Выделите эту ячейку и на вкладке Главная в группе Буфер обмена нажмите кнопку Копировать.
Выделите диапазон ячеек, содержащих неправильные данные.
На вкладке Главная в группе Буфер обмена нажмите кнопку Вставить и выберите команду Специальная вставка.
В диалоговом окне Специальная вставка в разделе Вставить установите переключатель значения, а в группе Операция выполните одно из указанных ниже действий:
* Чтобы получить даты на четыре года и один день позже, установите переключатель сложить.
* Чтобы получить даты на четыре года и один день раньше, установите переключатель вычесть.
При устранении проблемы с внешними ссылками MicroSoft опять рекомендует немного попрограммировать))
...
В случае использования внешней ссылки на дату в другой книге с другой системой дат эту ссылку можно изменить с помощью одного из указанных ниже действий.
Чтобы получить дату на четыре года и один день позже, добавьте к ней 1462. Пример:
=[Книга2]Лист1!$A$1+1462
Чтобы получить дату на четыре года и один день раньше, вычтите из нее 1462. Пример:
=[Книга1]Лист1!$A$1-1462
При распаковке архива xlsx (архиватором zip) по пути "...\xl\workbook.xml" есть строка
"<workbookPr defaultThemeVersion="124226" date1904="1"/> " которая как бы намекает на тип хранения дат.
Т.е. в случае xlsx где искать понятно, если же формат "xls" ещё не установил как действовать.
Пока буду в настройках добавлять галку "Использовать 1904", при наличии которой при чтении ко всем датам будет прибавляться 1462.
Поискал в справке Excel (по F1)
...
В Microsoft Excel для Macintosh и Microsoft Excel для Windows поддерживаются две системы дат: 1900 и 1904. По умолчанию в Microsoft Office Excel для Windows установлена система дат 1900, а в Microsoft Office Excel для Macintosh — 1904.
...
При пересохранении в другой тип (пробовал в Excel 97-2003) система дат остаётся той же.
При копировании из одной книги в другую проблема остаётся. MicroSoft рекомендует бороться следующим образом:
Устранение проблемы копирования
В пустую ячейку введите число 1462.
Выделите эту ячейку и на вкладке Главная в группе Буфер обмена нажмите кнопку Копировать.
Выделите диапазон ячеек, содержащих неправильные данные.
На вкладке Главная в группе Буфер обмена нажмите кнопку Вставить и выберите команду Специальная вставка.
В диалоговом окне Специальная вставка в разделе Вставить установите переключатель значения, а в группе Операция выполните одно из указанных ниже действий:
* Чтобы получить даты на четыре года и один день позже, установите переключатель сложить.
* Чтобы получить даты на четыре года и один день раньше, установите переключатель вычесть.
При устранении проблемы с внешними ссылками MicroSoft опять рекомендует немного попрограммировать))
...
В случае использования внешней ссылки на дату в другой книге с другой системой дат эту ссылку можно изменить с помощью одного из указанных ниже действий.
Чтобы получить дату на четыре года и один день позже, добавьте к ней 1462. Пример:
=[Книга2]Лист1!$A$1+1462
Чтобы получить дату на четыре года и один день раньше, вычтите из нее 1462. Пример:
=[Книга1]Лист1!$A$1-1462
При распаковке архива xlsx (архиватором zip) по пути "...\xl\workbook.xml" есть строка
"<workbookPr defaultThemeVersion="124226" date1904="1"/> " которая как бы намекает на тип хранения дат.
Т.е. в случае xlsx где искать понятно, если же формат "xls" ещё не установил как действовать.
Пока буду в настройках добавлять галку "Использовать 1904", при наличии которой при чтении ко всем датам будет прибавляться 1462.
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)