Имя: Пароль:
1C
1С v8
Открытие файла пдф на сервере
0 Eskeych
 
03.10.22
13:34
Хочу сделать открытие пдф документа и подпись ецп в http запросе. для этого мне нужно выполнить код

ЗаписьПДФ = Новый ЗаписьPDF();
ЗаписьПдф.Открыть(АдресКФайлуНаПК)
ну и дальше выполняется код

тут вылезла ошибка: "ошибка вызова метода контекста открыть()"
в синтакс-помощнике доступность стоит веб-сервис, сервис, тонкий клиент
1 Eskeych
 
03.10.22
13:38
ЗаписьPDF (PDFWriter)
Открыть (Open)
Вариант синтаксиса: Открыть файл
Синтаксис:
Открыть(<ИмяФайла>)
Параметры:
<ИмяФайла> (необязательный)
Тип: Строка.
Имя файла для записи PDF-документа.
Вариант синтаксиса: Установить поток
Синтаксис:
Открыть(<Поток>)
Параметры:
<Поток> (необязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для записи PDF-файла.
Описание:
Открывает PDF-документ для записи.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
См. также:
ЗаписьPDF, метод ОткрытьАсинх
ЗаписьPDF, метод НачатьОткрытие
Использование в версии:
Доступен, начиная с версии 8.3.16.
Описание изменено в версии 8.3.18.
Воть :)
2 Мультук
 
гуру
03.10.22
13:39
(0)

1) Сервер и клиент физически разные компьютеры?
2) АдресКФайлуНаПК = "c:\123.pdf"; //Лежит на локальном компьютере
или
   АдресКФайлуНаПК = "\\server\mydoc\123.pdf"; //Лежит в сети, доступен учетке от которой крутится 1с на сервере
3 Garykom
 
гуру
03.10.22
13:44
(0) Вот ты и столкнулся что PDF не подходящий для подписи...
4 Eskeych
 
03.10.22
13:46
(3) яы его интерактивно выбирал и подписывал. Но в http запросе не хочет открывать.
5 Eskeych
 
03.10.22
13:47
(2) на локальном компе лежит. я имер ввиду на сервере &НаСервере вот это)
6 Garykom
 
гуру
03.10.22
13:48
(4) Под http запросом подразумеваешь http-сервис?
А он от чьего имени работает?
7 Eskeych
 
03.10.22
13:49
(2) на апаче развернул сервер, и на этом же пк хочу подписать. 2) АдресКФайлуНаПК = "c:\123.pdf"; //Лежит на локальном компьютере вот этот вариант
8 Eskeych
 
03.10.22
13:50
(6) да, http-сервис. Вызываю с браузера) В каком смысле от чьего имени вызываю?)
9 Garykom
 
гуру
03.10.22
13:50
(7) А апач на попытку получить этот "c:\123.pdf" что скажет?
10 Garykom
 
гуру
03.10.22
13:51
(9)+ Точнее апач дергает 1С от какого юзера, с какими правами и видимостью/доступом?
11 Eskeych
 
03.10.22
13:53
(9) это намек на то что бы прописать сетевой пусть к файлику?
(10) это демка БП с полными правами
12 Eskeych
 
03.10.22
13:53
файловая, дальше все будет в грм
13 Eskeych
 
03.10.22
13:57
Кстати, я думал передать файлик во временное хранилище и оттуда его запульнуть в записьPDF.Открыть(адресВремХран), по сути тогда 1с уже будет видеть этот файл. Взлетит или нет?)
14 Kassern
 
03.10.22
13:58
(13) Это проверить меньше минуты, дольше наверное пост сюда написать)
15 Eskeych
 
03.10.22
14:03
(14) не, ругается)
16 Eskeych
 
03.10.22
14:25
ап)
17 Сергиус
 
03.10.22
15:08
(15)Какой путь в АдресКФайлуНаПК?
18 Eskeych
 
03.10.22
15:29
(17) на раб столе C:\Users\New\Desktop\covd.pdf
19 Eskeych
 
03.10.22
15:32
может быть у апача нет доступа к файлу? и нужно его как-нибудь дать?)
20 Kassern
 
03.10.22
15:37
(19) пробовали создать общую папку доступную всем?
21 Kassern
 
03.10.22
15:38
И покажите как вы через хранилище пробовали, скиньте кусок кода, как вы передавали с директивами и получали ДД.
22 mikecool
 
03.10.22
15:40
(15) значит тебе нельзя ((
23 Ногаминебить
 
03.10.22
15:42
(15) записьPDF.Открыть(адресВремХран)
Так сюда не адрес нужен, а имя файла вроде как. Надо файл временный на сервере создать, его заполнить и потом к имени обращаться.
24 Kassern
 
03.10.22
15:43
(23) я потому и просил, чтобы он кусок кода скинул. Может он из тех, кто на переменных экономит))
25 Eskeych
 
03.10.22
15:43
(21) та его уже затер, много попыток. Хочу попробовать вот так сделать:  
ИмяВременногоФайла = КаталогВременныхФайлов() + ".pdf";
ДвоичныйФайл = СтрокаНабора.Файл.Получить();
ДвоичныйФайл.Записать(ИмяВременногоФайла);
26 Eskeych
 
03.10.22
15:43
это на инфостарте нашел
27 Eskeych
 
03.10.22
15:44
(23) пробовал прописывать файл C:\Users\New\Desktop\covd.pdf вот так прям не видит и все. Пишет что {ФормированиеТестовыхДанных HTTPСервис.Customers.Модуль(84)}: Ошибка при вызове метода контекста (Открыть)
28 Kassern
 
03.10.22
15:48
В общем код должен быть примерно таким

&НаКлиенте
Процедура ПрочитатьФайлНаКлиенте()
Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл PDF";
    Диалог.ПолноеИмяФайла = "";
    Диалог.ПредварительныйПросмотр = Истина;
    //Диалог.Фильтр="" - тут свой формат pdf можете прописать
    ВыбранФайл=Диалог.Выбрать();
    Если ВыбранФайл Тогда
        Файл=Новый Файл(Диалог.ПолноеИмяФайла);
        ДД=Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
        Адрес=ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор);
        ЗагрузитьФайлНаСервере(Адрес);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьФайлНаСервере(Адрес)
    
    ДД=ПолучитьИзВременногоХранилища(Адрес);
    Поток=ДД.ОткрытьПотокДляЧтения();
    ЗаписьПДФ = Новый ЗаписьPDF();
        ЗаписьПдф.Открыть(Поток);

КонецПроцедуры
29 Eskeych
 
03.10.22
15:53
(28) с потоком может и сработать. Но есть одно НО) я не могу получить файл на сервере сразу. ругается. хотел двоичные данные сделать, он говорит, что ошибка при вызове конструктора (двоичные данные). Все таки проблема в доступе к файлу?
писал так ДД = Новый ДвоичныеДанные("C:\Users\New\Desktop\covd.pdf");
30 Eskeych
 
03.10.22
15:54
(29) или меня уже плавит?
31 Kassern
 
03.10.22
15:55
(29) Вы код целиком покажите, вы этот кусок где запускали, на клиенте, или на сервере?
32 Ногаминебить
 
03.10.22
15:55
Патамушта тогда надо ИмяВременногоФайла = КаталогВременныхФайлов() + "КакоетоКлевоеИмя.pdf"; И его уже туда, где щас юзерс\лалала
33 Eskeych
 
