Как предотвратить возникновение ошибки при одновременном обращении пользователя и обработки к Excel.

Если открыт (или открыть) файл Excel (к которому будет обращаться обработка), и активировать  какую-либо ячейку или любое диалоговое окно  и при этом обработка обратится к этому файлу, то возникнет ошибка. Так же, ошибка может возникнуть, если обработка запустила один экземпляр Excel, если пользователь, во время работы обработки откроет другой файл Excel или тот, к которому обращается обработка, то этот файл откроется в том же экземпляре приложения Excel и тогда опять возможна ошибка.  Как этого избежать?

Для этого достаточно для свойства «Interactive» установить значение Ложь. Это запретит пользователю что-либо делать в запущенном экземпляре приложения. Чтобы приложение во время работы не задавало каких-либо «глупых» вопросов, то для этого достаточно свойству «DisplayAlerts»  установить значение «Ложь».

                               Excel = Новый COMОбъект(«Excel.Application»);

                               Excel.Interactive = Ложь;

                               Excel.DisplayAlerts = Ложь;

После окончания, не забудьте установить значение «Истина»  обоим свойствам.

                               Excel.Interactive = Истина;

                               Excel.DisplayAlerts = Истина;

Иначе, если пользователь успеет открыть какой-либо файл именно в этом экземпляре Excel, то открытые файлы будут недоступны как для редактирования, так и для закрытия. Придётся «убивать» процесс через диспетчер задач.

12 Comments

  1. krunm

    то что нужно

    Reply
  2. koka

    Полезная информация.

    А не знаете, есть ли для WORDa свойство, аналогичное Interactive ?

    Reply
  3. akor77

    (2) koka, с WORDом работать не приходилось.

    Reply
  4. BorisBelov

    К сожалению не во всех конфигурациях 1С есть «Истина» и «Ложь»…

    Reply
  5. akor77

    (4) BorisBelov, не совсем понятна проблема, приведите пример.

    Reply
  6. andogskiy

    (5) видимо речь идёт о «семёрке». Там же нет типа Булево.

    Reply
  7. andogskiy

    (4) BorisBelov, вместо «Истина» и «Ложь» можно использовать 1 и 0 соответственно.

    Reply
  8. akor77

    (4) BorisBelov, В Excel можно присвоить булевой переменной числами. Если не ошибаюсь, то ноль — Ложь, а любое другое значение будет Истиной. Поэксперементируйте с «-1», «0», «1».

    Reply
  9. chizik05

    к сожалению, совет не работает при использовании функции ПоместитьФайл().

    До создания Com объекта дело не доходит, ругается при вызове указанной функции.

    Reply
  10. SAS99

    «при одновременном обращении пользователя и обработки к Excel» — что имеется ввиду под «обращением»?. Если я правильно понял, речь в статье идет о чтении данных из файла Excel? А если обращение производится для записи данных в файл?

    Reply
  11. akor77

    (10) SAS99, Как правило, при выгрузке данных в Excel создаётся новый экземпляр и книга Excel. Здесь проблем не возникнет. Но если попытаься открыть уже открытую книгу в другом экземпляре, то тут очевидна ошибка. Вот код проверки:

        // Проверка: Занят ли файл другим процессом?
    objFSO = Новый COMОбъект(«Scripting.FileSystemObject»);
    Попытка
    objFSO.MoveFile(ФайлEXCEL, ФайлEXCEL);
    objFile = objFSO.GetFile(ФайлEXCEL);
    Исключение
    objFile = Неопределено;
    objFSO = Неопределено;
    Сообщить(«Ошибка открытия файла/Файл занят другой программой:
    |» + ФайлEXCEL);
    Возврат Неопределено;
    КонецПопытки;
    objFSO = Неопределено;

    Показать

    Код отсюда http://infostart.ru/public/225624/

    Reply
  12. Sardukar

    Я при тестировании одного механизма загрузки столкнулся с тем, что DisplayAlerts лучше в Ложь не переводить, а то получается ситуация, когда юзера не уведомляет, что файл возможно открыть только на чтение, файл открывается вроде как в режиме редактирования и при этом зависает, а 1С вываливает неизвестную ошибку. А если DisplayAlerts не трогать, то все в норм. Юзер открывает файл только на чтение и 1С это не мешает продолжать загрузку.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *