Прошу прощения за мою некорректность — данный вопрос на самом деле не вопрос, а собственно сам ответ — очень много времени я его искал, и кроме одного косвенного скудного ответа на каком-то сайте не нашел.
И мне хочется чтобы такой ответ в сети был! Особенно на нашем сайте! *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 | ||
|
К слову сказать, у меня прокатил вариант и без использования счётчика
Visual Basic | ||
|
1
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 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 stepvar 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
-
Marked as answer by