Конвертер Даты из числового формата Excel

Столкнувшись с проблемой загрузки в 1С из Excel Даты-Времени в числовом формате к удивлению не нашел нигде подобных формул. Может потому что они уж слишком банальны, а может потому что они "тайное знание посвященных". В общем, эта обработка пример конвертации Excel <=> 1C

Сам формат даты изучался эмпирически. То есть менял число и изучал что станет с датой-временем. Оказалась все банально до ужаса:

Число Excel = Количество дней от 1 января 1900 г.

Число 1С = Количество секунд от … той же даты.

Дата 1С = )))

Соответственно формулы перевода выглядят следующим образом:

Процедура ЧислоExelПриИзменении(Элемент)
// От Excel числа
ЭлементыФормы.Дата1С.Значение = '190001010000'+(ЭлементыФормы.ЧислоExcel.Значение*86400);
ЭлементыФормы.Число1C.Значение = Цел(ЭлементыФормы.ЧислоExcel.Значение*86400);
КонецПроцедуры

Процедура Дата1СПриИзменении(Элемент)
// От Даты 1С
ЭлементыФормы.Число1C.Значение = ЭлементыФормы.Дата1С.Значение-'19000101000000';
ЭлементыФормы.ЧислоExcel.Значение = (ЭлементыФормы.Дата1С.Значение-'19000101000000')/86400;
КонецПроцедуры

Процедура Число1CПриИзменении(Элемент)
// От Числа 1С
ЭлементыФормы.Дата1С.Значение = '190001010000'+ЭлементыФормы.Число1C.Значение;
ЭлементыФормы.ЧислоExcel.Значение = ЭлементыФормы.Число1C.Значение/86400;
КонецПроцедуры

Юзайте 🙂

В приложенном файле — этот же код, обредший интерфейс и ничего более.

P.S. Может эта информация и излишне примитивна и банальна для данного ресурса, но может и сохранить кому-то время потраченное на безрезультатное гугление и яндексирование…

4 Comments

  1. vld_trade

    Ничего другого на ресурсе не нашел (особо не искал).

    Но решил вставить свои 5 коп. в эту тему в «назидание потомкам»:

    В Excel дата 01/01/1900 соответствует числу «1». Это «первый день».

    Если мы сделаем в 1С «‘19000101000000’ — ‘190001010000’», то получим «0». Уже не соответствует заявленному коду, т.е. надо сразу учитывать арифметическую прогрессию и писать «+1» имея ввиду одни сутки в размере 86 400 секунд.

    Для проверки напишите в 1С такой код:

    Цел((ТекущаяДата() — ‘19000101000000’)/86400)

    ПолучИте результат. Вставьте его в Excel и преобразуйте формат в «Дата».

    Далее учитываем, что 86400 секунд в целых сутках. Это значит, что если к

    НачалоДня(ТекущаяДата())

    прибавить 86400, то мы получим начало следующего дня.

    Плюс ко всему надо учитывать известный баг про эпохи, когда «Excel ошибочно считает 1900 год високосным»:

    Проверьте в запросе:

    ВЫБРАТЬ

    ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1900,2,28), ДЕНЬ, 1)



    У меня в результате получается «01/03/1900» (8.2, 8.3).

    В Excel та же операция показывает «29/02/1900».

    Поэтому для записи в Excel даты в виде числа надо писать:

    Цел((ТекущаяДата() — ‘19000101000000’)/86400) + 2

    Замечу, что обратное преобразование (из числа Excel в дату 1С) тоже надо производить с учетом этого поправочного коэффициента.

    Reply
  2. vova196

    (1) vld_trade,

    Данные формулы соответствуют текущим рабочим задачам, т.е. вполне конкретной необходимости загрузить справочники и остатки. Где датой чаще всего выступает момент производства / покупки либо срок годности. Так что при всем уважении к полному раскрытию всех тонкостей конвертации даты, мой вариант считаю вполне работоспособным для решения именно практических задач. Так как предположить наличие клиента с продукцией выпущенной век назад — даже для моей богатой фантазии затруднительно.

    Но в любом случае спасибо за интерес и «научный» подход к данному вопросу.

    Reply
  3. Mortiferus

    Тоже понадобилось сделать такую штуку, пользователи надавили. Внесу свою копеечку — надо прибавлять 2, чтобы правильно посчиталось. Типа такого:

    Выбор Когда ДатаОплаты = ДатаВремя(1,1,1) Тогда 0 Иначе РазностьДат(ДатаВремя(1900, 1, 1), ДатаОплаты, «ДЕНЬ») Конец + 2

    ЗЫ. Проверял на Excel 2007.

    За подсказку и идею спасибо!

    Reply
  4. RainyAugust22

    Обработка ошибается на 2 дня: указываю ей — 35 382 конвектит в 15.11.1996 0:00:00, а в Excel’е это 13.11.1996

    Решил делать:

    ВЫБРАТЬ

    ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1899, 12, 30, 0, 0, 0), ДЕНЬ, 35382) КАК Поле1

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *