Преобразование Даты из ячейки Excel общего формата при чтении файла 1С

1. Andryza 38 17.10.19 11:32 Сейчас в теме
Всем привет. Хочу поделиться информацией, может, конечно, кто-то с этим уже разбирался, и знает другое решение проблемы, поделитесь. В общем в чем суть. Столкнулся с задачей чтения файла Excel в 1С, файл - Отчет по договору эквайринга от сбербанка. Поставляемый в Ексель файле, пример на скрине. Все бы ничего, но столкнулся с такой проблемой, что при парсинге файла, вместо даты 08.10.2019 - я получал значение 42284... И стал думать, что же это за ерунда такая... Выяснил, что формат ячейки ексель документа - видимо, "Общий", если открыть формат ячейки и выбрать и посмотреть по форматам, то как раз вместо даты, увидим это самое число. Стал думать, что это и как это получается так )) В итоге выяснил, что это номер дня, начиная с какого-то периода, стал вычислять дату отсчета... после некоторых терзаний, выяснил, что отсчет начинается с 01.01.1904.

Ну и в итоге для преобразования этого числа в нужную дату, запилил формулу:

Дата = Дата("19040101") + n * 60 * 60 *24, где n - числовое представления дня в ячейки екселя, которое вытаскивается из ячейки при чтении файла, или номер дня от 01.01.1904 года В моем случае дата была 08.10.2019 или 42284 день.

Если есть другие варианты преобразования - поделитесь.

Надеюсь информация будет полезной. )
Прикрепленные файлы:
dehro; kitaevay; +2 Ответить
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Power_0N 43 02.09.20 23:42 Сейчас в теме
same shit, bro
но я никак не могу вычислить дату от которой считается число.
там же високосные дни, так что я не уверен в том, что это 1904 год.
Скорее там отсчёт от 30.12.1899
3. kitaevay 37 21.09.21 19:46 Сейчас в теме
Спасибо, 1904 - то что надо, вот такую функцию себе написал по случаю:
Функция ПолучитьДатуИзЗначенияExcel(ДатаExcel, ЧастьДаты = Неопределено)
	Если ЧастьДаты = Неопределено Тогда
		ЧастьДаты = ЧастиДаты.ДатаВремя;
	КонецЕсли;
	
	ЦелаяЧастьДаты = Цел(ДатаExcel);
	Если ЧастьДаты = ЧастиДаты.Дата Тогда
		Возврат '19040101' + ЦелаяЧастьДаты * 86400;
	ИначеЕсли ЧастьДаты = ЧастиДаты.Время Тогда
		Возврат '00010101' + Окр((ДатаExcel - ЦелаяЧастьДаты) * 86400);
	ИначеЕсли ЧастьДаты = ЧастиДаты.ДатаВремя Тогда
		Возврат '19040101' + ЦелаяЧастьДаты * 86400 + Окр((ДатаExcel - ЦелаяЧастьДаты) * 86400);
	Иначе
		ВызватьИсключение "Неправильно заполнен параметр ЧастьДаты";
	КонецЕсли;
КонецФункции
Показать
4. dehro 5 12.06.22 12:42 Сейчас в теме
Писал загрузку из 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.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)