Ошибка при вызове метода контекста 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) Это сравнение — для вас — стимул — быть лучше и способнее — так что не переживайте, а учитесь быть лучше и умнее.

  

листопад

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. Функции БСП содержат код, который может быть лишним при решении конкретной задачи, в результате лишний код влияет на производительность.

Источник

galimovmaks
19.08.2013 11:51 Прочитано: 6749

пытаюсь создать печатную форму документа Word выдеат ошибку
Ошибка при вызове метода контекста (Execute)
Заменить.Execute(«пКонтрагент», Ложь, Истина, Ложь, , , Истина, , Ложь, Выборка.Контрагент);
по причине:
Произошла исключительная ситуация (0x80020005)

подскажите в чем дело?

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
19.08.2013 14:54 Ответ № 1

(0) galimovmaks, код покажи, и какой windows и какой Office?

ivan232
19.08.2013 20:43 Ответ № 2

Попробуй:
Заменить.Execute(«пКонтрагент», Ложь, Истина, Ложь, , , Истина, , Ложь, Выборка.Контрагент.Наименование);
Должно сработать — у меня так же было)

Подсказка: Вы можете добавить любую страничку в Избранное щелкнув по значку

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

Для большенства организаций стандартная печатная форма трудового договора в программе 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

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

Выкидывает ошибку : Произошла исключительная ситуация (ADODB.Recordset): Operation is not allowed when the object is closed. Понятно что ошибка в НаборЗаписей.Close;Я так понял что надо еще что то close…..ХЕЛП…

Со скулом не кто не дружит?!

Вроде бы все русским языком написано: «Operation is not allowed when the object is closed». Что непонятного-то?

ну не прям русским языком,это понятно что Close не сработало,вот хочу узнать что я пропустил

для тебе учить сиквел не надо, достаточно отладчика в 1С

Так погодите,вот полная ошибка: Ошибка: {Форма.Форма}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Incorrect syntax near ‘,770401001’. Ошибка: {Форма.Форма}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Incorrect syntax near ‘,770401001’. и т.д………….. ………………… Ошибка: {Форма.Форма}: Ошибка при вызове метода контекста (Close): Произошла исключительная ситуация (ADODB.Recordset): Operation is not allowed when the object is closed. Это ошибка в скрипте: +ВыборкаРез.Сумма+»‘,»

интересно как ты собираешся отладчиком проверять?!Операторы Скуловские

хорошая трава НаборЗаписей к сиквелу близко не лежит

в общем вот правельно : +ВыборкаРез.kpp+»‘,'» +ВыборкаРез.type+»‘,'»   +ВыборкаРез.amount+»‘,'» +ВыборкаРез.comment+»‘)»  ; но все равно не работает,говорит что ошибка object agent_debt: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Invalid object name ‘dbo.io_agent_debt’. ну же Мистовцы помогите……….

совершенно ни о чём не говрит?

Ну нет там такой таблицы. Чего неясного?

+ВыборкаРез.kpp+»‘,'» +ВыборкаРез.type+»‘,'»   +ВыборкаРез.amount+»‘,'»

и вообще, так лучше не делать

дык я из Запроса 1с в Скул и передаю,вообщем вот вся Процедура: +ВыборкаРез.type+»‘,'» +ВыборкаРез.amount+»‘,'»

Сообщить(ТекстЗапроса); и всё станет понятно

вообщем перечислел он все эти поля: 1)INSERT INTO dbo.io_agent_debt VALUES (’12/31/2009′,’6154100214′,’615401001′,’2′,’-87 500′,’Аварийно-восстановительная служба’,’Остаток на дату ‘) Ошибка: {Форма.Форма}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Invalid object name ‘dbo.io_agent_debt’. 2)INSERT INTO dbo.io_agent_debt VALUES (’01/18/2010′,’6164280911′,’616401001′,’1′,’3 917,5′,’Сетевые технологии ТД ООО’,’Платежное поручение исходящее ЭкД00000093 от 18.01.2010 15:30:50′) Ошибка: {Форма.Форма}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Invalid object name ‘dbo.io_agent_debt’. И так далее………. я так понимаю в скуле надо создать эти поля в ТЧ…….

ну нету у тебя таблицы dbo.io_agent_debt. На что тебе скуль и намекает настолько открыто, что я прям не знаю как.

запрос select name from sysobjects where xtype=’U’ вернет все имена таблиц в БД

Надо намекнуть человеку, что в инвалидов данные не вставляют :D

[я так понимаю в скуле надо создать эти поля в ТЧ] у сиквела нет ТЧ сделай на сиквеле запрос use  rt_dem GO select  * TOP 10 from io_agent_debt GO

так надо сообразить как из cmd подключится к SQL Server,в другом городе SQL Server

я так понял что я своей Процедуре не создал agent_debt?

нет щас доступа к Скулу блин,админ на том конце нет на месте

накуя тебе cmd сделай select  * from io_agent_debt в 1С

так пожди,через консоль запросов 1С?

MyCon это что за переменная,задавать её?

и вот это надо: НаборЗаписей=RS; либо набор записей должен быть:MyRst

в общем написал так для проверки на Скул: Ошибка:Ошибка: {Форма.Форма}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Invalid object name ‘io_agent_debt’.

ну он тебе уже не знает, как ещё намекнуть :-)

дык ты сам себе злобный Буратино нет в ec_dem таблицы io_agent_debt или у billing_daemon нет на нее прав

Тэги:

Комментарии доступны только авторизированным пользователям

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста 1с транзакция
  • Ошибка при вызове метода контекста converttoshape
  • Ошибка при вызове метода контекста 1с битрикс
  • Ошибка при вызове места контекста
  • Ошибка при вызове контекста поле код не уникально