|
Загрузка из 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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |