Ошибка при вызове метода контекста execute произошла исключительная ситуация 0x80020005

Внеш.печ.форма в Word: ошибка при вызове метода контекста (Execute)
   листопад

02.05.14 — 23:52

При попытке сформировать внешнюю печ.фому в Word, выдает сообщение об ошибке и не формирует печ.форму:

{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(352)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (0x80020005)

Вот код:

Функция Печать() Экспорт

Выборка = СформироватьЗапросДляПечатиТрудовогоДоговора().Выбрать();

Если Выборка.Следующий() Тогда

    
    Запрос = Новый Запрос;

    Запрос.Текст =        

    «ВЫБРАТЬ

    |    ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета,

    |    ЛицевыеСчетаРаботниковОрганизации.Банк,

    |    ЛицевыеСчетаРаботниковОрганизации.Банк.ОсновнойБанковскийСчет.НомерСчета КАК ФЛБанкКСчет,

    |    ЛицевыеСчетаРаботниковОрганизации.Банк.ОсновнойБанковскийСчет.Банк.Код КАК ФЛБанкБИК

    |ИЗ

    |    РегистрСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации

    |ГДЕ

    |    ЛицевыеСчетаРаботниковОрганизации.ФизЛицо.Ссылка = &Ссылка»;

    
    Запрос.УстановитьПараметр(«Ссылка», СсылкаНаОбъект.Физлицо);

    
    Результат = Запрос.Выполнить().Выбрать();

    
    Если Результат.Следующий() Тогда

        Если Результат.НомерЛицевогоСчета <> Неопределено Тогда

            ФЛНомерЛС = Результат.НомерЛицевогоСчета;

            ФЛБанк = Результат.Банк;

            ФЛКСчет = Результат.ФЛБанкКСчет;

            ФЛБИК = Результат.ФЛБанкБИК;

        КонецЕсли;

    КонецЕсли;

    
    ш_ФЛНомерЛС = ФЛНомерЛС;

    ш_ФЛБанк = ФЛБанк;

    ш_ФЛКСчет = ФЛКСчет;

    ш_ФЛБИК = ФЛБИК;

КонецЕсли;

Макет = ПолучитьМакет(«МакетWord»);

MSWord = Макет.Получить();

Замена = Документ.Content.Find;

Замена.Wrap = 1;   //чтобы не писать каждый раз  Find

Замена.Execute(«ш_ФЛНомерЛС», , , , , , , , ,ш_ФЛНомерЛС,2);

Замена.Execute(«ш_ФЛБанк», , , , , , , , ,ш_ФЛБанк,2);

Замена.Execute(«ш_ФЛКСчет», , , , , , , , ,ш_ФЛКСчет,2);

Замена.Execute(«ш_ФЛБИК», , , , , , , , ,ш_ФЛБИК,2);

MSWord.Application.Visible=Истина;

MsWord.Activate();

Исключение

Сообщить(ОписаниеОшибки());

MSWord.Application.Quit();

КонецПопытки;

КонецФункции

   Torquader

1 — 02.05.14 — 23:55

Надо все поля функции передавать — там значения по умолчанию.

Просто, если не установлено, то 1С передаёт UNDEFINED, а Word этого понять не может.

   Torquader

2 — 02.05.14 — 23:55

И вообще — проще делать через поля — есть такие объекты, которые можно заполнять значениями, почти как в 1С.

   листопад

3 — 02.05.14 — 23:57

(1) Не поняла: какие поля еще надо передавать? У меня до вставки этого запроса по лицевым счетам все формировалось в Ворд.

   Torquader

4 — 02.05.14 — 23:58

(3) Ну, например, Банк — это ссылка — его сначала нужно преобразовать в строку, так как переданное значение банка Word точно не поймёт, и ошибка будет звучать «плохой тип переменной».

   листопад

5 — 03.05.14 — 00:00

Спотыкается на этой строчке:

Замена.Execute(«ш_ФЛБанк», , , , , , , , ,ш_ФЛБанк,2);

Может из-за того, что в РС»ЛицевыеСчетаРаботниковОрганизации», измерение «Банк» — это СправочникСсылка.Контрагенты?

   листопад

6 — 03.05.14 — 00:01

(4) Опять 25, как эту ссылку преобразовать в строку???

   Torquader

7 — 03.05.14 — 00:01

(5) Читаем (4) я тебе уже там сказал, где спотыкается, и что говорит.

Вместо

ФЛБанк = Результат.Банк;

Напиши

ФЛБанк = Строка(Результат.Банк);

Чудо случиться, только вот результат будет не такой, как ожидалось.

   ДенисЧ

8 — 03.05.14 — 00:01

У меня возникает подозрение, что листочек наш — далеко не из России… Причём настолько далеко, что у них рабочий день начинается, когда у нас заканчивается…

Прикинув МПХ к глобусу — ба… Да это ж Америка…

   Torquader

9 — 03.05.14 — 00:02

(8) Американский WoodSpeaker ?

   листопад

10 — 03.05.14 — 00:03

(8) С нерезиновой я, просто в другое время времени совсем нет, вот и работаю по ночам…

   ДенисЧ

11 — 03.05.14 — 00:04

(9) WoodSpeaker ? Говорящий с деревом? О_о

(10) И почему я не верю….

   листопад

12 — 03.05.14 — 00:06

(7) УРА! Чудо произошло!!! Все сформировалось как надо!!!

Torquader :*) !!!

   Torquader

