8.х Чтение файлов Excel через регламентное задание

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем v0233, 13 окт 2011.

  1. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    Добрый день.
    Помогите мне решить вот такую задачу.
    Если интерактивно в 1с нажать на кнопочку прочитать файл - то все работает.
    А если создать Регламентное Задание, то у меня выдается ошибка.

    Фоновое задание. Ошибка выполнения
    {ОбщийМодуль.ЧтениеФайлаExcel(221)}: Значение не является значением объектного типа (Application)


    Вот начала кода
    Код:
    Попытка
    XLSОбъектОсновной = Новый COMОбъект("Excel.Application");
    Исключение
    Сообщить ("Невозможно загрузить MS EXCEL !!!");
    Возврат;
    КонецПопытки;
    
    Возможно ли это реализовать, чтобы автоматически запускалась задание без участия пользователя и читало файл excel?
    Спасибо за ответы.
  2. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    клиент-серверный вариант? на сервере установлен excel?
  3. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
  4. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    нет. проблема не в этом. А то что сервер не понимает Application
  5. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Извеняюсь до конца не дочитал вопроса, но и в этом тоже была бы проблема.
  6. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Сервер умеет работать с ком объектами, значит не установлен эксель или его версия старовата
  7. uza
    Offline

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Даже если натянуть на сервер EXCEL, что в корне блин неправильно (не серверное это дело, эксели держать).
    То все равно может быть проблема. И зараза не одна:
    1) в открытом/открывающемся экселе могут появляться диалоговые окна - кто на стороне сервера с ними бороться будет? И установка свойства DisplayAlerts в ложь не всегда спасает (EXCEL исходно заточен под интерактивную работу)
    2) Файл может быть уже открыт (и не расшарен)
    3) Если не закрывать за собой книгу (ексель) - то их в памяти наплодиться туева хуча. А память она не резиновая.
    4) Время. Регламентное задание должно выполняться быстрее. А чтение екселя - дело не быстрое.

    Может лучше читать эксели через ADO? Нужен сервер виндовый с натянутым .NET Framework 2.0 или выше

    Вот кусок кода (не мой, автор мне не известен):
    Код:
    // Функция получает данные из файла Excel
    //
    // Параметры:
    //   пФайл - Имя файла
    //   пЛист - Имя листа с данными
    //   СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
    //                      если не задано, созадуться колонки вида "К1", "К2"
    //
    // Возвращаемое значение:
    //   ТаблицаЗначений
    //
    Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт
    
    #Если Клиент Тогда
    Состояние("Установка соединения с Excel");
    #КонецЕсли
    
    //ЗаголовкиВСтроке1 = "HDR=YES;"
    ЗаголовкиВСтроке1 = "HDR=NO;";
    
    СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +";Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;""";
    
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.ConnectionString =  СтрокаСоединения;
    
    Попытка
    Connection.Open();
    Исключение
    Сообщить ("Проблемы с подключением к Excel" );
    Возврат Неопределено;
    КонецПопытки;
    
    RS = Новый COMОбъект("ADODB.Recordset");
    
    ТекстЗапроса =
    "SELECT
    |    Лист.*
    |FROM
    |    [" + пЛист + "] as Лист";
    
    Попытка
    RS.Open(ТекстЗапроса, Connection);
    Исключение
    Сообщить ("Проблемы с выполнением запроса");
    Возврат Неопределено;
    КонецПопытки;
    
    Таблица = Новый ТаблицаЗначений;
    
    Если СтруктураКолонок = Неопределено Тогда
    
    Для Счетчик = 1 По RS.Fields.Count Цикл
    Поле = RS.Fields.Item(Счетчик - 1);
    Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
    КонецЦикла;
    
    Иначе
    
    Для каждого КлючИЗначение Из СтруктураКолонок Цикл
    Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
    КонецЦикла;
    
    КонецЕсли;
    
    НомерСтроки = 0;
    КолвоСтрок  = RS.RecordCount;
    
    Пока RS.EOF() = 0 Цикл
    
    НомерСтроки = НомерСтроки + 1;
    
    #Если Клиент Тогда
    Состояние("Сбор данных о согласованиях договоров. Чтение файла " + пФайл+" / " + пЛист + " : " 
    + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
    ОбработкаПрерыванияПользователя();
    #КонецЕсли
    
    Если НомерСтроки < НачСтрока Тогда
    RS.MoveNext();
    Продолжить;
    КонецЕсли;
    
    Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
    Прервать;
    КонецЕсли;
    
    НоваяСтрока = Таблица.Добавить();
    
    Если СтруктураКолонок = Неопределено Тогда
    
    Для Счетчик = 1 По RS.Fields.Count Цикл
    
    Поле = RS.Fields.Item(Счетчик - 1);
    НоваяСтрока["К" + Счетчик] = Поле.Value;
    
    КонецЦикла;
    
    Иначе
    
    Для каждого КлючИЗначение Из СтруктураКолонок Цикл
    
    Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
    НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
    
    КонецЦикла;
    
    КонецЕсли;
    
    // Обработка других полей
    RS.MoveNext();
    
    КонецЦикла;
    
    // Завершение работы
    
    RS.Close();
    Connection.Close();
    
    Возврат Таблица;
    
    КонецФункции // Excel_ПолучитьДанные_ADO()
    
    
  8. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    Что то у меня не работает этот код.
    Не на серверной винде, не в семерке.
    NET Framework 3,5
    Есть у кого нибудь обработка готовая, проверенная?
  9. uza
    Offline

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    А попробуй терминалом на сервер зайти и попробовать выполнить обработку "ручками" - посмотри где затыка происходит.
    Имена листов символов типа / не содержат? Лист точно есть в ексель? Ну и т.п.
    Ну и текст ошибки (ОписаниеОшибки()) для анализа нужен.

    Ну и наверное глупо, но все же. А с сервера доступ к читаемому файлу то есть? А то может серверу просто прав не хватает до файла достучаться,
    лежащего на шаре.
  10. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    Так я сначала так и делал, только руками и нажимал :)

    на этом тормозит
    Код:
    Попытка
    Connection.Open();
    Исключение
    Сообщить ("Проблемы с подключением к Excel" );
    Возврат Неопределено;
    КонецПопытки;
    
    
    Выдает Проблемы с подключением к Excel
  11. uza
    Offline

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Добавь после Сообщить... еще
    Сообщить(ОписаниеОшибки());

    Руками проверь доступность файла. Вообще видишь его с сервера?

    Слово Лист в запросе к EXCEL можно еще поробовать заменить на Sheet
  12. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    Проблема вот оказалось в чем.
    Оказалось что у меня эти файлы excel хрен знает в каком формате.
    Вроде файл xls, но при открытии выдает вот такое предупреждение. Посмотреть вложение 8802 После нажатия на "ДА", он открывается.
    Через Excel.Application с этим проблем не было. А вот ADODB не хочет читать этот файл.
    Эти файлы приходят на почту. Это детализация звонков. и заставить их присылать в другом формате не предоставляется возможным. Пере сохранять эти файлы в ручную тоже не вариант. смысл пропадает.

    Вложения:

    • хрень.gif
      хрень.gif
      Размер файла:
      42,2 КБ
      Просмотров:
      87
  13. uza
    Offline

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Ну, семенсеменыч. Говорите проблем небыло? Это может потому что преде открытием через OLE вы его уже открвали и пересохраняли.
    А представьте, если бы таких интерактивных сообщений по 10 в день на вашем сервере открывалось? Да дня за три-четыре бы вся память
    сервера улетучилась бы.

    Вам ведь наверное не нужно эту детализацию грузить каждые 20 минут?
    Рассмотрите такой вариант действий:
    Если ошибка регулярная (не в одном файле) - то пишите обработку/программу, которая будет предварительно обрабатывать
    эти файлы.
    Обработка пусть выполняется интерактивно (например по шедулеру винды запускается 1С с соотв.ключами) и лечит эту, и подобные ошибки....
    да пусть сразу тогда и закачивает в БД.
    По результатам работы пусть шлет вам емыл - рапорт "все ништяк" или "блин, возникла ошибка, нужно вмешательство".
  14. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    Придется наверное так и сделать.
    Детализация ежедневная. :angry:
  15. uza
    Offline

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    У меня для этого специальный юзвер в 1Се заведен, справочник "регалментные задания", где я пишу ссылку на внешнюю обработку и расписание запуска, в модуле приложения прописаны действия "если юзер=робот то ПроверитьРасписаниеЗаданий();"
    И шедулер дважды в день стартует 1Ску под этим юзером на сервере.
    Удобно то, что не нужно заворачиваться при написании кода о том, что это на сервере и куча объектов и методов недоступна.
    Одна обработка для работы на сервере (в режиме предприятия), которую я спокойно могу отлаживать, менять по ходу без обновления конфы и т.п.
  16. TopicStarter Overlay
    v0233
    Offline

    v0233 Опытный в 1С

    Регистрация:
    23 авг 2010
    Сообщения:
    167
    Симпатии:
    0
    Баллы:
    26
    Нет. Через Application У меня сейчас все работает. И все читает. Даже такой странный формат. Но только интерактивно.

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