Имя: Пароль:
1C
1С v8
Затык с Передачей файла на &Клиент
0 Федор Сумкин
 
01.12.11
12:14
День добрый!
Господа, че-т не могу сходу сообразить...
Есть у меня Обработка, а в ней реквзит "ДопСоглашение" - далее ДС.
Если пытаюсь напечатать ДС из самой формы ДС - все норм, выглядит (условно) так:

&НаСервере
Функция ПечатьДС()
   Обж = РеквизитФормыВЗначение("Объект");
   Возврат Обж.ПечатьДС();
КонецФункции

&НаКлиенте
Процедура Печать(Команда)
   
   Адрес = ПечатьДС();
   
   Если Адрес = Неопределено Тогда
       Возврат;
   КонецЕсли;
   
   ВФайл = "D:\Temp\ДС " + СтрЗаменить(СтрЗаменить(Объект.Номер, "\", "_"), "/", "_") + ".doc";
   
   ПолучитьФайл(Адрес, ВФайл);
   
КонецПроцедуры

Если пытаюсь из обработки (не внешней) вот так:

&НаСервере
Функция ПечатьДС_()
   Обж = ДопСоглашение.ПолучитьОбъект();
   Возврат Обж.ПечатьДС();
КонецФункции

&НаКлиенте
Процедура ПечатьДС(Команда)
   
   Если Не ЗначениеЗаполнено(ДопСоглашение) Тогда
       Возврат;
   КонецЕсли;
   
   Адрес = ПечатьДС_();
   
   Если Адрес = Неопределено Тогда
       Возврат;
   КонецЕсли;
   
   ВФайл = "D:\Temp\ДС " + СтрЗаменить(СтрЗаменить(РеквизитОбъекта(ДопСоглашение, "Номер"), "\", "_"), "/", "_") + ".doc";
   ПолучитьФайл(Адрес, ВФайл);

КонецПроцедуры

Ошибка (до сохранения или открытия файла доходит, диалог появляется, но сохранить/открыть нельзя):
Ошибка при выполнении файловой операции  'e1c://server/10.142.хх.ххх/ХххХхх/e1cib/tempstorage/8bb4514d-67ef-432c-adf2-932a86cf5ccf'
Хотя, с сервера возвращается Адрес такой:
"e1cib/tempstorage/f4fb467c-cdc4-46cc-9888-9897db351f74"
1 Федор Сумкин
 
01.12.11
12:28
ап!
2 Defender aka LINN
 
01.12.11
12:31
Главное - до последнего не показывай, что в процедуре ПолучитьФайл(). Тяни, как можешь.
3 Федор Сумкин
 
01.12.11
12:34
(2)
Глобальный контекст (Global context)
ПолучитьФайл (GetFile)
Синтаксис:

ПолучитьФайл(<Адрес>, <ИмяФайла>, <Интерактивно>)
Параметры:

<Адрес> (обязательный)

Тип: Строка.
Расположение данных во временном хранилище или в информационной базе.
<ИмяФайла> (необязательный)

Тип: Строка.
Путь к файлу, в который будут сохранены данные из информационной базы.
В не интерактивном режиме необходимо указать значение параметра, иначе будет вызвано исключение.
В интерактивном режиме может быть не задан.
Значение по умолчанию: Пустая строка
<Интерактивно> (необязательный)

Тип: Булево.
Истина - режим, в котором пользователю показывается диалог, в котором он может выбрать действие с получаемым файлом: запустить его или сохранить по выбранному расположению.
В веб-клиенте параметр должен быть равен Истина. В противном случае будет сгенерировано сообщение об ошибке.
Значение по умолчанию: Истина
Возвращаемое значение:

Тип: Булево; Неопределено.
Ложь - пользователь отменил операцию сохранения файлов (в интерактивном режиме).
В режиме запуска "Веб-клиент" всегда возвращает Неопределено.
Описание:

Получает файл и сохраняет его в локальную файловую систему пользователя.
По умолчанию, метод исполняется в интерактивном режиме, то есть когда будет выдано диалоговое окно, позволяющее указать действие с полученным файлом - запустить его или сохранить по указанному пользователем расположению.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент.
Вызов метода выполняет обращение к серверу.

Примечание:

Если используется интерактивный режим, а параметр <ИмяФайла> не указан, то операция открытия файла не доступна.
В веб-клиенте код на встроенном языке продолжает выполнение, не дожидаясь окончания загрузки файла.
Результат выполнения кэшируется в разрезе значений параметров метода. Если данные в файле были изменены, выполняется обращение к серверу.
4 Федор Сумкин
 
01.12.11
12:34
(3)
Взято из встроенной справки...
5 Defender aka LINN
 
01.12.11
12:38
Тогда надо в тайне оставлять процедуру ПечатьДС() :)
6 Pasha_mix
 
01.12.11
12:38
(2) Решил с умничать )
7 Pasha_mix
 
01.12.11
12:39
(5) Печать дс создает некий файл. Вопрос что с ним дальше делать?
(0) Я правильно понял?
8 Федор Сумкин
 
01.12.11
12:41
(5)
   ВФайл    = ПолучитьИмяВременногоФайла("doc");
   АДМакет    = Справочники.нафтаЮА_ДопСоглашения.ПолучитьМакет("Макет");
   АДМакет.Записать(ВФайл);
   
   Попытка
       КомОбж = ПолучитьCOMОбъект(ВФайл);
   Исключение
       Сообщить(ОписаниеОшибки());
       Сообщить("Ошибка создания шаблона Д.С.!");
       Возврат Неопределено;
   КонецПопытки;
   
   Док = КомОбж.Application.Documents(1);
       
       //........................................................................
       
   Док.SaveAs(ВФайл);
   КомОбж.Application.Quit();
   КомОбж = Неопределено;
   
   Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВФайл));
   УдалитьФайлы(ВФайл);
   
   Возврат Адрес;