13 — 03.05.14 — 00:07

(11) Другими словами «тук-тук по дереву» ^_^

   ДенисЧ

14 — 03.05.14 — 00:07

(13) бл….

Woody Woodpecker…

GN негодуе!

   Torquader

15 — 03.05.14 — 00:11

(14) Да я это уже понял — просто не очень я знаю их «заграничных».

   Torquader

16 — 03.05.14 — 00:13

Вообще, наверное, как только Листопад решает очередную задачу, обращаясь за помощью — с дерева падает один листок, и как только листики закончатся, то помощь — тоже.

   листопад

17 — 03.05.14 — 00:14

(13) Почему Вы ко мне так предвзято относитесь? У меня ведь ошибки не глобальные, а что-то в мелочах неправильно пишу. Я думаю, что с опытом это придет. А Вы меня постоянно с дятлом сравниваете. Меня, как девушку, это очень обижает…

  

Torquader

18 — 03.05.14 — 00:21

(17) Это сравнение — для вас — стимул — быть лучше и способнее — так что не переживайте, а учитесь быть лучше и умнее.

Трудовой договор

Для большенства организаций стандартная печатная форма трудового договора в программе 1С:Зарплата и управление персоналом не подходит. Фирма 1С, в восьмой версии своей программы, любезно предусмотрела возможность добавлять дополнительные печатные формы для документов и других объектов. Воспользуемся данной возможностью и создадим трудовой договор, который будет открываться в Microsoft Word.

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

Сведения о подключенных обработках хранятся в справочнике «Внешние обработки». Чтобы подключить новую внешнюю обработку, нужно зарегистрировать ее в указанном справочнике.

Технические требования к внешней печатной форме

Внешняя обработка должна содержать:

  • Реквизит «СсылкаНаОбъект», куда при вызове будет передана ссылка на объект, для которого необходимо выполнить печать;
  • Необязательный реквизит «ДополнительныеПараметры» произвольного типа, которому будут передаваться дополнительные параметры примитивного типа в виде структуры;
  • Функция Печать() — без параметров,  возвращающая табличный документ;
  • Также внешняя печатная обработка может иметь в своем составе макет «Параметры_Авторегистрации», используемый для автоматического заполнения принадлежности печатной формы в справочнике «Внешние обработки» и состоящий из двух колонок: «Полное имя метаданного» и «Имя табличной части».

Создание внешней обработки

Запустим 1С:Предприятие в режиме «Конфигуратор» и через меню «Файл» — «Новый» создадим внешнюю обработку.

Создание внешней обработки

Создадим реквизит «СсылкаНаОбъект». Для этого нажимем кнопку «Добавить» или клавишу «Insert» и заполним свойства. В зависимости от того, для каких объектов будет использоваться эта печатная форма, нужно выбрать тип. В нашем случае, внешняя печатная форма будет использоваться только для справочника «Сотрудники организации», поэтому укажем соответствующий тип «СправочникСсылка.СотрудникиОрганизаций».

Свойства реквизита

Реквизит «ДополнительныеПараметры» нам не понадобится. Создадим экспортную функцию Печать() («Действия» — «Открыть модуль объекта»).

 Функция Печать()

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

Макет трудового договора в формате Microsoft Word

Существует, по меньшей мере, три способа создания шаблона.

Первый. В тексте документа содаются метки особого формата, например, «м_НомерДоговора», затем, в модуле обработки производится поиск и замена значений.

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

Способ три. В шаблон добавляются служебные поля, например, «DocVariable» или «Author». Используя DocVariable можно обращаться к переменной по имени, например, «ДокументВорд.Variables.Add(ИмяПеременной, ЗначениеПеременной);», но ее не видно в шаблоне. Поле «Author» отображается в шаблоне, но обращаться к нему придется в цикле по индексу: «ДокументВорд.Fields.item(Индекс).Result.Text = Значение;».

На мой взгляд, первый способ является самым оптимальным. Шаблон документа легко редактируется, метки видны в тексте, для создания меток не нужны сложные вставки. Поэтому будем делать шаблон именно этим способом.

Откроем программу Microsoft Office. Для примера добавим лишь одну строку: «Трудовой договор № [НомерДоговора]».

Сохраним шаблон.

Добавим получившийся шаблон в нашу обаботку. Для этого выбираем «Макеты» и нажимаем кнопку «Добавить» или клавишу «Insert».

Выбор макета трудового договора

Откроется конструктор запроса, в котором выберем тип «Active Document» и файл шаблона.

Конструктор макета Active Document

Функция Печать()

Вернемся к функции, которую мы создали ранее. Настало время написать ее тело.

// Предопределенная функция для внешних печатных форм
//
Функция Печать() Экспорт// Получим объект Microsoft Word из макета
   
ОбъектВорд = ПолучитьМакет(«ТрудовойДоговор»).Получить();// Получим документ из объекта и активируем его
   
Документ = ОбъектВорд.Application.Documents(1);
   
Документ.Activate();// Поиск и замена маркеров
   
Замена = Документ.Content.Find;
   
Замена.Execute(«[НомерДоговора]», , , , , , , , , «007», 2);// Вывод документа
   
ОбъектВорд.Application.Visible = Истина;
   
ОбъектВорд.Activate();

КонецФункции

// Печать()

Из кода видно, что в файле шаблона производится поиск строки «[НомерДоговора]» и ее замена на строку «007».

Параметры авторегистрации

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

Параметры авторегистрации

Сохраним получившуюся внешнюю обработку.

Подключение дополнительных внешних печатных форм

Запустим 1С Предприятие. Откроем справочник «Дополнительные внешние печатные формы» через меню «Сервис» — «Дополнительные отчеты и обработки».

Нажмем кнопку «Добавить», затем зарегистрируем новую печатную форму, нажав «Заменить файл внешней обработки». Автоматически заполнится принадлежность печатной формы справочнику «Сотрудники». Выберем «Трудовой договор» в колонке «Заменяемая печатная форма» чтобы стандартная печатная форма более не использовалась.

Регистрация внешней печатной формы

В итоге справочник будет выглядить следующим образом.

Дополнительные внешние печатные формы

Проверка результата

Откроем любого работающего сотрудника и нажмем кнопку «Печать» — «Трудовой договор». Откроется документ Microsoft Word с трудовым договором под номером «007».

Трудовой договор в MS Word

Дальнейшее описывать не имет смысла. Думаю, не составит большого труда доработать функцию Печать() и макет договора.

Содержание

  1. Nicholas Mikuslas
  2. You are here
  3. Трудовой договор в формате MS Word
  4. Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
  5. Оптимизация пакетной печати из 1С в MS Word

Nicholas Mikuslas

You are here

Трудовой договор в формате MS Word

Для большенства организаций стандартная печатная форма трудового договора в программе 1С:Зарплата и управление персоналом не подходит. Фирма 1С, в восьмой версии своей программы, любезно предусмотрела возможность добавлять дополнительные печатные формы для документов и других объектов. Воспользуемся данной возможностью и создадим трудовой договор, который будет открываться в Microsoft Word.

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

Сведения о подключенных обработках хранятся в справочнике «Внешние обработки». Чтобы подключить новую внешнюю обработку, нужно зарегистрировать ее в указанном справочнике.

Технические требования к внешней печатной форме

Внешняя обработка должна содержать:

  • Реквизит «СсылкаНаОбъект», куда при вызове будет передана ссылка на объект, для которого необходимо выполнить печать;
  • Необязательный реквизит «ДополнительныеПараметры» произвольного типа, которому будут передаваться дополнительные параметры примитивного типа в виде структуры;
  • Функция Печать() — без параметров, возвращающая табличный документ;

Также внешняя печатная обработка может иметь в своем составе макет «Параметры_Авторегистрации», используемый для автоматического заполнения принадлежности печатной формы в справочнике «Внешние обработки» и состоящий из двух колонок: «Полное имя метаданного» и «Имя табличной части».

Создание внешней обработки

Запустим 1С:Предприятие в режиме «Конфигуратор» и через меню «Файл» — «Новый» создадим внешнюю обработку.

