Имя: Пароль:
1C
1С v8
1c81 и PowerPoint (продолжение)
0 247tsm
 
19.10.14
03:50
Я в 1с81 делаю слайд-шоу с помощью макета Active document.
Спасибо знатоку 1С Asmody. Он подсказал, как открыть презентацию PowerPoint:

- Сделал макет Word, вставил в него презентацию PP.
- И вот таким кодом оно открывается

Док = ЭтотОбъект.ПолучитьМакет("Макет").Получить();
Док.InlineShapes(1).OLEFormat.Activate();

Но мне нужно еще и программно задавать свойства презентации:
- скорость перехода к следующему слайду
- смена слайда автоматически после, например 5 сек.
- эффект анимации - растворение или случайный выбор
...

Чтобы посмотреть код этих команд, я использовал запись макросов в PowerPoint:

    With ActivePresentation.SlideShowSettings
        .ShowType = ppShowTypeKiosk
        .LoopUntilStopped = msoTrue
        .ShowWithNarration = msoTrue
        .ShowWithAnimation = msoTrue
        .RangeType = ppShowAll
        .AdvanceMode = ppSlideShowUseSlideTimings
        .PointerColor.RGB = RGB(Red:=255, Green:=0, Blue:=0)
    End With
    
    ActiveWindow.View.DisplaySlideMiniature = msoTrue
    With ActiveWindow.Selection.SlideRange.SlideShowTransition
        .EntryEffect = ppEffectDissolve
        .Speed = ppTransitionSpeedMedium
        .AdvanceOnClick = msoFalse
        .AdvanceOnTime = msoTrue
        .AdvanceTime = 2
        .SoundEffect.Type = ppSoundNone
    End With

Но никак не могу в 1с правильно это записать. Пробовал через отладчик просмотреть свойства для Док.InlineShapes(1).OLEFormat, но пока ни к чему не пришел.
Нужна помощь. Как выше написанное в VB переложить на 1С81?

Спасибо.
1 manyak
 
19.10.14
09:41
http://msdn.microsoft.com/en-us/library/office/ff746794(v=office.15).aspx
ppEffectDissolve это 1537
ActiveWindow.Selection.SlideRange.SlideShowTransition .EntryEffect = ppEffectDissolve

Пиши
ActiveWindow.Selection.SlideRange.SlideShowTransition .EntryEffect = 1537
2 manyak
 
19.10.14
09:42
В vba тоже можно смотреть значения числовые параметров в objectbrowser
3 manyak
 
19.10.14
09:45
Конструкцию with убирай и к каждой строке добавляй ActiveWindow.Selection.SlideRange.SlideShowTransition.
4 247tsm
 
19.10.14
12:12
(3) За подсказку, где искать константы, спасибо, но осталась другая проблема. Объект у меня такой: в Word-е я добавил презентацию и хочу менять свойства, константы именно в этой презентации. Я не могу найти путь, т.е. ту последовательность объектов "через точку", чтобы задать эти константы.
Вот так работает:

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
Док.InlineShapes(1).OLEFormat.Activate();    

А так выдает ошибку, что "Поле объекта ActiveWindow не обнаружено":

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
ддок = док.InlineShapes(1).OLEFormat.ActiveWindow.Selection.SlideRange.SlideShowTransition;
ддок.EntryEffect = 1537;
Док.InlineShapes(1).OLEFormat.Activate();    
    
Я пробовал смотреть в отладчике, и методом "тыка", но там так много свойств и много уровней... Пока не нашел.

Нужна помощь.
5 manyak
 
19.10.14
13:44
алгоритм такой: сначала полностью добейся рабочего кода в !VBA! а потом переноси в 1с.
если есть готовый VBA код -  сюда выкладывай полностью его и его же версию для 1с.

так как .ActiveWindow действует только для приложения ppoint -  т.е. для Док а не для ддок

пока не выложишь  два кода  - помощи смысла нет ждать.
6 247tsm
 
19.10.14
18:21
(5) Вот запись макроса в PowerPoint:

Sub Макрос2()
    ActiveWindow.View.DisplaySlideMiniature = msoTrue
    With ActiveWindow.Selection.SlideRange.SlideShowTransition
        .EntryEffect = ppEffectDissolve
        .Speed = ppTransitionSpeedMedium
        .AdvanceOnClick = msoTrue
        .AdvanceOnTime = msoFalse
        .SoundEffect.Type = ppSoundNone
    End With
    ActiveWindow.View.DisplaySlideMiniature = msoTrue
End Sub

а вот я пытаюсь перенести это в 1С (только для EntryEffect = ppEffectDissolve):

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
ддок = док.InlineShapes(1).OLEFormat.ActiveWindow.Selection.SlideRange.SlideShowTransition;
ддок.EntryEffect = 1537;
Док.InlineShapes(1).OLEFormat.Activate();    

Вот сообщение об ошибке:

{Обработка.РабочийСтол.Форма.Форма(585)}: Поле объекта не обнаружено (ActiveWindow)
    ддок = Док.InlineShapes(1).OLEFormat.ActiveWindow.Selection.SlideRange.SlideShowTransition;

Пытаюсь по-другому:

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
ддок = Док.Application.ActiveWindow.Selection.SlideRange.SlideShowTransition;
    ддок.EntryEffect = 1537;
Док.InlineShapes(1).OLEFormat.Activate();    

Наверно, правильнее, но, всё-равно, ошибка:

{Обработка.РабочийСтол.Форма.Форма(587)}: Ошибка при получении значения атрибута контекста (ActiveWindow): Произошла исключительная ситуация (Microsoft Word): Данная команда недоступна, так как не открыт ни один документ.
    ддок = Док.Application.ActiveWindow.Selection.SlideRange.SlideShowTransition;

переменная ддок здесь только помогает избавиться от повторений длинной строки "док.InlineShapes(1).OLEFormat.ActiveWindow.Selection.SlideRange.SlideShowTransition"
7 247tsm
 
19.10.14
18:26
(5) или так:
ддок = Док.InlineShapes(1).OLEFormat.Application.ActiveWindow.Selection.SlideRange.SlideShowTransition;
ддок.EntryEffect = 1537;

Но та же ошибка:

{Обработка.РабочийСтол.Форма.Форма(587)}: Ошибка при получении значения атрибута контекста (ActiveWindow): Произошла исключительная ситуация (Microsoft Word): Данная команда недоступна, так как не открыт ни один документ.
    ддок = Док.InlineShapes(1).OLEFormat.Application.ActiveWindow.Selection.SlideRange.SlideShowTransition;
8 manyak
 
19.10.14
21:00
:) у тебя исходный код vba и 1с два разных кода.
это как будто ты переводил слово mother а в переводе пишешь "папа" и спрашиваешь почему перевод не правильный

подсказка, в исходном коде у тебя нет InlineShapes(1), а  в 1с есть, прям чудеса какие-то...

код будет же почти один в один, тока параметры числовым значением и в начале везде будет либо "док" либо "ддок"
9 manyak
 
19.10.14
21:02

1) ActiveWindow.View.DisplaySlideMiniature = msoTrue
2)   With ActiveWindow.Selection.SlideRange.SlideShowTransition
        .EntryEffect = ppEffectDissolve
3)       .Speed = ppTransitionSpeedMedium
4)       .AdvanceOnClick = msoTrue
5)       .AdvanceOnTime = msoFalse
6)       .SoundEffect.Type = ppSoundNone
    End With
7)   ActiveWindow.View.DisplaySlideMiniature = msoTrue

вот в 1с так же 7 строк будет у тебя
10 247tsm
 
19.10.14
22:23
(9) Я за основу беру то, что работает в 1С. А работает вот это:

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
Док.InlineShapes(1).OLEFormat.Activate();    

Далее, в отладчике 1С беру Док.InlineShapes(1).OLEFormat и смотрю с помощью вычислителя выражения его свойства. Но... Этих свойств много. Некоторые из них имеют свои наборы свойств и т.д. Я, к сожалению, не знаю, какие свойства надо смотреть, поэтому и попросил помощи.
Я знаю начало и конец правильного выражения:

Начало (скорее всего такое): Док.InlineShapes(1).OLEFormat. ... а конец - это то, о чем ты говоришь, выражение c with. Т.е., примерно так:

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
ддок = док.InlineShapes(1).OLEFormat.КАКИЕ_ТО_СВОЙСТВА.ActiveWindow.Selection.SlideRange.SlideShowTransition;

ддок.EntryEffect = 1537;
ддок.Speed = ***;
ддок.AdvanceOnClick = ложь;
ддок.AdvanceOnTime = истина;
ддок.SoundEffect.Type = ***;

Док.InlineShapes(1).OLEFormat.Activate();    

В этом фрагменте кода есть неизвестные: КАКИЕ_ТО_СВОЙСТВА и ***.
Так вот, я не могу найти эту часть выражения: КАКИЕ_ТО_СВОЙСТВА.
11 247tsm
 
19.10.14
22:26
(9) Вдогонку, в PowerPoint нет InlineShapes потому, что я делаю макрос, находясь "внутри" PowerPoint. А в 1с я подхожу к PowerPoint "снаружи", т.е. я считаю, что Док.InlineShapes(1).OLEFormat и является той "наружной" частью выражения.
12 Asmody
 
19.10.14
22:48
OLEFormat - это OLE-представление документа PowerPoint в твоём случае. Пока ты его не активировал, документа как-бы нет (точнее, нет его объекта).
После Activate() можно воспользоваться OLEFormat.Object для изменения свойств открытой презентации. В частности, есть свойства SlideMaster, SlideShowSettings и т.п.
13 247tsm
 
19.10.14
23:17
(12) Но в отладчике на:
Док.InlineShapes(1).OLEFormat.Object
выдает ошибку:
{(1)}: Ошибка при получении значения атрибута контекста (Object): Произошла исключительная ситуация (0x80004002)
14 Asmody
 
19.10.14
23:20
(13) смотри его значение после выполнения Activate
15 247tsm
 
19.10.14
23:24
(14) Я так и делаю. Точка останова после Activate.
16 247tsm
 
19.10.14
23:27
(14) Кстати, у меня PowerPoint 2003. Может, в этом дело?
Но презентация тоже в PowerPoint 2003. Ведь

Док = ЭтотОбъект.ПолучитьМакет("Макет1").Получить();
Док.InlineShapes(1).OLEFormat.Activate();    

срабатывает нормально.
17 Asmody
 
19.10.14
23:41
Короче, накрутил ты себе проблем. Сделал бы в html давно.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.