Узнать, что файл открыт в другой программе

1. starjevschik 31.10.21 19:58 Сейчас в теме
Обычные формы УТ 10.3. Некая печатная форма документа записывается в ПДФ. Вот таким путем:
Пакет = Новый ПакетОтображаемыхДокументов;
блаблабла
Пакет.ЗаписатьФайлДляПечати(имяФайла);

Все отлично работает, но. Если этот файл существует и открыт (Акробатом как обычно), то 1с пишет ошибку "Невозможно получить доступ к файлу, файл уже открыт" и закрывается (1с) полностью, предлагает варианты "Закрыть" и "Перезапустить". Оставить ее работающей дальше не получается.
Пользователи делают обычно так: записывают ПДФ, открывают, видят, что накосячили, исправляют в 1с и записывают ПДФ. И 1с ломается со всей их текущей деятельностью. Не все этому рады.
Теперь внимание, вопрос. Как узнать, что этот файл открыт другой программой?
По теме из базы знаний
Найденные решения
7. shurikvz 31.10.21 21:59 Сейчас в теме
Ну вообще конечно как выше сказали - Попытка-Исключение должно обрабатывать подобные ситуации.

Если вылетает - попробуй например проконтролировать через файловый поток (с уровнем доступа на запись) в попытке.
Ну что-то вроде

Успешно = Истина;
Поток = Неопределено;
Попытка
поток = Новый ФайловыйПоток(имяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.ЧтениеИЗапись);
Если НЕ (Поток.ДоступнаЗапись И Поток.ДоступноЧтение) Тогда
Успешно = ложь;
КонецЕсли;
поток.Закрыть();
Исключение
...файл занят..
Успешно = ложь;
КонецПопытки
Поток = Неопределено;
Показать
PlatonStepan; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 31.10.21 20:12 Сейчас в теме
3. meriferi 31.10.21 20:24 Сейчас в теме
Попытка
....
Исключение
Сообщить(...)
КонецПопытки
4. starjevschik 31.10.21 20:59 Сейчас в теме
(2)(3) попытка не доходит до исключения, вылетает с той же ошибкой на строке с записью.
Нужен какой-то работающий способ о)
5. FatPanzer 31.10.21 21:07 Сейчас в теме
(4) Ну... Тогда каждый раз формировать уникальное имя файла. Но тогда встанет вопрос - что делать с ранее сохраненными файлами...
6. PlatonStepan 38 31.10.21 21:55 Сейчас в теме
Попробуйте файл проверить на существование (объект 1с "Файл"), потом проверить его переименование (метод 1с "ПереместитьФайл()").
Если ещё валится, то на крайняк каким-либо внешним скриптом/программой проверять вышеуказанные действия.
В винде это vbs/cmd/bat с соответствующими командами. в линуксе не знаю
7. shurikvz 31.10.21 21:59 Сейчас в теме
Ну вообще конечно как выше сказали - Попытка-Исключение должно обрабатывать подобные ситуации.

Если вылетает - попробуй например проконтролировать через файловый поток (с уровнем доступа на запись) в попытке.
Ну что-то вроде

Успешно = Истина;
Поток = Неопределено;
Попытка
поток = Новый ФайловыйПоток(имяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.ЧтениеИЗапись);
Если НЕ (Поток.ДоступнаЗапись И Поток.ДоступноЧтение) Тогда
Успешно = ложь;
КонецЕсли;
поток.Закрыть();
Исключение
...файл занят..
Успешно = ложь;
КонецПопытки
Поток = Неопределено;
Показать
PlatonStepan; +1 Ответить
8. starjevschik 01.11.21 09:23 Сейчас в теме
(7) круто, спасибо! Работает )
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот