|
сохранить файл на сервере 1с | ☑ | ||
---|---|---|---|---|
0
Александр056
17.08.16
✎
19:34
|
доброго всем! задача: взять файл ексель с клиента, кинуть на сервер и там сохранить, затем отбработать.
на клиенте получил, в двоичные данные преобразовал, на сервер передал, там получил двоичные данные, вопрос как сохранить его на сервере? функция КаталогВременныхФайлов() получает каталог временных файлов у клиента, хотя и используется в процедуре НаСервере. Подскажите как это осуществить? |
|||
1
zak555
17.08.16
✎
19:38
|
Если на сервера не будет Экселя, что тогда?
|
|||
2
Александр056
17.08.16
✎
19:39
|
скажем админам поставить)
|
|||
3
Defender aka LINN
17.08.16
✎
19:40
|
(1) Тогда можно вспомнить, что 1С файлы Excel читает.
(0) На файловой базе разработку ведем, да? Ну и зачем тебе каталог, когда можно сразу имя временного файла получить? |
|||
4
Mauser
17.08.16
✎
19:41
|
Одна из черепашек... обманывает.
И не надо пользоваться КаталогВременныхФайлов. Представь себе, что твою кучку кода запустят одновременно несколько сеансов. Пользуйся ПолучитьИмяВременногоФайла, она для этого и предназначена. |
|||
5
Александр056
17.08.16
✎
19:43
|
(4) балин сама функция и сформирует адрес на сервере?
|
|||
6
Defender aka LINN
17.08.16
✎
19:47
|
(5) Гимли, она формирует путь там, где запущена.
|
|||
7
Александр056
17.08.16
✎
19:48
|
(6) т.е. если я ее запущу в процедуре НаСервере, то и будет она сформирована на сервере?
|
|||
8
Mauser
17.08.16
✎
19:49
|
(7) Ну не на сайте 1С же
|
|||
9
Александр056
17.08.16
✎
20:02
|
спасибо, вроде получилось создал файлик в папке userv82 чет такое, т.е. не под моим пользаком, все доброй ночи
|
|||
10
Зая Бусечка
17.08.16
✎
20:13
|
(9) Файл создаётся в темпе того пользователя, под которым работает сервер 1с
|
|||
11
vde69
17.08.16
✎
20:16
|
извиняюсь за дебильный вопрос: а как узнать на каком сервере выполняется код если у меня 5 серверов в кластере?
по этому все, что тут предлагали - это не верные советы... почитайте рекомендации 1с на эту тему (на ИТС) |
|||
12
Defender aka LINN
17.08.16
✎
20:21
|
(11) ПолучитьИмяВременногоФайла - не верный совет?
Ну просвяти же нас, о гуру, светом правды-истины! |
|||
13
Mauser
17.08.16
✎
20:22
|
(11) http://its.1c.ru/db/v8std#content:2149184191:hdoc
Тебе, пожалуй, тоже полезно будет |
|||
14
vde69
17.08.16
✎
20:23
|
(12) правильно
ПоместитьВоВременноеХранилище ПолучитьИзВременногоХранилища |
|||
15
vde69
17.08.16
✎
20:25
|
(14) + ПолучитьИмяВременногоФайла нужно использовать только в рамках одного серверного вызова,
в рамках нескольких серверных вызовов контекст уже протухнет |
|||
16
Defender aka LINN
17.08.16
✎
20:28
|
(14) При чем тут вообще временное хранилище?
Поместил ты туда двоичные данные, получил, все гуд. Дальше твои действия какие? |
|||
17
Mauser
17.08.16
✎
20:30
|
(14) Тогда уж правильно - НачатьПомещениеФайла
(16) Он придумал за ТС себе проблему, что у него несколько серверных вызовов и героически с ней борется. |
|||
18
vde69
17.08.16
✎
20:32
|
(16) дальше в рамках одной серверной процедуры можно запустить ексель, а вот получишь ли ты обратно этот файл из следующего серверного вызова будет зависить от контекста выполнения. По этому сабж должен или ждать внутри серверного вызова завершение чужеродного потока (что плохо), либо работать как-то по другому.
|
|||
19
vde69
17.08.16
✎
20:32
|
(17) нет, просто этот вопрос - классический завал в билетах 1с :)
|
|||
20
Defender aka LINN
17.08.16
✎
20:36
|
(18) Я рекомендую тебе отдохнуть. Выпей кружечку хорошего пива, что ли.
|
|||
21
vde69
17.08.16
✎
20:40
|
(20) 2 недели на новой работе, может уже пора в отпуск?
|
|||
22
Defender aka LINN
17.08.16
✎
20:44
|
(21) Пора-пора. Речь про пути к временным файлам, а ты про временное хранилище и серверные вызовы втираешь.
|
|||
23
Александр056
18.08.16
✎
09:13
|
(14) не поможет. объект файл не передается, а двоичные данные да я получу, и ? надо ексель сохранить о чем собственно и вопрос
|
|||
24
Mauser
18.08.16
✎
09:27
|
(23) Это слишком сложно для нас, прости.
|
|||
25
Александр056
18.08.16
✎
09:30
|
(24) не прощаю! подскажи)
|
|||
26
Mauser
18.08.16
✎
09:36
|
(25) Что именно? Как обработать - знаешь только ты. Для передачи надо на клиенте начать помещение файла с параметром - путем, получишь адрес в хранилище. С этим адресом идешь на сервер, извлекаешь по нему двоичные данные и сбрасываешь на диск. Дальше твои ёксельные фантазии.
|
|||
27
Александр056
18.08.16
✎
10:00
|
(26) . С этим адресом идешь на сервер, извлекаешь по нему двоичные данные и сбрасываешь на диск.
вот в этом и вопрос, куда сохранить? всмысле как бы получить временную папку там на сервере, точно зная что будет доступна и т.д. и исходя из этого сохранить уже файл, дальше все понятно что мои фантазии. Как сгенерировать ПУТЬ для сохранения на сервере? |
|||
28
Mauser
18.08.16
✎
10:03
|
(27) Ты точно тему читаешь? Они тебе угрожают оружием?
|
|||
29
Александр056
18.08.16
✎
10:06
|
ПолучитьИмяВременногоФайла
не помогло( |
|||
30
Mauser
18.08.16
✎
10:07
|
(29) Чем мотивировало?
|
|||
31
Александр056
18.08.16
✎
10:44
|
(30) {Форма.Форма.Форма(209)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу "C:\Users\USR1CV82\AppData\Local\Temp\v8_CC39_28.xslx". Это может быть вызвано одной из следующих причин.
• Указан несуществующий файл или путь. • Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент. |
|||
32
Defender aka LINN
18.08.16
✎
10:55
|
(31) Ставлю на вариант №1
|
|||
33
Александр056
18.08.16
✎
11:03
|
(32) у меня еще опечатка в формате была, исправил, щас пойду админов спрашивать
|
|||
34
Александр056
18.08.16
✎
13:01
|
капец затра***ся, ексель есть, файлик сохраняется не открывает и все, ну пздц
|
|||
35
Nite
18.08.16
✎
13:21
|
Права в дком на сервере поменять еще нужно.
|
|||
36
schoolboy2016
18.08.16
✎
14:12
|
Это удачно я зашел. У меня нет опыта управляемых форм и с файловой системой я тоже до этого не работал, а тут поставили задачу сделать возможность прикрепления к документу реализация товаров и услуг в УТ 11, файлов pdf. Файлы должны храниться на общем диске. Хорошо хоть сроков не стоит, есть время разобраться...
|
|||
37
schoolboy2016
18.08.16
✎
14:17
|
Вопрос: переносить файл в сетевой каталог обязательно использую серверные методы? Или есть возможность на клиенте все сделать, читать сам файл в 1с от меня не требуется. Просто дать информацию, есть у этого документа файлы или нет...
|
|||
38
Александр056
18.08.16
✎
14:25
|
(37) сделай общий каталог до которого сможешь стучаться из любого места, и из 1с будешь получать свои файлы
|
|||
39
Александр056
18.08.16
✎
14:29
|
(35) ок, с сохранением передачей разобрался, теперь просто не открывает, может быть из-за этого?
|
|||
40
hitodom
18.08.16
✎
14:29
|
(1) Обычный таб док умеет читать ексель
|
|||
41
schoolboy2016
18.08.16
✎
14:37
|
В свое время делал загрузку данных из xls правда опять же на обычных формах. Использовал ADODB. Очень понравилось, что не требует установки excel на сервер, да и в инете оч много информации о методах.
Использовал функцию из инета для получения данных в тз. Функция ЗагрузитьМетодом_MSADODB(Знач ФайлEXCEL, Знач ИмяЛиста, Знач СтрокаЗаголовка = 2, НачСтрока = 3, КонСтрока = 0, Знач ПодключениеADODB = "MicrosoftJetOLEDB40") Экспорт //ПустоеПодразделение = Справочники.Подразделения.ПустаяСсылка(); Если ПодключениеADODB = "MicrosoftACEOLEDB12" Тогда СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;"""; Иначе СonnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;"""; КонецЕсли; Попытка ADODBConnection = Новый COMОбъект("ADODB.Connection"); ADODBConnection.ConnectionString = СonnectionString; ADODBConnection.Open(); ADODBConnection.CursorLocation = 3; Исключение Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание); Возврат Новый ТаблицаЗначений; КонецПопытки; ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]"; Попытка ADODBRecordset = Новый COMОбъект("ADODB.Recordset"); ADODBRecordset.Open(ТекстЗапроса, ADODBConnection); Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда КолвоСтрокExcel = 0; Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание); ADODBRecordset.Close(); ADODBConnection.Close(); ADODBRecordset = Неопределено; ADODBConnection = Неопределено; Возврат Новый ТаблицаЗначений; КонецЕсли; ADODBRecordset.AbsolutePage = 1; ADODBRecordset.AbsolutePosition = 1; Исключение Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание); Возврат Новый ТаблицаЗначений; КонецПопытки; КолвоСтрокExcel = ADODBRecordset.RecordCount + 1; КолвоКолонокExcel = ADODBRecordset.Fields.Count; Если КолвоСтрокExcel <= 2 Тогда КолвоСтрокExcel = 0; Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание); ADODBRecordset.Close(); ADODBConnection.Close(); ADODBRecordset = Неопределено; ADODBConnection = Неопределено; Возврат Новый ТаблицаЗначений; КонецЕсли; ТаблицаРезультат = Новый ТаблицаЗначений; ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4); ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1); Для ит = 1 ПО КолвоКолонокExcel Цикл Поле = ADODBRecordset.Fields.Item(ит - 1); ИмяКолонки = "К_" + ит; Если ИмяКолонки = "К_1" Тогда Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Число") , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); ИначеЕсли ИмяКолонки = "К_2" Тогда Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Дата") , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); ИначеЕсли ИмяКолонки = "К_3" Тогда Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Строка") , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); ИначеЕсли ИмяКолонки = "К_5" Тогда Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Строка") , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); ИначеЕсли ИмяКолонки = "К_6" Тогда Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Число") , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); ИначеЕсли ИмяКолонки = "К_7" Тогда Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов("Число") , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); Иначе Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); КонецЕсли; КонецЦикла; НоваяСтрока = ТаблицаРезультат.Добавить(); НоваяСтрока.НомерСтроки = 1; Для ит = 1 ПО КолвоКолонокExcel Цикл ИмяКолонки = "К_" + ит; Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки); НоваяСтрока[ИмяКолонки] = Колонка.Заголовок; КонецЦикла; НомерСтроки = 1; Пока ADODBRecordset.EOF() = 0 Цикл НомерСтроки = НомерСтроки + 1; Если НомерСтроки < НачСтрока Тогда ADODBRecordset.MoveNext(); Продолжить; КонецЕсли; Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда Прервать; КонецЕсли; НоваяСтрока = ТаблицаРезультат.Добавить(); НоваяСтрока.НомерСтроки = НомерСтроки; Для ит = 1 ПО КолвоКолонокExcel Цикл Поле = ADODBRecordset.Fields.Item(ит - 1); Если Поле.ActualSize = 0 Тогда Продолжить; КонецЕсли; ЗначениеЯчейки = Поле.Value; ИмяКолонки = "К_" + ит; НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки; ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина; ДлинаСтроки = СтрДлина(СокрЛП(ЗначениеЯчейки)); ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки); КонецЦикла; ADODBRecordset.MoveNext(); КонецЦикла; ADODBRecordset.Close(); ADODBConnection.Close(); ADODBRecordset = Неопределено; ADODBConnection = Неопределено; ТаблицаРезультат.Удалить(ТаблицаРезультат[0]); Возврат ТаблицаРезультат; КонецФункции |
|||
42
schoolboy2016
18.08.16
✎
14:41
|
Вот так список листов вычислял, и передавал нужный лист в ту функцию.
Процедура ФайлExcelПолучитьСписокЛистов(Знач ФайлEXCEL, Знач ПодключениеADODB = "MicrosoftJetOLEDB40") СписокЛистов = Новый СписокЗначений; Файл = Новый Файл(ФайлEXCEL); Если ВРег(Файл.Расширение) = ".XLS" ИЛИ ВРег(Файл.Расширение) = ".XLSX" Тогда Если ПодключениеADODB = "MicrosoftACEOLEDB12" Тогда СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;"""; Иначе СonnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;"""; КонецЕсли; Попытка ADODBConnection = Новый COMОбъект("ADODB.Connection"); ADODBConnection.Open(СonnectionString); ADOXCatalog = Новый COMОбъект ("ADOX.Catalog"); ADOXCatalog.ActiveConnection = ADODBConnection; МассивЛистов = ADOXCatalog.Tables; Для Каждого ЛистМассива ИЗ МассивЛистов Цикл пИмяЛиста = ЛистМассива.Name; Если пИмяЛиста = "Excel_BuiltIn_Database" Тогда Продолжить; КонецЕсли; Если Прав(пИмяЛиста,1) = "$" Тогда ЭлементыФормы.ИмяЛиста.СписокВыбора.Добавить(Лев(пИмяЛиста, СтрДлина(пИмяЛиста)-1)); Иначе Продолжить; КонецЕсли; КонецЦикла; ADOXCatalog = Неопределено; ADODBConnection.Close(); ADODBConnection = Неопределено; Исключение Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание); КонецПопытки; КонецЕсли; КонецПроцедуры |
|||
43
schoolboy2016
19.08.16
✎
08:54
|
Добрый день. Не хочу плодить тему, поэтому задам свой вопрос тут. У меня при попытке создания каталога выдает ошибку.
{ВнешняяОбработка.РаботаСФайлами.Форма.Форма.Форма(58)}: Ошибка при вызове метода контекста (СоздатьКаталог): Ошибка создания каталога: Ошибка доступа к файлу 'Файл'. 5(0x00000005): Отказано в доступе. Функция вот такая: &НаКлиенте Функция ПроверитьСуществованиеКаталогаДома(Дом, КаталогАрхива) КаталогДома = КаталогАрхива+"\"+Дом; ПапкаДома = Новый Файл(КаталогДома); Если Не ПапкаДома.Существует() Тогда Ответ = Вопрос("Папка: "+Дом+" не существует в каталоге: "+КаталогАрхива+"\"+" создать ее?",РежимДиалогаВопрос.ОКОтмена); Если Ответ = КодВозвратаДиалога.ОК Тогда Попытка СоздатьКаталог(ПапкаДома); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Возврат Истина; Иначе Возврат Ложь; КонецЕсли; Иначе Возврат Истина; КонецЕсли; КонецФункции Я лично думаю, раз функция клиентская, то наверное она для создания каталога использует права пользователя, от которого у меня запущена 1С. У этого пользователя как не странно полные права, админ домена. В чем прикол? Может есть какой-нибудь способ в 1С задать учетку под которой будет производиться создание каталога? |
|||
44
schoolboy2016
19.08.16
✎
08:56
|
Забыл дописать, база запускается локально с моего компа, мой комп в домене, сервер 1с на другом компе, который не в домене, база sql на третьем компе, который в домене... =)
|
|||
45
schoolboy2016
19.08.16
✎
09:00
|
Я тут подумал, пожалуй лучше разместить каталог архива на терминальном сервере, там не потребуются права доменные.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |