8.х ОБМЕН Проблема с чтением ячейки с Датой из EXCEL

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем Hyperboloid, 6 июн 2009.

  1. TopicStarter Overlay
    Hyperboloid
    Offline

    Hyperboloid

    Регистрация:
    6 июн 2009
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Читаю данные из листа EXCEL самописной обработкой. В одном из столбцов содержится дата, которую нужно присвоить создаваемому в 1С документу. Дату из EXCEL удается прочесть только как строку текста, например "06.05.2009", а запихнуть ее в поле даты документа никак не удается. Помогите, пожалуйста. Что-то я притупился с преобразованиями типов...
    Читаю так:
    Код:
    НоваяСтрока.Дата = Эксель.Cells(Стр, 3).Value;
    
    Если поле в строке НоваяСтрока.Дата имеет тип "строка", дата читается как "06.05.2009", если НоваяСтрока.Дата имеет тип "дата" - поле остается пустым. В EXCEL соответствующая колонка имеет формат даты.

    P.S.
    За неимением красивого решения, с датой поступил пока так:
    Код:
    Функция вДату(Стр)
    // Преоразование строки вида "ДД.ММ.ГГГГ" в тип Дата
    ДД = Лев(Стр,2);
    ГГ = Прав(Стр,4);
    ММ = Сред(Стр,4,2);
    нДата = ГГ+ММ+ДД;
    нДата = Дата(нДата);
    Возврат нДата;
    КонецФункции // вДату()
    
  2. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Код:
    НоваяСтрока.Дата = Эксель.Cells(Стр, 3).Value;
    
    
    
    Вот так, если у вас в EXCEL "лежит" дата - то и должна считываться дата в 1Су. Если там строка, то считается строка.
    Меня вот интересует. Что у вас за объект такой Эксель
    Покажите как вы его инициализируете.

    Должно быть так.
    1) Инициализируем EXCEL как приложение (COM объект)
    2) Открываем в нем нужную нам книгу.
    3) В нужной нам книге получаем нужный нам лист
    4) Вот в указанной вами функции Эксель - должне быть объектом WorkSheet
    Как то так:
    Код:
    Excel = Новый COMОбъект("Excel.Application");
    Excel.WorkBooks.Open("C:\Temp\1\Мой достопочтенный файл ексель.xls");
    ExcelSheet = Excel.Sheets("Лист 1"); //можно обращаться по номеру листа (нумерация с 1) как ExcelSheet = Excel.Sheets(1);
    НужнаяМнеДата_1    = ExcelSheet.Range("A15").Value;
    НужнаяМнеДата_2    = ExcelSheet.Cells(15, 1).Value;
    НужнаяМнеДата_строкой = ExcelSheet.Cells(15, 1).Text;
    Excel.Quit();
    
    
    
  3. TopicStarter Overlay
    Hyperboloid
    Offline

    Hyperboloid

    Регистрация:
    6 июн 2009
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Примерно так и делаю.
    Код:
    Екс = <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/новый')">Новый  COMОбъект("Excel.Application");</span>
    НашФайл = Екс.Workbooks.Open("Мой достопочтенный файл ексель.xls");
    Эксель = НашФайл.Worksheets(1).UsedRange;
    НужнаяМнеДата = Эксель.Cells(1, 3).Value;
    РТУ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    //Здесь прочие команды заполнения реквизитов документа
    РТУ.Дата = НужнаяМнеДата;
    РТУ.Записать();
    
    
    На команде РТУ.Записать() возникает сообщение об ошибке "Не задана дата документа".
  4. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Код:
    Эксель = НашФайл.Worksheets(1).UsedRange;
    
    - ЗАЧЕМ ЭТО?!
    Достаточно просто
    Код:
    Эксель = НашФайл.Worksheets(1);
    
    А лист 1ый точно то - что вам надо? Учтите, что первый лист - может быть скрытым, а то, что вам надо лежит на 2ом, 3ем или 32ом листе)
    Обратитесь к листу по его имени
    Код:
    Эксель = НашФайл.Worksheets("Лист 1")
    
    А в 1ой строке 3ей колонке точно дата? Ячейка случайно не объединена с другими?

    А в отладчике НужнаяМнеДата какое значение приняла?
  5. TopicStarter Overlay
    Hyperboloid
    Offline

    Hyperboloid

    Регистрация:
    6 июн 2009
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    в 1ой строке 3ей колонке точно дата, ячейка одинокая, лист единственный
    в отладчике
    НужнаяМнеДата, значение - "02.06.2009", тип - "Строка"
    хотя Экзелевском файле формат ячейки - ДАТА.
  6. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    А вы ради интересу, попробуйте в соседней ячейке написать формулку
    Код:
    =ЕТЕКСТ(C1)
    
    (оно же
    Код:
    =ЕТЕКСТ(RC[-1])
    
    )
    Неужто ЛОЖЬ?
  7. TopicStarter Overlay
    Hyperboloid
    Offline

    Hyperboloid

    Регистрация:
    6 июн 2009
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    ЛОЖЬ
  8. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    ХМ. Это какая то фигня...
    Надо смотреть уже на сам файл - у меня пока идеи закончились.
    Можете положить кудынить файлик EXCEL (а хоть бы и на файлы.майл.ру) (предварительно переименовав и перецифровал то - чего сторонние видеть не должны)
    Я бы глянул - а то уже интересно стало.
  9. e.kogan
    Offline

    e.kogan

    Регистрация:
    2 окт 2008
    Сообщения:
    42
    Симпатии:
    0
    Баллы:
    1
    Код:
    Функция ПреобразоватьСтрокуВДату(рИсходнаяСтрокаДаты) Экспорт
    Попытка
    рГод=0; рМесяц=0; рДень=0; рЧас=0; рМинута=0; рСекунда=0;
    Если ПустаяСтрока(рИсходнаяСтрокаДаты) Тогда
    Возврат Дата(1,1,1);
    КонецЕсли;
    //
    спДатаВремя=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(рИсходнаяСтрокаДаты," ");
    // дата должна быть в любом случае
    спДата=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(спДатаВремя[0],".");	
    Если спДата.Количество()=3 Тогда
    Если СтрДлина(спДата[2])=4 Тогда
    рГод=Число(спДата[2]);
    ИначеЕсли СтрДлина(спДата[2])=2 Тогда
    рГод=Число(спДата[2])+?(Число(спДата[2])>50,1900,2000);
    КонецЕсли;
    рМесяц=спДата[1];
    рДень=спДата[0];
    КонецЕсли;
    // смотрим, есть ли время
    Если спДатаВремя.Количество()=2 Тогда
    спВремя=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(спДатаВремя[1],":");
    Если спВремя.Количество()=3 Тогда
    рЧас=спВремя[0];
    рМинута=спВремя[1];
    рСекунда=спВремя[2];
    КонецЕсли;
    КонецЕсли;
    //
    // формируем
    //сообщить("Год="+ргод+", месяц="+рмесяц+", день="+рдень+", час="+рчас+", минута="+рминута+", секунда "+рсекунда);
    рДата=Дата(рГод,рМесяц,рДень,рЧас,рМинута,рСекунда);
    Возврат рДата;
    //
    Исключение
    //Сообщить("Ошибка в функции ""СтрокуВДату"" для ["+рИсходнаяСтрокаДаты+"]: "+ОписаниеОшибки(),СтатусСообщения.Важное);
    Возврат Дата(1,1,1);
    //
    КонецПопытки;
    КонецФункции
    
    Иначе никак. Из Excel дата действительно читается строкой.
  10. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Да ладно!!!

    Создал эксель. В первой ячейке с типом Дата записал значение. Прочитал. Дата.
    У меня другой вопрос. Как автор получил этот файл экселя? Уж не сохранением ли из 1С через Сохранить Копию как...??
    Если так, то дата выгружается туда строкой, и изменение формата поля уже непосредственно в экселе ни к чему не приведет.
    Тип значения останется строкой. Для того, чтобы после этого преобразования дата стала датой ))) надо ее ручками перебивать.

    Ну, а чтобы получить при выгрузке из 1С дату с типом Дата в экселе, надо писать выгрузку ручками с выравниванием значений с типом дата по левому краю в ячейке.

    Вложения:

Поделиться этой страницей