8.х Как боротся с ошибкой совместного доступа при работе с документом word

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bkmz, 13 апр 2017.

  1. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Есть внешняя обработка которая заполняет шаблоны word и потом крепит эти шаблоны к письмам.
    На первый взгляд все работает. Но иногда выскакивает ошибка при попытке прикрепить файл:

    Ошибка: {ВнешняяОбработка.ОтправитьПисьмаКлиентамПоОплате.Форма.Форма.Форма(189)}: Ошибка при вызове метода контекста (Добавить): Ошибка совместного доступа к файлу 'E:\ЭР\Яковенко\Извещение по платежам.doc'

    Как это можно вылечить?

    Шаблон заполняю вот так:

    Код:
    Шаблон = Новый COMОбъект("Word.Application");
    Шаблон.Documents.Open(ИмяФайлаПолное);
    Шаблон.Application.Documents(1).Content.Find.Execute("{Контрагент}",,,,,,,,, Строка(Строка.Партнеры), 2);
    //Перемещаемся до строки в таблице
    Шаблон.Application.Selection.MoveDown(,8);       
    //Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена
    Шаблон.Application.Selection.SelectRow();
    Шаблон.Application.Selection.Copy();
    СуммаЗадолжености = 0;
    Для каждого Стр Из Этаформа.ДолжникиТЗ Цикл
        //Берем данные только для определенного партнера
        Если Стр.Партнеры = Строка.Партнеры И Стр.ТипОповещения = "Извещение по платежам" И Стр.КрайняяДатаОплаты = Строка.КрайняяДатаОплаты И Стр.ОтправитьУведомление Тогда
            //Формируем общую сумму
            СуммаЗадолжености = СуммаЗадолжености + Стр.СуммаСчета;
            //Заменяем значения
            Шаблон.Application.Selection.Find.Execute("{НомерСчета}" ,,,,,,,,,Стр.Счет, 2);
            Шаблон.Application.Selection.Find.Execute("{ДатаПоставки}" ,,,,,,,,,Стр.ДатаПоставки, 2);
            Шаблон.Application.Selection.Find.Execute("{КрайняяДата}" ,,,,,,,,,Стр.КрайняяДатаОплаты, 2);
            Шаблон.Application.Selection.Find.Execute("{СтоимостьТоваров}" ,,,,,,,,,Стр.СуммаСчета, 2);
            Шаблон.Application.Selection.Find.Execute("{Договор}" ,,,,,,,,,Стр.Договор, 2);
            //Перемещаемся вниз, вставляем из буфера обмена строку
            Шаблон.Application.Selection.MoveDown();
            Шаблон.Application.Selection.Paste();
            //Перемещаемся вверх и выделяем строку для замены значений
            Шаблон.Application.Selection.MoveUp();
            Шаблон.Application.Selection.SelectRow();
        КонецЕсли;
    КонецЦикла;
    //Вырезаем лишнюю строку
    Шаблон.Application.Selection.Cut();
    Шаблон.Application.Documents(1).Content.Find.Execute("{Сумма}",,,,,,,,, СуммаЗадолжености, 2);
    Шаблон.Application.Documents(ИмяФайлаПолное).Save();
    //Закрывам чтобы присоединения файла к письму не вызвало ошибку разделенного доступа
    Шаблон.Application.Quit(0);
    
  2. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Разве эта ошибка не говорит, что файл уже открыт и используется ком-то?
  3. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Кроме меня его никто не может открыть. Я же открываю кодом заполняю и закрываю:

    Код:
    Шаблон.Application.Documents(ИмяФайлаПолное).Save();
    //Закрывам чтобы присоединения файла к письму не вызвало ошибку разделенного доступа
    Шаблон.Application.Quit(0);
    но оно то закроется то не закроется.
  4. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Эм... погоди, а ты как прикрепляешь шаблон? программно?
  5. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Да.

    Код:
    Если ЗначениеЗаполнено(ЭтаФорма.УчетнаяЗапись) Тогда
            СоединениеПочта = ОтправкаПочтовыхСообщений.УстановитьСоединениеССервером(УчетнаяЗапись);
            Сообщение  = Новый ИнтернетПочтовоеСообщение;
            Сообщение.Отправитель  = "gjxnf84@mail.ru";
            Сообщение.ИмяОтправителя   = Отправитель;
            Сообщение.Тема  = "Уведомление о задолженности";
            ПочтовыеАдреса  = Сообщение.Получатели;
            ПочтовыйАдреса   = ПочтовыеАдреса.Добавить();
            ПочтовыйАдреса.Адрес  = ПочтовыйАдрес;
            ИнтернетТекстПочтовогоСообщения  = Сообщение.Тексты.Добавить();
            ИнтернетТекстПочтовогоСообщения.Текст = "Текст сообщения";
            ИнтернетТекстПочтовогоСообщения.ТипТекста   = ТипТекстаПочтовогоСообщения.ПростойТекст;   
            Сообщение.Вложения.Добавить(ИмяФайлаПолное);
            Попытка
                СоединениеПочта.Послать(Сообщение);
            Исключение
                Сообщить("Ошибка " + ОписаниеОшибки());
                Возврат;
            КонецПопытки;
            СоединениеПочта.Отключиться();
        КонецЕсли;
  6. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Вылетает здесь?
    Код:
    Сообщение.Вложения.Добавить(ИмяФайлаПолное);
  7. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
  8. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.807
    Симпатии:
    496
    Баллы:
    104
    Работал с Вордом из 1с. Сеансы постоянно виснут. Приходится через диспетчер удалять. Может в этом прикол.
    1с-ник нравится это.
  9. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Да, у меня тоже такое было. Глянь в диспетчере, может висит)
  10. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Нет. Сеансы не в диспетчере не висят. было дело. Тоже удалял сначала.
    --- Объединение сообщений, 13 апр 2017 ---
    Получалось так потому что дважды создавал ком объект. А выходил только раз.

    Код:
    Попытка
            Шаблон = Новый COMОбъект("Word.Application");
        Исключение
            Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС +
             "Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание);
    КонецПопытки;
    ......
    Если .... Тогда
        Шаблон = Новый COMОбъект("Word.Application");
        Шаблон.Documents.Open(ИмяФайлаПолное);
        .....
        Шаблон.Application.Documents(ИмяФайлаПолное).Save();
        Шаблон.Application.Quit(0);
    КонецЕсли
    
    В условии закрывалось приложение а вот после проверки висели. Сейчас исправил. Висяков нет. Но и не решилась полностью проблема.
    Последнее редактирование: 13 апр 2017
  11. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.807
    Симпатии:
    496
    Баллы:
    104
    Вы походу не поняли. Даже если эта строка одна
    Код:
    Шаблон = Новый COMОбъект("Word.Application");
    И потом вы закрываете соединение, типа
    Код:
    Шаблон.Application.Quit(0);
    То, иногда, я не знаю почему, сеанс все равно висит. Причем это не просто сеанс, а он именно использует ранее используемый файл.
  12. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Может я действительно не правильно понял. Я смотрю тут:

    [​IMG]
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    а теперь нажми на "Отображать процессы всех пользователей" и удивись :)
  14. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Я бы удивился, да вот только прав нет на нажатие этой кнопки.
    --- Объединение сообщений, 13 апр 2017 ---
    А кто еще может помимо меня использовать файл?
  15. bajiepka
    Offline

    bajiepka Профессионал в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    443
    Симпатии:
    30
    Баллы:
    54
    А в сторону работы не через COM смотрели? В xslx, docx же можно "вскрыть" содержимое, отпарисить xml-ку и перезаписать содержимое в отдельное место... (на счёт ворда не уверен, но для экселя делал такое)
  16. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Я по другому не умею. И не хочется все делать заново
  17. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Скажем так: способ несколько через Ж и не факт, что будет работать всегда :)
  18. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Код:
    Скажем так: способ несколько через Ж и не факт, что будет работать всегда :)
    Это мой или предлагаемый?
  19. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Тот который, не через COM.
  20. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    404
    Симпатии:
    11
    Баллы:
    29
    Ничего не зависало. Тупо не успевало закрывать приложение.
    Поставил вот такой кодик перед добавлением вложения в почту:
    Код:
    ВремяОкончания = ТекущаяДата() + 1;
    Пока ТекущаяДата() <= ВремяОкончания Цикл   
    КонецЦикла;
    
    И ошибка совместного доступа пропала. Правда на форумах пишут что это убийство для процессора такие кодики. Есть какая-то альтернатива?

Поделиться этой страницей