Прошу прощения за мою некорректность — данный вопрос на самом деле не вопрос, а собственно сам ответ — очень много времени я его искал, и кроме одного косвенного скудного ответа на каком-то сайте не нашел.
И мне хочется чтобы такой ответ в сети был! Особенно на нашем сайте! *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С.
teem0n
Сообщ.
#6
,
11.11.11, 17:18
Junior
Рейтинг (т): нет
Здравствуйте еще раз!
Если модераторы уберут со старой темы галочку и перенесут это сообщение в нее — буду благодарен
Дурацкая ситуация. Ошибка не исчезла, она плавающая — можно запустить на одном файле процедуру пару раз, и результат будет разным.
Пробовались различные варианты обращения к месту, куда мы вставляем картинку — клетке таблицы — через Bookmark, напрямую к ячейке.. В Cell процедура попадает верно, вставляет картинку верно, по .ConvertToShape сдвигает картинку куда-то в левый край. Или не сдвигает. В Word 2003 эффект не наблюдается.
Самое интересное, что Shape, строго говоря, к ячейке не привязан и может быть передвинут в произвольное место страницы (например, командами .IncrementLeft 70 .IncrementTop -50 .IncrementRotation 30, как учит нас MSDN). Тем не менее, если клетку выделить и сделать Selection.Delete, то картинка удаляется вне зависимости от того, куда была перемещена, в том числе если была перемещена методом .ConvertToShape . Это очень удачно, потому что для обновления этих картинок не надо разбираться в коллекции Shapes, а достаточно сделать
Cell.Select
Selection.Delete
Задача-то у меня понятная — автоматически обновлять подписи в ГОСТовском штампе документации. Штамп втиснут в колонтитул. Текст обновляется по закладкам, логотип вставляется просто картинкой, а подписи стандартно вылезают за размер собственной ячейки, и поэтому к ним применяется Обтекание:Под текстом, и подпись центруется внутри ячейки вручную. Поскольку InLineShape, которым является вставленная картинка, обтекаться не умеет, приходится делать .ConvertToShape. В принципе, если бы можно было установить Shape в заданное место на странице (скажем, заданное пискелами/сантиметрами/дюймами от верхнего левого края страницы), это позволило бы обойти проблему. Но я на эту ничего найти не смог.
Код:
Dim A As Integer
Set oTable = ActiveDocument.Sections(1).Footers(2).Range.Tables(1)
For A=4 To 8
Set oCell = oTable.Cell(4, 3)
oCell.Select
Selection.Delete
Set Picture = oCell.Range.FormattedText.InlineShapes.AddPicture(FileName:=»C:Signature.eps», LinkToFile:=False, SaveWithDocument:=True)
Picture.ScaleHeight = 10
Picture.ScaleWidth = 10
msgbox «before ConvertShape»
Set wrp = Picture.ConvertToShape
msgbox «after ConvertShape»
wrp.WrapFormat.Type = 5
wrp.Select
wrp.IncrementTop (-7)
Selection.Collapse
Next A
Прикреплённый файлSignature.eps (7,23 Кбайт, скачиваний: 586)
Прикреплённый файлdocument.docx (44,23 Кбайт, скачиваний: 174)
Сообщение отредактировано: teem0n — 11.11.11, 17:45