1с ошибка при вызове метода контекста execute произошла исключительная ситуация 0x80020005
Программы » 1С:Предприятие 1C - 1C: Вопросы по конфигурациям
Варезник » 1C:Предприятие 7.7 - 1С:Предприятие v.8.x - 1C Диск ИТС - 1С: Совместимо 8.х Топик 1C Ebooks
ЗДЕСЬ (обновлено 22.02.14 ) - небольшая библиотечка (книги, документация, видео, утилиты) по 1С, финансам, бухучету и т.п.
Все рассортировано по версиям. Для заблудившихся в трех соснах >>> FAQ по форуму RU.Board
Образец карты есть в самой папке программы.
Заранее огромное спасибо!
Первый раз после запуска висел минут 7, но так ничего и не произошло, а потом начал ошибки выводить.
: Значение не является значением объектного типа (Application)
MSWord.Application.Quit();
: Ошибка при вызове метода контекста (Получить): Не удалось создать объект.
Возможно, отсутствует соответствующее приложение.
: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (0x80020005)
При замене вот этой строчки:
Замена = Документ.Content.Find;
Замена.Execute("[НазваниеРабочегоМеста]", Ложь, Истина, Ложь, , , Истина, , Ложь, ТекСтрока.НазваниеРабочегоМеста);
Предполагаю, что это из того, что реквизит таблицы "НазваниеРабочегоМеста" является ссылочного типа. В этой колонке выводится ссылка на определенный справочник, тип которого выбирается в колонке перед этой.
а ещё вопрос можно? Вот они все открываются, эти файлы, и потом их самому надо сохранять, а нельзя ли сделать так, чтоб они сохранялись где нибудь автоматически, например под именем:
"Аттестационная карта - " + "а тут бы было наименование профессии". И чтоб не закрывались они, а так же открытыми были, ну вдруг изменение какое внести или дописать что, и закрываешь и просто сохранить с изменениями и всё. Или это очень долго и сложно?
Заранее большое спасибо!
Добавлено:
vizlipuzli
И ещё вопрос, если я буду загружать данные из другой табличной части этого же документа, который находится на 2-ой странице, т.е. вторая вкладка, то так же будет:
Замена = Документ.Content.Find;
Замена.Execute("[НазваниеРабочегоМеста]", Ложь, Истина, Ложь, , , Истина, , Ложь, ТекСтрока.НазваниеРабочегоМеста);
Добавлено:
Свою почту проверьте - справа, вверху страницы "Личный Ящик"
: Ошибка при вызове метода контекста (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();
КонецПопытки;
Надо все поля функции передавать - там значения по умолчанию.
Просто, если не установлено, то 1С передаёт UNDEFINED, а Word этого понять не может.
И вообще - проще делать через поля - есть такие объекты, которые можно заполнять значениями, почти как в 1С.
(1) Не поняла: какие поля еще надо передавать? У меня до вставки этого запроса по лицевым счетам все формировалось в Ворд.
(3) Ну, например, Банк - это ссылка - его сначала нужно преобразовать в строку, так как переданное значение банка Word точно не поймёт, и ошибка будет звучать "плохой тип переменной".
(5) Читаем (4) я тебе уже там сказал, где спотыкается, и что говорит.
Вместо
Чудо случиться, только вот результат будет не такой, как ожидалось.
У меня возникает подозрение, что листочек наш - далеко не из России. Причём настолько далеко, что у них рабочий день начинается, когда у нас заканчивается.
Прикинув МПХ к глобусу - ба. Да это ж Америка.
Обработка для печати договоров с контрагентами. Подходит для торговли 10.3.* практически без необходимости вносить в конфигурацию базы серьезные изменения.
Достаточно лишь подкорректиовать макет договора в обработке, заполнить данные организации и все! Шаблон договора готов.
Привет. Сейчас расскажу как с этим работать:
1. При первом запуске обработка спопросит нужно ли добавить дополнительные свойства контрагента, организации и договора. Обработка вполне может работать и без этого, но тогда отвественных лица, основания и номера доверенностей нужно будет вносить каждый раз вручную, что несколько неудобно.
2. Когда нужные свойства у нас есть можем приступить к заполнению. Тут все крайне просто:
Тоже самое проделываем с контрагентом:
Обратите внимание на свойство "Ответственный РП контрагента", тут, понятно, надо вставлять ФИО в родительном падеже. Устав, должность и основание указывать нужно в именительном, обработка сама поставит их в нужный падеж.
3. Открыть обработку, выбрать договор и наслаждаться :)
4. Если документ нужен в PDF, то придется скачать bioPDF здесь:
2. Если вам чувствуете вам надоест лазить во внешние обработки каждый раз когда нужно сделать новый договор, то обработку можно добавить в конфигурацию, а на форме договора добавить кнопку с таким кодом:
Процедура ОсновныеДействияФормыПечать ( Кнопка )
Обработки . ПечатьДоговораКонтрагента . Создать (). Печать ( Ссылка );
КонецПроцедуры
Вот, собственно, и все.
3. Если нужно поменять макет, то тут тоже все достаточно просто.
Открываете конфигуратором обработку и создаете новый макет в нужных местах вставляя заранее определенные параметры. Вот их Список:
Дата - дата заключения договора
СрокДействия - срок действия договора в локализованном формате
ДатаКонецГода - дата конца года считая от даты заключения догвора в локализованном формате
ДатаЗаключения - дата заключения договора в локализованном формает
ДатаРасторжения - дата расторжения в локализованном формате или прочерк, вот такой: ________________
Название контрагента и отвественные лица:
НаименованиеКонтрагента - полное наименование контрагента
КраткоеНаименованиеКонтрагента - наименование справочника
ОтветственныйКонтрагента - берется из указанных свойств контрагента
ДолжностьОтветсвтенногоЛицаКонтрагента - берется из свойств контрагента, ставиться в именительном падеже
ДолжностьОтветственногоЛицаРПКонтрагента - берется из свойств контрагента, ставиться в родительном падеже
ОснованиеКонтрагента - берется из свойств контрагента, ставиться в именительном падеже (здесь будет устав, доверенность и т.д.)
ОснованиеРПКонтрагента - берется из свойств контрагента, ставиться в родительном падеже
Название организации и ответственные лица:
НаименованиеОрганизации - полное наименование организации
КраткоеНаименованиеОрганизации - наименование справочника
ОтветственныйОрганизации - берется из указанных свойств организации
ДолжностьОтветсвтенногоЛицаОрганизации - берется из свойств организации, ставиться в именительном падеже
ДолжностьОтветственногоЛицаРПОрганизации - берется из свойств контрагента, ставиться в родительном падеже
ОснованиеОрганизации - берется из свойств орагнизации, ставиться в именительном падеже (здесь будет устав, доверенность и т.д.)
ОснованиеРПОрганизации - берется из свойств контрагента, ставиться в родительном падеже
Для большенства организаций стандартная печатная форма трудового договора в программе 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».
Дальнейшее описывать не имет смысла. Думаю, не составит большого труда доработать функцию Печать() и макет договора.
Однажды появилась задача ускорить печать из 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 можно исключить, используя только переменную Макет.
Рассмотрим пятую времязатратную строку.
Строка вызывается три раза в типовой функции ПолучитьПозициюНачалаОбласти перед непосредственным поиском и заменой.
Так как достаточно использовать типовую процедуру Заменить, которая выполняет замену параметров по всему документу, то функцию ПолучитьПозициюНачалаОбласти можно исключить.
Читайте также: