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


//часть кода
Для Каждого СтрокаРезультата Из Результат Цикл
        Индекс = Результат.Индекс(СтрокаРезультата);
        ПП = масПлатежныеПоручения.Получить(Индекс);
        ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);
        Если Не ЗначениеЗаполнено(ИмяФайлаБезРасширения) Тогда
            ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
        Иначе
            ИмяФайла = ИмяФайлаБезРасширения + ".pdf";
        КонецЕсли;
        ИмяФайла = КаталогВременныхФайлов() + ИмяФайла;
        СтрокаРезультата.ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
        Вложения.Добавить(ИмяФайла);
КонецЦикла;
//
14 foxslot
 
14.10.19
14:25
(10) а вот насчет прав не знаю как проверить, просто есть процедуры которые нормально сохраняют и записывают файлы, соответственно не должно быть проблем, но вот думаю может какие то ограничения можно поставить даже если права на эту папку есть
15 Ёпрст
 
14.10.19
14:26
(13) неа он у тебя берется отсюда
ИмяФайлаБезРасширения = СтрокаРезультата.ИмяФайлаПечатнойФормы.Получить(ПП);
  вот его и запиши в ЖР
16 foxslot
 
14.10.19
14:27
(11) Запускается одна и та же процедура, просто при выполнении фоновым заданием, вылетает ошибка, при ручном запуске (путем изменения записи в регистре чтобы вызвать подписку на событие) все нормально сохраняется. Все это проделывается по одним пользователем с полными правами
17 Ёпрст
 
14.10.19
14:28
Ну и ошибка вот в чем:
ты к каталогу еще каталог прибавляешь, ибо ПолучитьИмяВременногоФайла УЖЕ возвращает имя с каталогом
18 foxslot
 
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
ясен пень, такого пути нет - ошибка
21 Euguln
 
14.10.19
14:36
Может уже существует такой файл?
А не в pdf сохраняется?
22 foxslot
 
14.10.19
14:37
(17) ПолучитьИмяВременногоФайла("pdf") не выполнится так как ИмяФайлаБезРасширения возвращается заполненным и соответсвенно в тот блок не провавливается.
23 Ёпрст
 
14.10.19
14:38
(22) с чего такая уверенность ?
24 foxslot
 
14.10.19
14:39
(23) в отладке проверял
25 Ёпрст
 
14.10.19
14:39
ты это где увидел, что в эту ветку не заходит ? В отладке фонового задания, или где ?
Для проверки, запиши имя файла в журнал регистрации, запусти фоновое и посмотри глазками, если лень запущать отладку фоновых заданий
26 Ёпрст
 
14.10.19
14:40
ну или тупо, тест на вшивость:


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

Вот так воткни еще

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

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

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

при этом запуская фоновое задание под тем же пользователем вручную все норм сохраняет, на тип сеанса чтоли какие то ограничения могут стоять?
45 foxslot
 
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) Если не уверен, что файл будет удалён, то удаляй принудительно через некоторое время.
48 foxslot
 
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

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

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


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

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

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


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

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

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

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

       КонецЕсли;

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

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