Имя: Пароль:
1C
1С v8
Загрузка из EXCEL на сервере
0 Avalone2010
 
08.11.12
14:10
Здравствуйте! Подскажите что может быть, ситуация следующая.
Есть сервер, на нем крутится 1С.
Есть база в которую идет загрузка из 1С(КС вариант).
Так вот при передачи фала EXCEL с клиента на сервер происходит сохранение данного файла в определенной папке(в контексте сервера), потом так же в контексте сервера происходит попытка открытия этого файла - но вылетает ошибка :
-------------------------------------------------
{Документ.КонкурсПоУслугам.Форма.ФормаЗагрузкиИзEXCEL.Форма(36)}: Ошибка при вызове метода контекста (Open)
   Книга = Эксель.WorkBooks.Open(ИмяФайла);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу "G:\1C_Temp\Шахматка_08_11_2012_02_06_32.xlsx". Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.
-------------------------------------------------
Код который все это делает ниже:
-------------------------------------------------
//2. Получим файлик для загрузки из временного хранилища
   ИмяФайла = "G:\1C_Temp\Шахматка_"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy_hh_mm_ss")+".xlsx";//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку    
   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
   Файлик.Записать(ИмяФайла);          
   
   //3. Попробуем открыть EXCEL          
   Попытка        Эксель = Новый COMОбъект("Excel.Application");
   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
   КонецПопытки;
-------------------------------------------------
Перед открытием файлика, в режиме отладки, проверял - он существует(ФС.Существует()). Другой программой он не используется так как создается. у пользователя под которым выполняется код на стороне сервера разрешение на чтение/запись файла есть.
Что может быть, куда копать?
1 mikecool
 
08.11.12
14:14
файл не успевает сохраниться?
2 Avalone2010
 
08.11.12
14:16
выложил не весь код.Вот весь:
//2. Получим файлик для загрузки из временного хранилища
   ИмяФайла = "G:\1C_Temp\Шахматка_"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy_hh_mm_ss")+".xlsx";//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку    
   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
   Файлик.Записать(ИмяФайла);          
   
   //3. Попробуем открыть EXCEL          
   Попытка        Эксель = Новый COMОбъект("Excel.Application");
   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
   КонецПопытки;
   
   //4. Откроем файлик и книгу
   Книга = Эксель.WorkBooks.Open(ИмяФайла);
   Лист  = Книга.WorkSheets(НомерЛиста);

(1) если бы.Ставил точку останова на
Книга = Эксель.WorkBooks.Open(ИмяФайла);
находил этот файлик по ИмяФайла, открывал его, закрывал и продолжал откладку.Все равно куй.
3 GLazNik
 
08.11.12
14:17
(0) Почему-то напрашивается конструкция типа Файлик.Закрыть() после записи:)
Файлик что за тип?
Может стоит после записи обнулить эту переменную
4 mikecool
 
08.11.12
14:18
кстате - а нафик передавать через хранилище файл, если достаточно безконтекстный вызов сервера с передачей имени файла?
5 mikecool
 
08.11.12
14:18
+4 а по имени уже открывать
6 FreeHunter
 
08.11.12
14:19
попробуй что бы все это делалось под админскими правами
7 FreeHunter
 
08.11.12
14:21
ах да проверь у тебя данные есть в ИмяФайла
8 Avalone2010
 
08.11.12
14:25
(4) может я чего то не понял, но файл находится на стороне клиента - это один пользователь, сервер крутится на другом компе - это другой пользователь. Т.е. файл при вызове сервера находится вообще на другом компе, в нешаренной папке. Если я что то непонимаю - попраавте.
(3)Файл - xlsx(EXCEL).Закрыть не получится, потому что
Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
Передает двоичные данные. Файлик - это двоичные данные.Название просто у него такое :)
(6) Если бы я мог под админскими правами проверить, организация большая - я в дочке. Пока прав допросишся пол года пройдет. Но на файл, после того как он создался но еще не прочитался(точка останова на Книга = Эксель.WorkBooks.Open(ИмяФайла)) я давал полные права всем.
в имени файла - имя фала. По РДП цепляюсь на сервер, ввожу в строку обозревателя то что там находится - открывается мой файл.
9 Avalone2010
 
08.11.12
14:27
Кстати, еще одна закономерность. Выгрузил базу. Развернул на сервере в файловом варианте  - все работает.
10 GLazNik
 
08.11.12
14:28
(8) я в том плане, что после записи, система считает что этот файл открыт одинэсиной. Попробуй просто прописать Файлик = "" после записи.
11 FreeHunter
 
08.11.12
14:28
т.е. в ИмяФайла название твоего файла и путь, теперь проверь есть ли у тебя права на его чтение
12 GLazNik
 
08.11.12
14:30
(9) тогда не (9). А если файлик на сервер вручную бросить и попробовать открыть через 1С на сервере? открывает?
13 Avalone2010
 