Создадим реквизит «СсылкаНаОбъект». Для этого нажимем кнопку «Добавить» или клавишу «Insert» и заполним свойства. В зависимости от того, для каких объектов будет использоваться эта печатная форма, нужно выбрать тип. В нашем случае, внешняя печатная форма будет использоваться только для справочника «Сотрудники организации», поэтому укажем соответствующий тип «СправочникСсылка.СотрудникиОрганизаций».

Реквизит «ДополнительныеПараметры» нам не понадобится. Создадим экспортную функцию Печать() («Действия» — «Открыть модуль объекта»).

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

Макет трудового договора в формате Microsoft Word

Существует, по меньшей мере, три способа создания шаблона.

Первый. В тексте документа содаются метки особого формата, например, «м_НомерДоговора», затем, в модуле обработки производится поиск и замена значений.

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

Способ три. В шаблон добавляются служебные поля, например, «DocVariable» или «Author». Используя DocVariable можно обращаться к переменной по имени, например, «ДокументВорд.Variables.Add(ИмяПеременной, ЗначениеПеременной);», но ее не видно в шаблоне. Поле «Author» отображается в шаблоне, но обращаться к нему придется в цикле по индексу: «ДокументВорд.Fields.item(Индекс).Result.Text = Значение;».

На мой взгляд, первый способ является самым оптимальным. Шаблон документа легко редактируется, метки видны в тексте, для создания меток не нужны сложные вставки. Поэтому будем делать шаблон именно этим способом.

Откроем программу Microsoft Office. Для примера добавим лишь одну строку: «Трудовой договор № [НомерДоговора]».

Добавим получившийся шаблон в нашу обаботку. Для этого выбираем «Макеты» и нажимаем кнопку «Добавить» или клавишу «Insert».

Откроется конструктор запроса, в котором выберем тип «Active Document» и файл шаблона.

Функция Печать()

Вернемся к функции, которую мы создали ранее. Настало время написать ее тело.

// Предопределенная функция для внешних печатных форм
//
Функция Печать () Экспорт

// Получим объект Microsoft Word из макета
ОбъектВорд = ПолучитьМакет ( «ТрудовойДоговор» ). Получить ();

// Получим документ из объекта и активируем его
Документ = ОбъектВорд . Application . Documents ( 1 );
Документ . Activate ();

// Поиск и замена маркеров
Замена = Документ . Content . Find ;
Замена . Execute ( «[НомерДоговора]» , , , , , , , , , «007» , 2 );

// Вывод документа
ОбъектВорд . Application . Visible = Истина;
ОбъектВорд . Activate ();

Из кода видно, что в файле шаблона производится поиск строки «[НомерДоговора]» и ее замена на строку «007».

Параметры авторегистрации

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

Сохраним получившуюся внешнюю обработку.

Подключение дополнительных внешних печатных форм

Запустим 1С Предприятие. Откроем справочник «Дополнительные внешние печатные формы» через меню «Сервис» — «Дополнительные отчеты и обработки».

Нажмем кнопку «Добавить», затем зарегистрируем новую печатную форму, нажав «Заменить файл внешней обработки». Автоматически заполнится принадлежность печатной формы справочнику «Сотрудники». Выберем «Трудовой договор» в колонке «Заменяемая печатная форма» чтобы стандартная печатная форма более не использовалась.

В итоге справочник будет выглядить следующим образом.

Проверка результата

Откроем любого работающего сотрудника и нажмем кнопку «Печать» — «Трудовой договор». Откроется документ Microsoft Word с трудовым договором под номером «007».

Дальнейшее описывать не имет смысла. Думаю, не составит большого труда доработать функцию Печать() и макет договора.

Источник

Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download

Оптимизация пакетной печати из 1С в MS Word

Однажды появилась задача ускорить печать из 1С в документы MS Office Word. Формирование документов происходит около 60-90 секунд.

Программы: «1С:Зарплата и управление персоналом, редакция 3.1.14.98», MS Office Word 2016.

Много ранее я работал с печатью в MS Word, и проблем с производительностью не возникало, но и шаблон был всего один, и заполнение каждого параметра было прописано кодом, и БСП не использовалось.

В данном же случае: внешняя обработка печатает 3 шаблона, вызывается функция БСП для каждого шаблона; соответственно, параметры заполняются в функции БСП.

Я запустил замер производительности конфигуратором, чтобы посмотреть, какие именно строки занимают более всего времени.

В топе находятся строки кода, которые работают с шаблоном MS Word через COM-соединение. Суммарно первые строки занимают время: 20+14+12+6+6+6 = 64 секунды — это почти 60% времени. Если удастся сократить это время хотя бы на половину, но эффект уже будет заметен.