03.10.22
15:58
(31) это все http запрос. выполняется все на сервере, как я понял.
Функция GetcustomersListGetCustomersList(Запрос)  

    ПутьКФайлыПодписанный = "\\192.168.50.104\обмен\contract_offer-29-51 — копия.pdf"; //пробовал закинуть в общую папку  
    //ДД = Новый ДвоичныеДанные("C:/Users/New/Desktop/contract.pdf"); // это получаю с пк
    //КопироватьФайл("C:/Users/New/Desktop/contract_offer-29-51.pdf", ПутьКФайлыПодписанный);
    Адрес = ПоместитьВоВременноеХранилище(ПутьКФайлыПодписанный);
    ДанныеСертификата = ДанныеСертификата();
    Штамп = Штамп(ДанныеСертификата.Наименование, ДанныеСертификата.ДанныеСертификата);
    ПутьКаталога = КаталогВременныхФайлов() + ".pdf";

    //ДД.Записать(ПутьКаталога);
    
    МенеджерКриптографии = Новый МенеджерКриптографии(ДанныеСертификата.ИмяПрограммы, "", ДанныеСертификата.ТипПрограммы);
    МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = "145236";
    
    ПодписьPDF = Новый ОписаниеПодписиPDF;
    ПодписьPDF.Имя = "ПодписьДоговора";    

    ПодписьPDF.Сертификат = Новый СертификатКриптографии(ДанныеСертификата.ДанныеСертификата);
    ПодписьPDF.ТипПодписи = ТипПодписиPDF.Сертифицирующая;
    ПодписьPDF.БлокировкаДокумента = Истина;
    ПодписьPDF.Верх = 5;
    ПодписьPDF.Лево = 70;  
    ПодписьPDF.НомерСтраницы = 1;


    
    ЗаписьPDF = Новый ЗаписьPDF();
    ЗаписьPDF.Открыть(ПутьКаталога);
    //
    //ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);
    //ЗаписьPDF.Закрыть();
    
    Массив = Новый Массив;
    Массив.Добавить("ываываыв");
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Массив);
    СтрокаДляОтвета = ЗаписьJSON.Закрыть();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-type", "application/JSON;  charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Возврат Ответ;            
    
КонецФункции
34 Eskeych
 
03.10.22
16:00
функция передолюана уже во все дыры, не ругайтесь, почищу потом)
35 Kassern
 
03.10.22
16:01
(33) Сделайте простенькую проверку.
Файл = Новый файл(ПутьДоФайла);
Файл.Существует() - что выдает?
36 Kassern
 
03.10.22
16:02
Скорее всего юзвер, под которым запускается служба апача у вас системная учетная запись, у нее нет прав на чтение этого файла, вот вы и любаетесь с последствиями.
37 Eskeych
 
03.10.22
16:03
(35) пробовал создавать, ругается на Новый Файл
38 Eskeych
 
03.10.22
16:03
Сейчас скину точную ошибку
39 Eskeych
 
03.10.22
16:04
Ошибка при вызове конструктора (ФАйл) вот что пишет
40 Eskeych
 
03.10.22
16:06
(36) апач запущен кстати от имени системы, а не юзера
41 Kassern
 
03.10.22
16:08
(40) попробуйте от админа запустить и протестить
42 Eskeych
 
03.10.22
16:16
и апач и 1с запущены от имени админа
43 Ivan_495
 
03.10.22
16:22
путь пропиши d:\имя.pdf
44 Eskeych
 
03.10.22
16:32
(43) не не работает, даже в папках с общим доступом.
45 Ivan_495
 
03.10.22
16:35
с клиента попробуй
46 Kassern
 
03.10.22
16:38
(44) можете в base64 передать данный pdf файл и тогда http сервис его без проблем скушает и обработает)
47 Eskeych
 
03.10.22
16:44
(46) сейчас пилю регистр в котором буду хранить двоичные данные файлов. и из них формировать док и отправлять. Отпишусь если получится)
48 Eskeych
 
03.10.22
17:15
В общем на каталог временных фалов тоже ругается.

    НаборЗаписей = РегистрыСведений.БК_РегистрСведений1.СоздатьНаборЗаписей();
    НаборЗаписей.Прочитать();
    ИмяВремХранилища = КаталогВременныхФайлов() + "namefile.pdf";
    Строка = НаборЗаписей[0];
    ДвочиныйФайл = Строка.Файл.Получить();
    
    Если ДвочиныйФайл <> Неопределено Тогда
        
        ДвочиныйФайл.Записать(ИмяВремХранилища);
        
    КонецЕсли;