08.11.12
14:31
(11) у меня права есть на него.Я его открываю. У пользователя под которым выполняются серверные процедуры я не знаю есть права или нет. Но с одной стороны он этот файл записывает, значит наверное и читать может. Кроме того перед тем как файл будет прочитан я на него даю полные права(Мой файл-сфойства-безопасность-Группы и пользователи + все(чтение/запись))
14 Avalone2010
 
08.11.12
14:31
(12) - отличная мысл.Чет сам не допер.Ша попробую
15 Ахиллес
 
08.11.12
14:31
G:\1C_Temp\ Это локальный путь на сервере или подключённый сетевой диск на клиенте? Мож перепутал вызовы и на клиенте файл экселя пытаешься открыть?
16 Avalone2010
 
08.11.12
14:35
(15) - локальный путь. Диск G физически висит на сервере
17 Avalone2010
 
08.11.12
14:39
(12) не сработало. Давайте код выложу.Может где накосячил. А то право неловко - такая ерунда а уже часа 3 мозг себе ипу этим.
(15), кстати сейчас что бы избежать этой ошибки запуская 1С предприятие по РДП на сервере. Т.е. и клиент и сервер один и тот же комп, путаници с дисками быть не должно. Кроме того файл проверя в режиме отладки на стороне сервера - он существет(ФС = новый Файл(ИмяИмяФайла); ФС.Существует())
18 Ахиллес
 
08.11.12
14:39
(16) Перепутал вызовы, открываешь эксель на клиенте.
Не хватает каких то прав на сервере.
Версия экселя не подходит.
Наоткрывал кучу КОМ объеков, они все в памяти сидят и не могут решить чей это файл :-) С открытием экселя часто такая фигня. При какой то ошибке 1С эксель остаётся висеть в памяти. Открой диспечер задач на серваке и погляди.
19 Avalone2010
 
08.11.12
14:39
Вызов на стороне клиента:
&НаКлиенте
Процедура Загрузить(Команда)
   
   //1. Поместим наш файлик во временное хранилище
   Перем АдресВовременномХранилище;
   Если Не ЗначениеЗаполнено(Файл) Тогда Возврат; КонецЕсли;
   ПоместитьФайл(АдресВовременномХранилище, Файл, , Ложь);
   
   //2. Произведем чтение и разбор этого файла
   Адрес = ПроизвестиЧтениеГоризонтальнойШахматки(АдресВовременномХранилище);    
   
   //3. Оповестим о том что все сделано
   Если ЭтоАдресВременногоХранилища(Адрес) Тогда
       ОповеститьОВыборе(Новый Структура("ДанныеЗагрузки", Адрес));
   Иначе
       ЭтаФорма.Закрыть();
   КонецЕсли;
КонецПроцедуры
20 Avalone2010
 
08.11.12
14:41
Вызов на стороне сервера:
&НаСервере
Функция ПроизвестиЧтениеГоризонтальнойШахматки(АдресВовременномХранилище)
   
   //1. Сформируем табличку в которую будем загружать
   тзУслуги = Новый ТаблицаЗначений;
   тзУслуги.Колонки.Добавить("Лот"             , Новый ОписаниеТипов("СправочникСсылка.Объекты"));
   тзУслуги.Колонки.Добавить("Услуга"          , Новый ОписаниеТипов("СправочникСсылка.Объекты"));
   тзУслуги.Колонки.Добавить("Марка"           , Новый ОписаниеТипов("Строка"));
   тзУслуги.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"));
   тзУслуги.Колонки.Добавить("Количество"      , Новый ОписаниеТипов("Число"));
   тзУслуги.Колонки.Добавить("ПДЦБезНДС"       , Новый ОписаниеТипов("Число"));
   тзУслуги.Колонки.Добавить("ПДЦ"             , Новый ОписаниеТипов("Число"));
   тзУслуги.Колонки.Добавить("Дорога"          , Новый ОписаниеТипов("СправочникСсылка.Дороги"));
   тзУслуги.Колонки.Добавить("УчастникКонкурса", Новый ОписаниеТипов("СправочникСсылка.Организации"));
   тзУслуги.Колонки.Добавить("ФКП"             , Новый ОписаниеТипов("Число"));
   тзУслуги.Колонки.Добавить("ФКП_БезНДС"      , Новый ОписаниеТипов("Число"));
   
   //2. Получим файлик для загрузки из временного хранилища
   //ИмяФайла = "G:\1C_Temp\Шахматка_"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy_hh_mm_ss")+".xlsx";//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку    
   ИмяФайла = "G:\1С Обработки\Шахматка.xlsx";
   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
   Файлик.Записать(ИмяФайла);
   Файлик = "";
   
   //3. Попробуем открыть EXCEL          
   Попытка        Эксель = Новый COMОбъект("Excel.Application");
   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
   КонецПопытки;
   
   //4. Откроем файлик и книгу
   Книга = Эксель.WorkBooks.Open(ИмяФайла);
   Лист  = Книга.WorkSheets(НомерЛиста);
   
   //5. Получим количество колонок и строк
   ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
   ВсегоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
   
   //Далше всякая ерунда, она не нужна что бы глаз не мозолить
