Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Не сохраняется табличный документ во внешний файл .pdf

Не сохраняется табличный документ во внешний файл .pdf
Я
   foxslot
 
14.10.19 - 12:47
Столкнулся с проблемой: фоновым заданием происходит изменение определенного регистра сведений, в результате этого изменения срабатывает подписка на событие и происходит выгрузка пф платежного поручения в табличный документ и попыткой записать во внешний файл .pdf, при записи вылетает ошибка: "Ошибка при вызове метода контекста (Записать): Ошибка при выполнении файловой операции". Весь экшн в том, что если вызывать эту процедуру вручную (меняя запись в регистре) то все отрабатывает нормально, файлы создаются и записываются. Пользователь через которого запускается фоновое задание с полными правами, запускать вручную тоже пробовал через этого пользователя. Пробовал смоделировать такую же ситуацию на тестовой базе на этом же сервере, как результат все работает нормально, создается и сохраняется при этом ссылается на одни и ту же папку для хранения временных файлов. Помимо этого есть еще обработки, который сохраняют файл .pdf в эту же папку, тем самым исключил отсутствие прав для учетки, через которую запущена служба 1с. Подскажите, что еще может быть, куда копать нужно?
 
 
   Ёпрст
 
1 - 14.10.19 - 13:22
на сервере, нет такого пути/каталога, + разрешитьвывод нужно табдоку установить в истина
   Ёпрст
 
2 - 14.10.19 - 13:23
ну и прав нема
   foxslot
 
3 - 14.10.19 - 13:30
(1) путь/каталог проверял, присутствует. По поводу разрешить вывод табдоку проверю
   foxslot
 
4 - 14.10.19 - 13:32
(2) прав для учетки в 1с полные и для пользователя, который указан в службе 1с полные. Тем более как ранее отмечал, что есть другие обработки которые сохраняют файлы .pdf в эту же папку, следовательно проблем с правами быть не должно
   Ёпрст
 
5 - 14.10.19 - 13:59
(4) на компе, где служба сервера запущена, есть эта папка ?
   Glavkomnn
 
6 - 14.10.19 - 14:00
(1) согласен с оратором
   Ёпрст
 
7 - 14.10.19 - 14:01
У табличного дока, свойство ИспользованиеВывода  в Разрешить, поставил хоть ?
   foxslot
 
8 - 14.10.19 - 14:04
(5) да есть, даже в отладке проверял
   foxslot
 
9 - 14.10.19 - 14:06
(7) в (3) написал что проверю, но думаю вряд ли, до этого то все работала, код в этой процедуре не меняли
   Ёпрст
 
10 - 14.10.19 - 14:10
(9) чудес то не бывает, либо нет прав, либо нет каталога
   piter3
 
11 - 14.10.19 - 14:10
(9) значит код разный все-таки
   RomanYS
 
12 - 14.10.19 - 14:20
(8) попробуй записать во временный каталог. Поймёшь где проблема: в доступе к ФС или внутри 1С
   foxslot
 
13 - 14.10.19 - 14:21
(10) Каталог существует уверен на 100%, я это дело в первую очередь проверял, причем он задается через стандартную процедуру КаталогВременныхФайлов() + имя файла


//часть кода

Для Каждого СтрокаРезультата Из Результат Цикл
        Индекс = Результат.Индекс(СтрокаРезультата);
        ПП = масПлатежныеПоручения.Получить(Индекс);
        ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);
        Если Не ЗначениеЗаполнено(ИмяФайлаБезРасширения) Тогда
            ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
        Иначе
            ИмяФайла = ИмяФайлаБезРасширения + ".pdf";
        КонецЕсли;
        ИмяФайла = КаталогВременныхФайлов() + ИмяФайла;
        СтрокаРезультата.ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
        Вложения.Добавить(ИмяФайла);
КонецЦикла;
//
   foxslot
 
14 - 14.10.19 - 14:25
(10) а вот насчет прав не знаю как проверить, просто есть процедуры которые нормально сохраняют и записывают файлы, соответственно не должно быть проблем, но вот думаю может какие то ограничения можно поставить даже если права на эту папку есть
   Ёпрст
 
15 - 14.10.19 - 14:26
(13) неа он у тебя берется отсюда
 ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);
  вот его и запиши в ЖР
   foxslot
 
16 - 14.10.19 - 14:27
(11) Запускается одна и та же процедура, просто при выполнении фоновым заданием, вылетает ошибка, при ручном запуске (путем изменения записи в регистре чтобы вызвать подписку на событие) все нормально сохраняется. Все это проделывается по одним пользователем с полными правами
   Ёпрст
 
17 - 14.10.19 - 14:28
Ну и ошибка вот в чем:
ты к каталогу еще каталог прибавляешь, ибо ПолучитьИмяВременногоФайла УЖЕ возвращает имя с каталогом
   foxslot
 
18 - 14.10.19 - 14:33
(15) нет, же.

ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);
//тут возвращается имя печатной "Платежное поручение от какой то даты"


ИмяФайла = ИмяФайлаБезРасширения + ".pdf";
//далее тут к нему приделывается .pdf => "Платежное поручение от какой то даты.pdf"


ИмяФайла = КаталогВременныхФайлов() + ИмяФайла;
//а тут уже получается к имени файла приделывается путь к временному каталогу 

=> "....\AppData\Local\Temp\Платежное поручение от какой то даты.pdf"

В отладке несколько раз проверял путь все корректно
   Ёпрст
 
19 - 14.10.19 - 14:36
(18) еще раз
  ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
  ....
  ИмяФайла = КаталогВременныхФайлов() + ИмяФайла;


>>>.\AppData\Local\Temp\....\AppData\Local\Temp\Платежное поручение от какой то даты.pdf
   Ёпрст
 
20 - 14.10.19 - 14:36
ясен пень, такого пути нет - ошибка
   Euguln
 
21 - 14.10.19 - 14:36
Может уже существует такой файл?
А не в pdf сохраняется?
   foxslot
 
22 - 14.10.19 - 14:37
(17) ПолучитьИмяВременногоФайла("pdf") не выполнится так как ИмяФайлаБезРасширения возвращается заполненным и соответсвенно в тот блок не провавливается.
   Ёпрст
 
23 - 14.10.19 - 14:38
(22) с чего такая уверенность ?
   foxslot
 
24 - 14.10.19 - 14:39
(23) в отладке проверял
   Ёпрст
 
25 - 14.10.19 - 14:39
ты это где увидел, что в эту ветку не заходит ? В отладке фонового задания, или где ?
Для проверки, запиши имя файла в журнал регистрации, запусти фоновое и посмотри глазками, если лень запущать отладку фоновых заданий
   Ёпрст
 
26 - 14.10.19 - 14:40
ну или тупо, тест на вшивость:

//       ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);

  //      Если Не ЗначениеЗаполнено(ИмяФайлаБезРасширения) Тогда

            ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
    //    Иначе

      //      ИмяФайла = ИмяФайлаБезРасширения + ".pdf";

      // КонецЕсли;

      // ИмяФайла = КаталогВременныхФайлов() + ИмяФайла;

        СтрокаРезультата.ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

   foxslot
 
27 - 14.10.19 - 14:42
(21) также проверял в отладке через Файл.Существует()
   Ёпрст
 
28 - 14.10.19 - 14:43
(27) проверял именно фоновое задание ? Или поделку под клиентом запускал ?
   foxslot
 
29 - 14.10.19 - 14:46
(25) в отладке отлавливал фоновое задание и проверял, + проверял когда вручную запускал: результат один, проходит по такому же пути по тем же условиям, получает такие же пути каталога, все одинаково что при фоновом, что при явном запуске
   foxslot
 
30 - 14.10.19 - 14:47
(25) давно уже туда запись добавил, по ней и получил текст с ошибкой
 
 Рекламное место пустует
   foxslot
 
31 - 14.10.19 - 14:48
(26) зачем это делать если я итак вижу что он не проваливается в это условие и я явно вижу что путь корректный?
   foxslot
 
32 - 14.10.19 - 14:49
(28) что за "подделка под клиентом"?
   Ёпрст
 
33 - 14.10.19 - 15:08
(31) там же написано - тест на вшивость
Вот так воткни еще

    СтрокаРезультата.ТабличныйДокумент.Вывод = ИспользованиеВывода.Разрешить
   Ёпрст
 
34 - 14.10.19 - 15:09
и.. тебе веры нет, раз код изначально содержит ошибку
   hhhh
 
35 - 14.10.19 - 15:59
(30) но точно есть права на запись у пользователя usr1cv8 к этой папке ....\usr1cv8\AppData\Local\Temp\ ?? Что-то сомнительно.
   RomanYS
 
36 - 14.10.19 - 16:39
(35) С чего вдруг собственный пользовательский темп должен быть не доступен?
   hhhh
 
37 - 14.10.19 - 16:45
(36) ну у меня было много раз в windows, особенно на Висте помню. Если жмакаешь на рабочем столе Мои документы, то всё доступно. А если последовально идешь C:\Document and settings\user\Мои документы, то хрен там.
   foxslot
 
38 - 14.10.19 - 17:35
(33) не помогло
(34) это говнокод программистов одной из известных франчей, и если бы эта ошибка воспроизводилась, то уж извини, я не до такой степени слепой чтобы не заметить что с путь/каталог дублируется, тем более я не один день уже сижу с этой проблемой. Моя задача сейчас найти причину ошибки, а не сидеть и анализировать чей то код, который даже не участвует в процессе выполнения программы
   foxslot
 
