Ошибка при вызове метода контекста converttoshape

Всем доброго времени суток!

Прошу прощения за мою некорректность — данный вопрос на самом деле не вопрос, а собственно сам ответ — очень много времени я его искал, и кроме одного косвенного скудного ответа на каком-то сайте не нашел.
И мне хочется чтобы такой ответ в сети был! Особенно на нашем сайте!
*07

Я очень долго сидел с изменением отчета, который формируется в MS Word. В этом отчете иногда необходимо вставлять рисунок, но располагать его в обрамлении текстом.

Для этого вставляемый рисунок надо «конвертировать» в фигуру. В итоге код такой (в данном случае, у меня):

Код 1C v 8.2 УП

 InlineShape = Document.InlineShapes.AddOLEObject(, ПолноеИмяФайла, True, False,,,, ActiveTable.Cell(RowCount, 2).Range);
Shape = InlineShape.ConvertToShape();

Но довольно часто при этой операции выскакивает ошибка:

Код 1C v 8.2 УП

 {ВнешнийОтчет.ВнешнийОтчетНаРабочемСтоле.МодульОбъекта()}: Ошибка при вызове метода контекста (ConvertToShape)
Shape = InlineShape.ConvertToShape();
по причине:
Произошла исключительная ситуация (0x80004005)

Оказывается все решается просто: надо «сфокусироваться» на том месте, куда происходит вставка рисунка, а именно таким образом:

Код 1C v 8.2 УП

 InlineShape = Document.InlineShapes.AddPicture(ПолноеИмяФайла, False, True, ActiveTable.Cell(RowCount, 2).Range);
ActiveTable.Cell(RowCount, 2).Range.S_elect();
Shape = InlineShape.ConvertToShape();

Ситуации разные, но без использования Range.S_elect() зачастую не обойтись… )

Всем привет.

Делаю печатную форму в ворде. Столкнулся в в этот раз с проблемой добавления картинок в колонтитулы, т.е. картинка то добавляется, а вот метод ConvertToShape() постоянно выдает ошибку.

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

WordDoc = Word.documents.add(ПутьКШаблону);

WordSections= WordDoc.sections(1).footers(2).Range;

//ищем место для вставки

WordSections.Find.ClearFormatting();

WordSections.Find.Text = «#МестоДляКартинки#»;

WordSections.Find.Forward = 1;

WordSections.Find.Wrap = 1;

//вставляем

Картинка = WordSections.InlineShapes.AddPicture(ПутьККартинке,ложь,Истина);

картинка вставляется, но ее нужно разместить за текстом и при попытке конвертировать вываливается ошибка

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

так

Шейп = Картинка.ConvertToShape();

или так

Шейп = WordSections.InlineShapes(1).ConvertToShape();

вываливает ошибку

Читал про подобную проблему  тут https://helpf.pro/help/view/13855.html

WordSections.InlineShapes(1).Select() не помогло

Задача: — Вывести изображение в Word, чтобы изображение находилось за текстом. Все прекрасно работает, если это происходит на первой странице шаблона. Если же это вторая и далее страницы шаблона, возникает следующая ошибка: <<Ошибка при вызове метода контекста (ConvertToShape): Произошла исключительная ситуация (0x80004005)>> при выполнении следующего кода: Никак не разберусь в чем загвоздка. Помогите!!!!!!!!

  

Access granted

12.06.18 — 10:06

Добрый день!

Имеется простейший код:

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

ExcelDoc.Visible = Ложь;

    
РабочаяКнига = ExcelDoc.WorkBooks.Open(«C:1.xls»);

        
ExcelDoc.ActiveSheet.Shapes.AddPicture(«C:1.jpg», Истина, Истина, 100, 100, 70, 70).Select();

Я зашел на сервер 1С и выполняю его через инструменты разработчика. На клиенте все работает (картинка вставляется), а в режиме «на сервере» не работает, выдает «Ошибка при вызове метода контекста (AddPicture): Неизвестная ошибка». Уже не знаю, куда копать. Дал USR1CV8 полные права, не помогло.

  

hhhh

1 — 12.06.18 — 10:12

(0) файл C:1.jpg  точно есть на сервере? может он у вас на клиентском компе расположен?

  

Access granted

2 — 12.06.18 — 10:14

+(0) Посмотрел через диспетчер задач, что различаются пользователи, от имени которых запускается процесс Excel.exe. С клиента это админ, а с сервера это usr1cv8. Через dcomcnfg поставил для Microsoft Excel application запуск от имени админа, а он все равно продолжает от имени usr1cv8 открываться.

  

Access granted

3 — 12.06.18 — 10:14

(1) Я прямо на сервер зашел, т.е. в данном случае компьютер клиента = компьютер сервера. Просто код выполняется по-разному (клиент/сервер)

  

Access granted

4 — 12.06.18 — 10:16

(1) Права я тоже проверил — дал права на xls и jpg админу и usr1cv8 полные.

  

Остап Сулейманович

5 — 12.06.18 — 10:50

(0) За ActiveSheet и прочие активы  нужно гнать из професии.

Вы уверены что оно есть в неинтерактивном режиме? Конечно что-то есть. Но тот ли это актившит, который вам нужен? Вы в него мышкой тыкали, чтобы он стал Актив?

  

Access granted

6 — 12.06.18 — 10:56

(5) ExcelDoc.Sheets(1).Shapes.AddPicture(«C:1.jpg», Истина, Истина, 100, 100, 70, 70).Select();

Ничего не меняется.

  

shuhard

7 — 12.06.18 — 11:03

(0)[Я зашел на сервер 1С и выполняю его через инструменты разработчика]

что за инструменты разработчика

  

Access granted

8 — 12.06.18 — 11:08

(7) Подсистема с набором внешних обработок. Считайте, что через консоль кода выполняю.

  

Access granted

9 — 12.06.18 — 11:10

Возможно, причина в том, что сервер 1С 64 бит, а excel 32 бит?

  

Остап Сулейманович

10 — 12.06.18 — 11:11

(6) Почему «ExcelDoc.Sheets(1)»? Разве у вас лист расположен в ExcelDoc? Судя по вашему же коду нужный лист расположен в «РабочаяКнига». И еще. Он точно имеет индекс «1». В ВБА все индексы начинаются с «0».

  

Остап Сулейманович

11 — 12.06.18 — 11:13

+(10) Если уж так хочется через ExcelDoc — тогда так :

ExcelDoc.WorkBooks(1).Shets(1)…

Проверить индексы.

  

Access granted

12 — 12.06.18 — 11:15

(11) Как я ранее уже сказал, код на клиенте работает. Картинка вставляется куда надо. На сервере не работает. Клиент и сервер — один и тот же компьютер.

  

Остап Сулейманович

13 — 12.06.18 — 11:17

+ (11) А вообще так тоже плохо. Откуда вы можете знать, что открытая книга единственная? Если пользователь перед этим открыл еще несколько WorkBooks-ов — ваша будет иметь индекс точно не «1». К нужной книге обращаться нужно все-таки через объект, который возвращается вот здесь :

РабочаяКнига = ExcelDoc.WorkBooks.Open(«C:1.xls»);

  

hhhh

14 — 12.06.18 — 11:18

(12) попробуйте какой нибудь диск другой. Всё-таки корень диска С: сервера — это не самый лучший вариант. Туда даже у админа не все права.

  

Остап Сулейманович

15 — 12.06.18 — 11:19

(12)

Зайти на сервер пользователем «usr1cv8».

Открыть файл интерактивно.

Прочитать все предупреждения от Эксель.

Возможно ограничения выставляются именно пользователю «usr1cv8».

  

Access granted

16 — 12.06.18 — 11:20

(14) Уже пробовал другой диск. И права туда тоже задавал. Уже и службу агента 1С запустил с полными правами от админа. Дело в чем-то другом. Возможно, в разрядности 1С и Excel.

  

Access granted

17 — 12.06.18 — 11:21

(15) Уже служба агента от имени админа запущена. Никаких сообщений не выдает при интерактивном открытии. Да и с клиента под ним же отрабатывает нормально.

  

Остап Сулейманович

18 — 12.06.18 — 11:27

(17) Разбивай вот это вот счастье на этапы и определи где именно возникает ошибка :

ExcelDoc.Sheets(1).Shapes.AddPicture(«C:1.jpg», Истина, Истина, 100, 100, 70, 70).Select();

1. Лист = ExcelDoc.Sheets(1);

