|
Как сохранить файл из 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
|
В общем модуле БСП ПрисоединенныеФайлы можно быть ответ.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |