Имя: Пароль:
1C
1С v8
Как сохранить файл из 1С (программно)
,
0 Aleksey1989
 
31.01.13
12:29
Добрый день. Подскажите, пожалуйста, как сохранить вордовский файл из 1С (программно), чтобы в его имени были пробелы?

Использую вот такой код:

ИмяФайла = "C:\Реализация товаров и услуг.docx";
ДвоичныеДанныеССервера = ПолучитьДвоичныеДанные(ИмяМакета);
MSWordИзДвоичныеДанныеССервера = ПолучитьИзВременногоХранилища(ДвоичныеДанныеССервера);
MSWordИзДвоичныеДанныеССервера.Записать(ИмяФайла);

П.с. я использую макет, который имеет тип "Двоичные данные". При запуске MSWordИзДвоичныеДанныеССервера.Записать(ИмяФайла) вылетает ошибка, что первый параметр неправильный.
1 Builder
 
31.01.13
12:35
Попробуй что ли кавычек добавь в имя файла.
2 de Bug
 
31.01.13
12:36
ИмяФайла = """C:\Реализация товаров и услуг.docx""";
3 Aleksey1989
 
31.01.13
18:24
(2) Не работает:

ИмяФайла = """C:\" + ПолучитьПользователя() +  ". Претензия от " + Строка(ТекущаяДата())+".docx""";

Выше приведенный код выдает ту же самую ошибку
4 Wobland
 
31.01.13
18:30
ПолучитьИзВременногоХранилища, говоришь? а что ты туда положил?
5 Aleksey1989
 
31.01.13
18:37
(4) Вордовский шаблон.
6 Aleksey1989
 
31.01.13
18:38
+ (5) Просто работа с макетом типа Active Document не возможна в клиент-серверном режиме, поэтому пришлось искать обходные пути.
7 Wobland
 
31.01.13
18:41
(5) в каком месте? по какому адресу?
8 Aleksey1989
 
31.01.13
18:45
(7) Не совсем понял вопрос. Сам вордовский шаблон загружен в макет, который имеет тип "Двоичные данные". На сервере я получаю этот шаблон и передаю его на клиента, на котором word установлен. Но чтобы открыть этот макет через word, надо преобразовать двоичные данные в документ word, это делается сохранением этого документа на диск. Имя документа должно получиться следующим:

"C:\Автомат. Претензия от 31.01.2013 18.48.53.docx"
9 Wobland
 
31.01.13
18:46
Синтаксис:

ПолучитьИзВременногоХранилища(<Адрес>)

скажи мне свой адрес
10 Aleksey1989
 
31.01.13
18:48
(9) e1cib/tempstorage/9fbe19c4-7a61-4191-86f0-e522c4e500d0
11 Wobland
 
31.01.13
18:49
(10) откуда ты его взял?
12 Wobland
 
31.01.13
18:49
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   НЗ=РегистрыСведений.ФайлыЗаданий.СоздатьНаборЗаписей();
   НЗ.Отбор.Задание.Установить(Объект.Ссылка);
   НЗ.Прочитать();
   Если НЗ.Количество() Тогда
       Данные=НЗ[0].Файл.Получить();
       РасширениеФайла=НЗ[0].Расширение;
   Иначе
       Данные=Неопределено;
       Расширение="";
   КонецЕсли;
   Если Данные<>Неопределено Тогда
       АдресФайла=ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
   КонецЕсли;        
КонецПроцедуры

&НаКлиенте
Процедура Показать(Команда)
   #Если ВебКлиент Тогда
       Предупреждение("Не доделано, не додумано");
   #Иначе
       Если НЕ ЭтоАдресВременногоХранилища(АдресФайла) Тогда
           Возврат;
       КонецЕсли;
       ВременноеИмя=ПолучитьИмяВременногоФайла(РасширениеФайла);
       ПолучитьФайл(АдресФайла, ВременноеИмя, Ложь);
       ЗапуститьПриложение(ВременноеИмя);
   #КонецЕсли
КонецПроцедуры
13 Aleksey1989
 
31.01.13
18:53
(11) Из переменной ДвоичныеДанныеССервера кода:

ДвоичныеДанныеССервера = ПолучитьДвоичныеДанные(ИмяМакета);
MSWordИзДвоичныеДанныеССервера = ПолучитьИзВременногоХранилища(ДвоичныеДанныеССервера);
MSWordИзДвоичныеДанныеССервера.Записать(ИмяФайла);

.....................

&НаСервере
Функция ПолучитьДвоичныеДанные(ИмяМакета)
   Документ = Документы.Претензия.ПолучитьМакет(ИмяМакета);
   АдресФайлаWordВХранилище = ПоместитьВоВременноеХранилище(Документ);
   Возврат АдресФайлаWordВХранилище;
КонецФункции
14 Wobland
 
31.01.13
18:53
никогда б не догадался, что ПолучитьДвоичныеДанные возвращает строку
15 Aleksey1989
 
31.01.13
18:56
(14) Первое, что попало в голову, как говорится :). На самом деле я этот код сейчас дорабатываю, как сделаю все, буду готовить шаблонный код, чтобы его можно было использовать впоследствии, в том числе поработаю и над названиями переменных и процедур.
16 Aleksey1989
 
31.01.13
19:02
(12) Не знаю, что ты хотел сказать этим кодом, но попытаюсь догадаться:
Использование функции "ПолучитьФайл" вместо "ПолучитьИзВременногоХранилища". Если да, то возникает опять же ошибка в имени файла.
17 Wobland
 