2. Рисунки = Лист.Shapes;

3. Рисунок = Рисунки.AddPicture(«C:1.jpg», Истина, Истина, 100, 100, 70, 70);

4. Выделение = Рисунок.Select();

  

Access granted

19 — 12.06.18 — 11:29

(18) Сейчас Excel переустановлю на х64, после чего проверю.

  

Остап Сулейманович

20 — 12.06.18 — 11:33

(19) Если бы дело было в разрядности — ошибка была бы здесь :

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

  

Access granted

21 — 12.06.18 — 11:36

(20) Согласен. Но у меня больше нет идей. При одинаковых условиях (один и тот же запускающий пользователь, один компьютер) с клиента работает (32бит), с сервера не работает (64бит).

  

Остап Сулейманович

22 — 12.06.18 — 11:38

(21) Не понял… Как так может быть, что на одной машине у разных пользователей разная разрядность ОС?

  

Access granted

23 — 12.06.18 — 11:43

(22) Сервер 1С 64 бит, Excel стоял 32 бит. Пользователи тут ни при чем.

  

Access granted

24 — 12.06.18 — 11:48

(22) Про пользователей понял вопрос — сервер 64, а клиентская платформа 32, вот и разная разрядность.

  

sechs

25 — 12.06.18 — 11:53

(0) Почему второй параметр AddPicture равен Истина?

  

Access granted

26 — 12.06.18 — 11:55

(25) Да это я поменял, в исходном коде вообще число было. Пробовал всякие разные варианты параметров, прочитав хелп MSDN, это не помогло.

  

Access granted

27 — 12.06.18 — 11:56

Мопед, как говорится, не мой, но починить его надо :)

  

sechs

28 — 12.06.18 — 11:58

А, разработка методом тыка… Ну, удачи.

  

Access granted

29 — 12.06.18 — 11:59

(28) Это вообще не разработка, нужно починить сломанное.

  

Access granted

30 — 12.06.18 — 12:06

Собственно, я был прав. Дело в разрядности Excel. Все заработало.

Всем доброго времени суток!

Прошу прощения за мою некорректность — данный вопрос на самом деле не вопрос, а собственно сам ответ — очень много времени я его искал, и кроме одного косвенного скудного ответа на каком-то сайте не нашел.
И мне хочется чтобы такой ответ в сети был! Особенно на нашем сайте!
*07

Я очень долго сидел с изменением отчета, который формируется в MS Word. В этом отчете иногда необходимо вставлять рисунок, но располагать его в обрамлении текстом.

Для этого вставляемый рисунок надо «конвертировать» в фигуру. В итоге код такой (в данном случае, у меня):

Код 1C v 8.2 УП

 InlineShape = Document.InlineShapes.AddOLEObject(, ПолноеИмяФайла, True, False,,,, ActiveTable.Cell(RowCount, 2).Range);
Shape = InlineShape.ConvertToShape();

Но довольно часто при этой операции выскакивает ошибка:

Код 1C v 8.2 УП

 {ВнешнийОтчет.ВнешнийОтчетНаРабочемСтоле.МодульОбъекта()}: Ошибка при вызове метода контекста (ConvertToShape)
Shape = InlineShape.ConvertToShape();
по причине:
Произошла исключительная ситуация (0x80004005)

Оказывается все решается просто: надо «сфокусироваться» на том месте, куда происходит вставка рисунка, а именно таким образом:

Код 1C v 8.2 УП

 InlineShape = Document.InlineShapes.AddPicture(ПолноеИмяФайла, False, True, ActiveTable.Cell(RowCount, 2).Range);
ActiveTable.Cell(RowCount, 2).Range.S_elect();
Shape = InlineShape.ConvertToShape();

Ситуации разные, но без использования Range.S_elect() зачастую не обойтись… )

4129 / 2233 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

03.12.2014, 08:03

3

ВаЛерика

Сравните

mySlide.Shapes.AddPicture FileName:=f & «» & myfile.Name, LinkToFile:=msofolse,

savewithDokument:=msoTrue, Left:=0, Top:=0, Width:=100, Higth:=100

и

mySlide.Shapes.AddPicture FileName:=myfile.Path, LinkToFile:=msoFalse,

SaveWithDocument:=msoTrue, Left:=0, Top:=0, Width:=100, Height:=100