49 Eskeych
 
03.10.22
17:16
видимо что-то реально с доступом к папкам
50 Kassern
 
03.10.22
17:27
(48) зачем что-то записывать, когда есть поток?
51 Eskeych
 
03.10.22
17:34
Попытка записи в поток не поддерживающий запись - ответ
52 Garykom
 
гуру
03.10.22
19:05
(18) >на раб столе C:\Users\New\Desktop\covd.pdf
Ты в курсе что рабочий стол одного юзера недоступен другому без админских прав?
53 Eskeych
 
04.10.22
09:07
(52) все было запущено от админа и 1с и апач. Кстати указал каталог временных файлов при публикации. ПДФ вроде как открыл, но не хочет писать подпись
54 Garykom
 
гуру
04.10.22
09:41
55 Fram
 
04.10.22
11:15
Интересно все что тс пишет происходит и делается в пределах одной системы. А то все обсуждение можно затирать если это не так )
56 Eskeych
 
04.10.22
11:42
(54) в общем сделал и то и то, не пашет. Текущий код:
    НаборЗаписей = РегистрыСведений.БК_РегистрСведений1.СоздатьНаборЗаписей();
    НаборЗаписей.Прочитать();
    
    ИмяВремХранилища = КаталогВременныхФайлов() + "namefile.pdf";
    Строка = НаборЗаписей[0];
    ДвочиныйФайл = Строка.Файл.Получить();
        
    Каталог = КаталогВременныхФайлов();
    ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".pdf";
    ИмяПромеж = Каталог + ИмяФайла;
    ДвочиныйФайл.Записать(ИмяПромеж);

    ДанныеСертификата = ДанныеСертификата();
    Штамп = Штамп(ДанныеСертификата.Наименование, ДанныеСертификата.ДанныеСертификата);
        
    МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
    МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = "145";  
        
    ПодписьPDF = Новый ОписаниеПодписиPDF;
    ПодписьPDF.Имя = "ПодписьДоговора";    
    ПодписьPDF.Сертификат = Новый СертификатКриптографии(ДанныеСертификата.ДанныеСертификата);
    ПодписьPDF.ТипПодписи = ТипПодписиPDF.Сертифицирующая;  
    //ПодписьPDF.БлокировкаДокумента = Истина;
    //ПодписьPDF.Верх = 5;
    //ПодписьPDF.Лево = 70;  
    //ПодписьPDF.НомерСтраницы = 1;
    
    ЗаписьPDF = Новый ЗаписьPDF();
    ЗаписьPDF.Открыть(ИмяПромеж);    
    ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);
    ЗаписьPDF.Закрыть();
    
    Массив = Новый Массив;
    Массив.Добавить("ываываыв");
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Массив);
    СтрокаДляОтвета = ЗаписьJSON.Закрыть();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-type", "application/JSON;  charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Возврат Ответ;

из ДД собираю док. Уже ОТКРЫВАЕТ но, не хочет записывать, права на папку и файлы я дал.
Вылетает при выполнении кодманды "ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);"
он создает файл. Сохраняет его отображает штамп. Но не доподписывает. подпись оставляет но при проверке пишет что подпись недействительна.
если это все подписывать обработкой то все норм. Кстати, после того как http сервис вываливает с этой ошибкой "Ошибка при вызове метода контекста (ЗаписатьПодпись)" . Нужно чистить кеш иначе даже обработка выдает ошибку 0х00000000 тип оне находит контейнер сетрификата.
57 Eskeych
 
04.10.22
11:44
Ошибка при получении свойства сертификата (0x00000000) вот ошибка. Решается если добавить заново базу в список estart
58 Garykom
 
гуру
04.10.22
13:56
(56) Ты понимаешь что фоновое подписание "на сервере" это не тривиальная задача?
пиши микросервис на Go как я делал в свое время https://github.com/Garykom/mdlp