31.01.13
19:03
(16) это я открываю вордовский документ, хранящийся в базе. а почему "опять же ошибка в имени файла"?
18 Aleksey1989
 
31.01.13
19:06
(17) Это не ошибка, а моя невнимательность. Я проглядел про вызов процедуры ПолучитьВременноеИмя и по ошибке вставил то имя, которое я до этого хотел увидеть (с пробелами).
19 Reset
 
31.01.13
19:07
(16)
ПолучитьФайл(<Адрес>, <ИмяФайла>, <Интерактивно>)
Параметры:

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

Тип: Строка.
Расположение данных во временном хранилище или в информационной базе.

Т.е. то же самое что у тебя, но одной строкой
20 Reset
 
31.01.13
19:08
(17) Правильно я написал? :) Базировался только на чтении СП :) Когда то нужно привыкать к УП)
21 Wobland
 
31.01.13
19:10
(20) вот одной строкой, проверяй ;)

ПолучитьФайл(ПоместитьВоВременноеХранилище(Документы.Претензия.ПолучитьМакет("НекийМакет")), """C:\" + ПолучитьПользователя() +  ". Претензия от " + Строка(ТекущаяДата())+".docx""")
22 Wobland
 
31.01.13
19:11
(21) ложь третьим параметром
23 Reset
 
31.01.13
19:12
(21) Ну так это извращенный вариант просто от

Документы.Претензия.ПолучитьМакет("НекийМакет").Записать("C:\.. и т д")Ж
24 Reset
 
31.01.13
19:13
я говорил про
ДвоичныеДанныеССервера = ПолучитьДвоичныеДанные(ИмяМакета);
MSWordИзДвоичныеДанныеССервера = ПолучитьИзВременногоХранилища(ДвоичныеДанныеССервера);
MSWordИзДвоичныеДанныеССервера.Записать(ИмяФайла);

==>
ИмяФайла=ПолучитьИмяВременногоФайла(РасширениеФайла);
ПолучитьФайл(АдресФайла, ВременноеИмя, Ложь);
25 Wobland
 
31.01.13
19:13
получить макет на тонком нельзя, одной строкой не выйдет
26 Wobland
 
31.01.13
19:14
(24) а до этого сходить на сервер и покласть в хранилище макет
27 Reset
 
31.01.13
19:15
(26) Я понимаю. Ладно, забей, лучше ТСу помоги. Я справлюсь ;)
28 Wobland
 
31.01.13
19:16
(27) а ТСу мы уже не нужны
29 Aleksey1989
 
31.01.13
19:33
(21)(22) Неправильно, 1С ругается:
{Документ.Претензия.Форма.ФормаДокумента.Форма(173)}: Ошибка при вызове метода контекста (ПолучитьФайл)
           ПолучитьФайл(ДвоичныеДанныеССервера, """C:\" + ПолучитьПользователя() +  ". Претензия от " + Строка(ТекущаяДата())+".docx""", ложь);
по причине:
Каталог не обнаружен 'file://"C:\Автомат. Претензия от 31.01.2013 22:36:14.docx"'
30 Aleksey1989
 
31.01.13
19:39
(29) Даже если убрать из названия файла функцию ТекущаяДата() (она возвращает строку, в которой есть символы ":", а они не допустимы), то все равно ошибка будет.
31 GANR
 
31.01.13
19:47
(30) Посмотри, как это делается в справочнике типовых конф "Внешние обработки", ведь последние, прежде чем запуститься, сохраняются на жесткий диск.
32 GANR
 
31.01.13
19:49
+(31) А Windows права-то на сохранение файла в указанном месте имеются?
33 Aleksey1989
 
31.01.13
19:51
(32) Конечно имеются. Что за справочник типовых конф?
34 GANR
 
31.01.13
19:53
(33) ДополнительныеОтчетыИОбработки он в современных конфигурациях называется. Кликаешь на обработку - она сохраняется на ЖД и запускается.
35 GANR
 
31.01.13
19:54
Не факт, конечно, что поможет, может быть дело не в имени файла, а в ДвоичныеДанныеССервера.
36 Aleksey1989
 
31.01.13
19:58
(35) Дело 100 % в имени файла, т.к. если оно будет без пробелов, то все будет ок.
37 GANR
 
31.01.13
20:02
(36) Хм... Почему-же у меня тогда это сохраняется (по крайней мере год назад так было)?
38 Aleksey1989
 
31.01.13
20:18
(37) Тогда на ум приходит только один вариант: ошибка в платформе.
39 Aleksey1989
 
31.01.13
20:41
Кстати, тройные кавычки тоже указывать нельзя, с ними даже имя, в котором нет пробелов, не подходит.

М.б. в 1С символы пробела заменяются каким-нибудь спец. символом?
40 GANR
 
31.01.13
21:03
(38) Нужно покопаться в стандартной подсистеме типовых конфигураций и БСП "РаботаСФайлами" - там целый сложный процесс, оказывается, по работе с именем файла.

Ну, а если и это не поможет - тогда написать на [email protected] с обязательным указанием (без этого письма не будут рассмотрены):
- организации
- релиза платформы
- названия и релиза конфигурации
- регистрационного номера программного продукта
Я там получил ответы на многие интересующие меня вопросы, которые не смог узнать на форумах.
41 GANR
 
31.01.13
21:08
В общем модуле БСП ПрисоединенныеФайлы можно быть ответ.