Добавлено через 34 минуты
Тоже самое, только вместо FSO используется функция Dir, что даёт нам возможность перебирать только файлы с указанным расширением.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Test()
    Dim ppApp As Object, ppPresn As Object, ppSlide As Object
    Dim strPath As String, strFileName As String, intCount As Integer
    
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True: ppApp.Activate
    
    Set ppPresn = ppApp.Presentations.Add
 
    strPath = "F:ЯГПУ2 ПОСлайд шоу" 'A если диска/папки нет ?
    strFileName = Dir(strPath & "*.jpg")
 
    Do While Len(strFileName)
       intCount = intCount + 1
       Set ppSlide = ppPresn.Slides.Add(intCount, 12) '12 = ppLayoutBlank
       ppSlide.Shapes.AddPicture strPath & strFileName, msoFalse, msoTrue, 0, 0 ', 100, 100
       strFileName = Dir()
    Loop
    ppPresn.SlideShowSettings.Run
End Sub

К слову сказать, у меня прокатил вариант и без использования счётчика

Visual Basic
1
Set ppSlide = ppPresn.Slides.Add(1, 12)

1

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник

Рис.3 Синтакс-помощник

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

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

  • Remove From My Forums
  • Question

  • Hi everyone,

    I’m at the beginning of vsto development in c# .. and so i have a question about inlineshapes in content controls.

    I add a pictureContentControl to the controls of my activedocument and after this I add a picture:

    ————————————————————————————————————

    var range = Globals.ThisAddIn.Application.Selection.Range;
    var contentControl = vstoDocument.Controls.AddPictureContentControl(range, $»CHART{Guid.NewGuid()}»);
    contentControl.LockContents = false;
    contentControl.Title = chartContentControl.Title;
    contentControl.Tag = chartContentControl.Key;
    contentControl.Range.InlineShapes.AddPicture(imagePath);

    // Up to here it runs well!

    var myInlineShape = contentControl.Range.InlineShapes.Cast<InlineShape>()
                                            .Where(inlineShape =>
    inlineShape.Type == WdInlineShapeType.wdInlineShapePicture)
                                            .First();

    //Now i want to convert the InlineShape to a shape

    var convertedShape = myInlineShape.ConvertToShape(); // Exception occurs here

    //now i want to get the rotation of the control, but the conversion failed in the
    previous step

    var rotation = convertedShape.Rotation;

    —> Exception:

    {«Error HRESULT E_FAIL has been returned from a call to a COM component.»}

     ErrorCode = -2147467259

    ———————————————————————————

    Does anybody know why the conversion always fails or is there an other way to rotate pictures in inlineshapes?

    Thanks in advance for answers! 

    Philipp

Answers

  • Hi,

    I wanted to inform you about my solution/walkaround for the issue:

    I rotated the image itself and after this I saved this image in my local «C:Temp» path.

    Further on i created a new PictureContentControl and added the rotated image from the local path.

    var rotatedEmfImage = Image.FromFile(emfImagePath);
    rotatedEmfImage.RotateFlipRotateFlipType.Rotate270FlipNone);
    var rotatedEmfName = $"Image{Guid.NewGuid()}.emf";
    var rotatedEmfPath = Path.GetTempPath() + rotatedEmfName;
     rotatedEmfImage.Save(rotatedEmfPath, ImageFormat.Emf);
     rotatedEmfImage.Dispose();
    
    var picGuid = Guid.NewGuid();
    var pictureContentControl = document.Controls.AddPictureContentControl(nativeControl, $"CHART{picGuid}");
    pictureContentControl.LockContents = false;
    pictureContentControl.Title = chartContentControl.ChartInfo.Title;
    pictureContentControl.Tag = chartContentControl.Key;
    
    var insertedShape = pictureContentControl.Range.InlineShapes.AddPicture(rotatedEmfPath); 
    

    With this approach, I could meet the requirement as far as possible.

    Best regards,

    Philipp

    • Marked as answer by

      Tuesday, June 27, 2017 6:46 AM

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове места контекста
  • Ошибка при вызове контекста поле код не уникально
  • Ошибка при вызове контекста извлечьвсе
  • Ошибка при вызове конструктора чтениеzipфайла некорректный формат файла
  • Ошибка при вызове конструктора чтение текста