9 Федор Сумкин
 
01.12.11
12:44
(7) Типа, да - но не совсем...
Я понимаю, что с ним делать...
Просто мне его (файл) надо получить из формы обработки, а не из формы элементы справочника...
Если напрямую из формы элемента справочника - все без проблем...
Если из обработки, в которой есть реквизит - ссылка на элемент ДС - не пашет (не допахивает :) )
10 Defender aka LINN
 
01.12.11
12:49
(8) Ну и возвращай двоичные данные, а на клиенте записывай.
11 Федор Сумкин
 
01.12.11
12:52
(0) В первом сообщения адреса разные вставил... из разных сеансов отладки...
Они на самом деле одинаковые (почти):
e1cib/tempstorage/d0e1a0bd-da53-4c2d-bdb6-21cd2a3fd4bf
e1c://server/10.142.хх.ххх/ХххХхх/e1cib/tempstorage/d0e1a0bd-da53-4c2d-bdb6-21cd2a3fd4bf

(10) Так я и возвращаю..... Но, как-то недополучаю.... ))
Диалог сохранения/открытия появляется - но дальше ошибка, описанная в (0)
12 Федор Сумкин
 
01.12.11
12:55
Повторюсь:
"Просто мне его (файл) надо получить из формы обработки, а НЕ из ФОРМЫ ЭЛЕМЕНТА справочника...
Если НАПРЯМУЮ из формы элемента справочника - все БЕЗ ПРОБЛЕМ... получаю файл...
Если ИЗ ОБРАБОТКИ, в которой есть реквизит - ссылка на элемент ДС - НЕ ПАШЕТ..."
13 Федор Сумкин
 
01.12.11
12:56
Я уже подумываю (накрайняк) по-ламерски как-то сделать )))
Открывать форму элемента ДС, перед открытием (по параметру) "Отказ = Истина" и ПечататьДС()
14 Федор Сумкин
 
01.12.11
12:59
Я так понимаю - глобальная разница в:
Обж = РеквизитФормыВЗначение("Объект");
И
Обж = ДопСоглашение.ПолучитьОбъект();
Вот токо в чем? И то и то Объект получает....или я не прав?
15 Федор Сумкин
 
01.12.11
13:15
Хелп!
16 Федор Сумкин
 
01.12.11
13:24
Лана. ((
Всем пасиба...
Сделал (до лучших времен), как написал в (13).
Для глаза незаметно... )
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.