Разбираем каждую строку.

Строка №1.

Первая строка (Object.Select();) выполняется 219 раз — это достаточно много. Возникает вопрос: почему так много раз она выполняется? Может, в шаблонах так много параметров? Суммарно в шаблонах оказалось 95 параметров. Смотрим стек вызовов и находим причину столь частого выполнения кода.

На уровень раньше видим цикл.

Значит, в переменную ДанныеОбъекта передается излишне больше параметров, чем на самом деле необходимо.

Смотрим, откуда передается столько параметров, т.е. еще на уровень раньше.

Переменная Данные передана, поэтому переходим еще на уровень раньше.

Снова передача переменной Данные, поэтому снова переходим на уровень раньше.

Это процедура ПечатьМакета. В данном случае то, что передавалось в предыдущих переменных Данные — это значение переменной лПараметры (тип Соответствие), которое заполняется запросом, но заполняется всевозможными данными, нужными и ненужными, после чего вызывается процедура БСП.

Первая неоптимальность найдена — передача в процедуру БСП заранее лишнего количества параметров. Решить данную ситуацию можно просто: передать только необходимое количество параметров, которые используются в шаблоне.

Далее если вернуться еще на уровень раньше, то видим самое начало — процедура Печать.

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

Решено так: отдельная процедура заполняет только нужные параметры, ничего лишнего.

Немного про особенность замены.

На сайтах предлагается следующий вариант замены:

Однако этот способ показал свою нестабильность следующим образом:

Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (0x80020005)

И более никакой информации, никаких подробностей; в интернете искать можно долго и безрезультатно; исследовать можно тоже долго и безрезультатно.

Поэтому замена выполнена типовой процедурой.

Перейдем ко второй топовой времязатратной строке замера:

Смотрим, в каком именно месте она вызывается.

Вызывается эта строка 69 раз в типовой функции ПолучитьМакетMSWord, получающей макет MSWord. Так как шаблон MS Word сохранен в макете с уже заранее настроенными параметрами, то в данном случае вызываемая строка просто лишняя. Исключая данную строку, функционал остается прежним и сокращается время формирования на 14 секунд.

Теперь рассмотрим третью времязатратную строку:

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

Смотрим, в каком именно месте она вызывается.

Объект COM создается три раза в той же типовой функции ПолучитьМакетMSWord.

Однако COM объект MS Word способен работать с несколькими документами MS Word, поэтому в данном случае создаются лишние COM объекты, на которые затрачивается время.

Решение: создание только одного COM объекта, с помощью которого заполняются все три шаблона. Решена эта ситуация кешированием COM соединения следующим образом.

Четвертая строка аналогична третьей:

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

Но вызывается данная строка в типовой функции ИнициализироватьПечатнуюФормуMSWord тоже три раза.

Возникает вопрос: если в типовой функции ПолучитьМакетMSWord уже создан COM объект, то почему же вызывается типовая функция ИнициализироватьПечатнуюФормуMSWord , в которой тоже создается COM объект?

По стеку вызовов находим процедуру, в которой вызывается функция ИнициализироватьПечатнуюФормуMSWord , и попадаем в о внешнюю обработку .

По коду видно, похоже, была попытка обойтись средствами БСП, пренебрегая производительностью, так как вызваны две функции, создающие COM объект, и обе функции в цикле.

В данном случае функцию ИнициализироватьПечатнуюФормуMSWord можно исключить, используя только переменную Макет.

Рассмотрим пятую времязатратную строку.

Строка вызывается три раза в типовой функции ПолучитьПозициюНачалаОбласти перед непосредственным поиском и заменой.

Так как достаточно использовать типовую процедуру Заменить, которая выполняет замену параметров по всему документу, то функцию ПолучитьПозициюНачалаОбласти можно исключить.

После оптимизации кода получаем следующий замер.

Результат оптимизации — всего 14-16 секунд вместо 90.

Во вложении к публикации обработки до и после оптимизации.

  1. Нельзя сразу использовать функции БСП. Это влияет на производительность. Нужно смотреть функцию БСП и предусматривать влияние при ее использовании.
  2. Функции БСП содержат код, который может быть лишним при решении конкретной задачи, в результате лишний код влияет на производительность.

Источник

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода подписи сзв тд пфр
  • Ошибка при вызове метода контекста connect произошла исключительная ситуация v83 comconnector 1
  • Ошибка при вызове метода подписи на сайте пфр
  • Ошибка при вызове метода контекста connect неизвестная ошибка
  • Ошибка при вызове метода подписи crypto de