КонецФункции
21 Ахиллес
 
08.11.12
14:43
Ну, как, я и говорил. В исключении не обнуляется Эксель. Этих экселей у тебя на сервере уже с пол сотни открыо. И все жаждут файла Шахматка.xlsx
22 Avalone2010
 
08.11.12
14:45
(21) :/, млять. они под другим пользователем висят. У меня прав нет что бы смотреть процессы других пользователей
23 Ахиллес
 
08.11.12
14:46
(22) Отладку то под своим надо делать.
24 Avalone2010
 
08.11.12
14:48
(23) не понял. Вызов экселя идет в контексте сервера, т.е. от имени пользователя под которым стартанула служба агента серверов. А это не я, это другой пользователь. Под ним возможно и висят зомби эксели. Ша буду админов теребить
25 Ахиллес
 
08.11.12
14:48
+21 Я обычно дополнительно закрываю эксель при закрытии формы. Чтоб уж наверняка его прибить. И то эта ска каким то образом иногда умудряется выживать.
26 Мыш
 
08.11.12
14:52
Файлик=Неоределено;
27 Avalone2010
 
08.11.12
14:59
Что вы к Файлику прикопались. Это двоичные данные, это не эксел.
(21) админы говорят что процессов по экселю нет ни под кем. человеки. Мож я скину кому cf с одним этим документом, кто нить глянте в КС варианте у себя, а?
28 ЧеловекДуши
 
08.11.12
14:59
>>> "У пользователя под которым выполняются серверные процедуры"

Ну все... если у вас голубчик стоит серверная версия 8-ки, то то-что выполняется на сервере, выполняется под серверным пользователем "Локальным относительно сервера".

А вообще, телепат устал, так что...
29 ЧеловекДуши
 
08.11.12
15:00
(27)Он рабочий... а вот у вас смутное представление о работе сервера 1С.
А у нас нехватка данных , для того что бы вас послать в правильном пути :)
30 Avalone2010
 
08.11.12
15:01
(28,27) какие данные нужны?
31 Serginio1
 
08.11.12
15:03
32 Avalone2010
 
08.11.12
15:07
(31), спасибо, хоть что то.Шас буду смотреть
33 hhhh
 
08.11.12
15:07
(30) я всё-таки за (1) Поэтому лучше так

     
   //3. Попробуем открыть EXCEL          

   Попытка        Эксель = Новый COMОбъект("Excel.Application");
   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
   КонецПопытки;

Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
   Файлик.Записать(ИмяФайла);
34 ЧеловекДуши
 
08.11.12
15:12
(30)КтоЗдесь?
(32)Не заработает :)
35 Avalone2010
 
08.11.12
15:15
(33) сделал даже так:
//3. Попробуем открыть EXCEL          
   Попытка        Эксель = Новый COMОбъект("Excel.Application");
   Исключение    Сообщить(ОписаниеОшибки());
       //УдалитьФайлы(ИмяФайла);
       Эксель = Неопределено;
       Возврат Неопределено;
   КонецПопытки;
   
   НачальноеВремя = ТекущаяДата();    
   Пока ТекущаяДата()< НачальноеВремя + 5 Цикл КонецЦикла;

   
   //2. Получим файлик для загрузки из временного хранилища
   ИмяФайла = "G:\1C_Temp\Шахматка_"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy_hh_mm_ss")+".xlsx";//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку        
   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
   Файлик.Записать(ИмяФайла);

   
   //4. Откроем файлик и книгу
   Книга = Эксель.WorkBooks.Open(ИмяФайла);
   Лист  = Книга.WorkSheets(НомерЛиста);
все равно не работает, та же ошибка.
36 Avalone2010
 
08.11.12
15:16
На сервере с помошью
    WshNetwork   = Новый COMОбъект("WScript.Network");
        ПодКемСеанс  =  WshNetwork.UserName;
Проверил под кем работа. Работа идет под доменным администратором
37 Ахиллес
 
08.11.12
15:16
(35) Пистят твои админы. Если Эксель не закрывался, то куда он мог деться?
38 Avalone2010
 
08.11.12
15:20
(37) может и пистят. Но объясните мне тогда, почему все отрабатывает если я на сервере(под рдп) работаю с фаловой копией этой базы? Все таки какая то куйня получается с доменным админом под которым работает сервер 1с? Или я, как сказал 29, смутно представляю работу сервера 1с?
39 Serginio1
 
08.11.12
15:31
(38) Прочитай ветку в 31 и разберись с правами DCOM