Имя: Пароль:
1C
 
Проблема с сохранением даты в Excel
0 Ezhov
 
07.07.08
11:16
Обнаружилась фича - при сохранении в Excel сформированного отчета поля типа "дата" получают формат "Общий".В макете отчета для ячейки явно указан тип "дата", формат (без времени) и даже правое выравнивание, характерное для даты Excel.
В самом Excele преобразовать полученные значения к "дате" не удалось.
Региональные настройки дергал - не помогло.
1 ТелепатБот
 
гуру
07.07.08
11:16
2 Ezhov
 
07.07.08
11:26
Где вы, гуру!
Неужто никто не встречал этих граблей :(
3 Ezhov
 
07.07.08
12:08
ап
4 Sadovnikov
 
07.07.08
12:16
В семерке помогало такое:
1. Расположение - по левому краю.
2. В ячейку пишется
Значение = "" + ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, Показатель) + РазделительСтрок;
5 wPa
 
07.07.08
12:23
Тебе в экселе нужен именно тип дата? можешь обосновать почему не подходит текстовое представление?
6 Ezhov
 
07.07.08
12:32
Конфы "Конвертация" у меня нет. Поэтому в конфигурации-доноре формирую отчет по некоему справочнику, имеющему реквизит - дату. Сохраняю его в Экселе. С помощью обработки Александра Окунева (респект ему) заливаю из Экселя в справочник в конфигурации-приемнике. Все пашет на ура, проблема только в том, что в реквизит "дата" я пихаю нечто "общее", а это не прокатывает.
7 wPa
 
07.07.08
12:42
а если формат ячейки в выгрузке Selection.NumberFormat = "m/d/yyyy" то прокатывает? имхо не сможет без времени. я загружаю так из экселя:
ДатаРождения = Дата(СокрЛП(СЗ[10].Значение)+" 00:00:00");
8 Ezhov
 
07.07.08
12:55
Обработка универсальная, поэтому используется конструкция вида
Лист.Cells(Строка,Поле.Значение).value.
Если только отслеживать имя поля и добавлять время только для него ?
9 wPa
 
07.07.08
13:01
Проблема не в экселе, а в загрузке - Дата(Лист.Cells(Строка,Поле.Значение).value) даст ошибку в любом случае без времени.
Я не видел обработку, но по идее где-то должна быть разборка по типам полей.
По имени поля - испортишь хорошую вещь )
Если нет разборки - добавь
Проверь на тип ячейки экселя.
если Лист.Cells(Строка,Поле.Значение).NumberFormat = "m/d/yyyy"  (ну или какой там у тебя формат) тогда
Дата(СокрЛП(Лист.Cells(Строка,Поле.Значение).value)+" 00:00:00")
если Лист.Cells(Строка,Поле.Значение).NumberFormat = "@" тогда
СокрЛП(Лист.Cells(Строка,Поле.Значение).value)
и т.д.
10 Вадяс
 
07.07.08
13:10
Не парься с Exelem. Сохраняй в mxl!
11 Ezhov
 
07.07.08
13:12
В обработке так - в первой строке идут имена полей, начиная со 2-й строки - значения. Сначала анализируются имена, затем идет собственно добавка :

           Для Колонка = 1 По 256 Цикл
       ИмяПоля = Лист.Cells(1,Колонка).Value;
       Если ИмяПоля <> "" Тогда
                     .....  
                     Если ЕстьРеквизит(ИмяСправочника,СтрВыбор(1,ИмяПоля))Тогда
                ПоляExcel.Вставить(ИмяПоля,Колонка);
             КонецЕсли;
       Иначе  
             Прервать;    
       КонецЕсли;
               
            КонецЦикла;
             
       ДобавитьНовыеЭлементыВТаблицу(ИмяСправочника);

...а внутри этой процедуры :
   Для Строка = 2 По ПоследняяСтрока Цикл
         
         ОкноИсполнения.Индикатор =  цел(Строка/ПоследняяСтрока*100);
         ОбработкаПрерыванияПользователя();
         НовыйЭлемент = Таблица.Добавить();
         Для Каждого Поле Из ПоляExcel Цикл
            Попытка
              НовыйЭлемент[Поле.Ключ] = Лист.Cells(Строка,Поле.Значение).value;
            ....
12 Ezhov
 
07.07.08
13:22
(10) А подробнее ?
Сама обработка хороша, позволяет заливать многоуровневые справочники, иметь помимо реквизитов простых типов реквизиты типа "справочник" и "перечисление".
Только вот эту фичу осталось победить.
13 Ezhov
 
07.07.08
13:38
Заработало!

Если Лист.Cells(Строка,Поле.Значение).NumberFormat="ДД.ММ.ГГГГ" Тогда
 НовыйЭлемент[Поле.Ключ] = Дата(СокрЛП(Лист.Cells(Строка,Поле.Значение).value)+" 00:00:00")
 Иначе
    НовыйЭлемент[Поле.Ключ] = Лист.Cells(Строка,Поле.Значение).value;
КонецЕсли;    

wPa, чем объяснить фичу с добавкой времени?
14 wPa
 
07.07.08
13:54
Может сделал бы разборку на формат ячейки экселя?
типо в попытку
ФорматЯчейки = Лист.Cells(Строка,Поле.Значение).NumberFormat;
Если ФорматЯчейки = "@" Тогда //текст
  ЗначениеЯчейки = Лист.Cells(Строка,Поле.Значение).value;
ИначеЕсли ФорматЯчейки = "m/d/yyyy" Тогда //дата
  ЗначениеЯчейки = Дата(Строка(Лист.Cells(Строка,Поле.Значение).value)+" 00:00:00")
ну и т.д.
15 wPa
 
07.07.08
13:57
(13) ф-ция Дата("01.01.2001") выдаст ошибку преобразования типов строка-дата, потому как строковое представление даты имеет формат дата +" "+время.
Но в таком виже преобразование сработает - Дата("01.01.2001"+" "+"00:00:00")