39 - 14.10.19 - 17:38
(35) при выполнении других похожих обработок в этой же базе файлы записываются туда, следовательно права есть. Просто почему при разных запусках (через фоновое или явный запуск) через одного пользователя результаты разные
   hhhh
 
40 - 14.10.19 - 17:50
(39) может быть несколько вариантов:

1. пишешь 2 файла под одним именем
2. пишешь один файл одновременно 2 раза
3. запускаешь одновременно 2 регзадания, которые пишут один и тот же файл. То есть одно регзадание не закончилось, а другое уже стартовало.
4. может архивируешь этот файл? тогда может быть файл еще не полностью записался, а архивирование началось.
5. может у тебя в windows этот файл открыт на чтение, или в акробате, кем-то занят, тогда 1с не может сохранить.
   hhhh
 
41 - 14.10.19 - 17:52
(39) да, еще может 2 базы. Например ты на тестовой смотришь, а в это же время регзадание запускается и на рабочей базе.
   foxslot
 
42 - 14.10.19 - 18:09
(40) Спасибо за направление, проверю по этим пунктам
   Ёпрст
 
43 - 14.10.19 - 18:14
(38) ну, тест на вшивость сделал с именем файла ?
Точно всё лишнее закоментил ?
   foxslot
 
44 - 15.10.19 - 09:22
(43) проделал, заодно проверил (12) как итог файлы записываются
https://imgur.com/a/OewhXJk

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

при этом запуская фоновое задание под тем же пользователем вручную все норм сохраняет, на тип сеанса чтоли какие то ограничения могут стоять?
   foxslot
 
45 - 15.10.19 - 09:24
еще предложили вариант создавать вместо КаталогВременныхФайлов() использовать ПолучитьИмяВременногоФайла() и в результате будет создаваться файл с расширением .tmp и тогда уже путь хранения будет выглядеть так "C:\Users\s-1cserviceuser\AppData\Local\Temp\v8_F58_129.tmp\Платежное поручение № 92376 от 10 октября 2019 г.pdf". Проверил, вроде как работает, но насколько это правильно и будут ли потом последствия в виде засора файлами или они будут нормально удалятся как временный файлы?
   Ёпрст
 
46 - 15.10.19 - 09:45
(44) ответ же очевиден, не ?

Не надо прибавлять каталог к каталогу в имени файла
   МимохожийОднако
 
47 - 15.10.19 - 10:13
(45) Если не уверен, что файл будет удалён, то удаляй принудительно через некоторое время.
   foxslot
 
48 - 15.10.19 - 10:42
(46) Да почему каталог к каталогу то?

вот это при запуске через фоновое задание, выдает ошибку
https://imgur.com/a/nAHcAiz

Текст ошибки:
Ошибка при вызове метода контекста (Записать)
        СтрокаРезультата.ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
по причине:
Ошибка при выполнении файловой операции  'C:\Users\s-1cserviceuser\AppData\Local\Temp\Платежное поручение № 31189 от 10 октября 2019 г.pdf'

вот при явном запуске, все нормально сохраняет
https://imgur.com/a/AtX3p3B

по информации из табло все видно что пути одинаковы и никакого каталога к каталогу нет и по наличию условию та ветка с получением имени временного файла никак не выполняется
   hhhh
 
49 - 15.10.19 - 10:57
(48) проверь, может ИмяФайла повторяется в следующей строчке СтрокаРезультата. Может один и тот же файл много раз записываешь.
   foxslot
 
50 - 15.10.19 - 14:18
(49) не, там принцип такой что в Результат по которому проходит цикл попадает массив печатных плат где каждой из соответствует один документ платежного поручения, и уникальность проверяется на уровне уникальности самого документа, а название собирается из номера и даты платежного документа, одинаковые платежки в массив не могут попасть. И опять таки там стоит проверка наличие файла по пути, по которому будет записан файл
   foxslot
 
51 - 15.10.19 - 14:18
(50) *массив печатных форм
   hhhh
 
52 - 15.10.19 - 14:28
(51) ну вот это
     Индекс = Результат.Индекс(СтрокаРезультата);
        ПП = масПлатежныеПоручения.Получить(Индекс);
        ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);


вообще непонятно

ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);

ПП - это элемент массива. То есть у вас масПлатежныеПоручения - там индексы хранятся? Зачем такая суперсложная структура?
   Ёпрст
 
53 - 15.10.19 - 14:35
(48) ну давай.. тест на вшивость №2 :

       ИмяФайлаБезРасширения = СокрЛП(СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП));

        Если Не ЗначениеЗаполнено(ИмяФайлаБезРасширения) Тогда

            ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
        Иначе

            ИмяФайла = КаталогВременныхФайлов()+ИмяФайлаБезРасширения + ".pdf";

       КонецЕсли;

      // ИмяФайла = КаталогВременныхФайлов() + ИмяФайла;


        СтрокаРезультата.ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);



Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.