И так сразу к делу!
Пример учебно-показательный, поэтому модуль формы справочника "Контрагенты", просто "Кнопка". Выводит то что мы заполним из данных и прикреплённые фото из договоров (банально ради примера).
Всё, как можно кратко. Больше в документации "microsoft" -https://learn.microsoft.com/en-us/office/vba/api/overview/powerpoint. Небольшие пояснения сразу в коде. И так поехали!
Кнопка на форме:
&НаКлиенте
Процедура OlympiaSoft_ПрезентацияПосле(Команда)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Фильтр = НСтр("ru='ppt файл (*.ppt)|*.ppt'");
ДиалогВыбораФайла.Расширение = "ppt";
ДиалогВыбораФайла.Заголовок = СтрШаблон(НСтр("ru='Укажите имя файла для выгрузки данных презентации'"));
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
ОписаниеОповещения = Новый ОписаниеОповещения("ВыборФайлаПриВыгрузкеЗавершение", ЭтаФорма);
ДиалогВыбораФайла.Показать(ОписаниеОповещения);
КонецПроцедуры
Основная процедура для вывода презентации:
&НаКлиенте
Процедура ВыборФайлаПриВыгрузкеЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено И ТипЗнч(Результат) = Тип("Массив")И Результат.Количество() > 0 Тогда
ИмяФайла = Результат[0];
Шаблон =""; //Путь до шаблона
PowerPoint = Новый COMОбъект("PowerPoint.Application");
// Создание новой презентации
Presentation = PowerPoint.Presentations.Open(Шаблон, , , true);
// Создание нового слайда
Slide = Presentation.Slides.range(1);
// Вывод заголовка
Slide.Shapes.item(1).TextFrame.TextRange.Text = Строка(ЗаголовокПрезентации(Объект.Ссылка)); //item(1)
//Здесь можно заполнить эту таблицу циклом
Slide.Shapes.item(7).Table.Cell(2, 1).Shape.TextFrame.TextRange.Text = Строка("Создание ТЗ");
Slide.Shapes.item(7).Table.Cell(2, 2).Shape.TextFrame.TextRange.Text = Строка("1000₽");
Slide.Shapes.item(7).Table.Cell(3, 1).Shape.TextFrame.TextRange.Text = Строка("Создание ПО");
Slide.Shapes.item(7).Table.Cell(3, 2).Shape.TextFrame.TextRange.Text = Строка("2000₽");
Slide.Shapes.item(7).Table.Cell(4, 1).Shape.TextFrame.TextRange.Text = Строка("Создание сайтов");
Slide.Shapes.item(7).Table.Cell(4, 2).Shape.TextFrame.TextRange.Text = Строка("3000₽");
// Ещё поля для заполнения
item3 = "Содействие"; item4 = "Рост";item5 = "Обучение"; item6 = "Партнёрство";
Slide.Shapes.item(3).TextFrame.TextRange.Text = ФильтрСтроки(item3);
Slide.Shapes.item(4).TextFrame.TextRange.Text = ФильтрСтроки(item4);
Slide.Shapes.item(5).TextFrame.TextRange.Text = ФильтрСтроки(item5);
Slide.Shapes.item(6).TextFrame.TextRange.Text = ФильтрСтроки(item6);
#Область ФайлыФОТО
ФайлыОбъекта = НашиФайлы(Объект.Ссылка); // файлы для вывода фото
Итератор = 0; // для вывода определённого кол-ва фото
Для каждого стр из ФайлыОбъекта Цикл
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
Двоичное = ПолучитьИзВременногоХранилища(стр.АдресХранения); // по адресу временного хранилища получаем двоичные данные
Двоичное.Записать(ИмяВременногоФайла); // перезаписываем наш файлик на клиенте
Если итератор = 0 Тогда
Slide.Shapes.AddPicture(ИмяВременногоФайла, false, true, 393.46, 155.83, 312.31, 184.52);
//Цифры:горизонталь-393.46, Вертикаль - 155.83, Высота - 312.31, Ширина - 184.52
Slide.Shapes.AddTextbox(1, 393.46, 320, 313.3, 10).TextFrame.TextRange.Text = стр.Описание; // описание к фото
//Цифры:горизонталь-393.46, Вертикаль - 320, Высота - 313.3, Ширина -10
Slide.Shapes(Slide.Shapes.Count).Fill.ForeColor.RGB = RGB(200, 200, 200); //цвет
Slide.Shapes(Slide.Shapes.Count).Fill.Transparency = 0.5; //прозрачность
Slide.Shapes(Slide.Shapes.Count).TextFrame.TextRange.font.size = 10; //размер
Slide.Shapes(Slide.Shapes.Count).TextFrame.TextRange.font.name = "Cambria"; //шрифт
ИначеЕсли Итератор = 1 Тогда
Slide.Shapes.AddPicture(ИмяВременногоФайла, false, true, 393.46, 341.69, 312.31, 184.52); //фея
//Цифры:горизонталь-393.46, Вертикаль - 341.69, Высота - 312.31, Ширина - 184.52
Slide.Shapes.AddTextbox(1, 393.46, 506.8, 313.3, 10).TextFrame.TextRange.Text = стр.Описание ;
//Цифры:горизонталь-393.46, Вертикаль - 506.8, Высота - 313.3, Ширина - 10
Slide.Shapes(Slide.Shapes.Count).Fill.ForeColor.RGB = RGB(200, 200, 200);
Slide.Shapes(Slide.Shapes.Count).Fill.Transparency = 0.5;
Slide.Shapes(Slide.Shapes.Count).TextFrame.TextRange.font.size = 10;
Slide.Shapes(Slide.Shapes.Count).TextFrame.TextRange.font.name = "Cambria";
//ИначеЕсли Итератор = 2 Тогда
// Тут код вывода 3 фото
//ИначеЕсли Итератор = 3 Тогда
// Тут код вывода 4 фото
КонецЕсли;
итератор = итератор + 1;
УдалитьФайлы(ИмяВременногоФайла);
КонецЦикла;
#КонецОбласти
// Сохранение в файл
Presentation.saveas(ИмяФайла);
PowerPoint.quit();
ЗапуститьПриложение(ИмяФайла);
КонецЕсли;
КонецПроцедуры
Функция для цвета заливки:
&НаКлиенте Функция RGB(r, g, b) Возврат b * 65536 + g * 256 + r; КонецФункци
На всякий случай обработаем строку от некорректных символов при выводе.
Функция для строковых значений:
Функция ФильтрСтроки(Строка)
Строка = СтрЗаменить(Строка,Символы.ПС,"");
Строка = СтрЗаменить(Строка,Символы.ВК,"");
Строка = СтрЗаменить(Строка,Символы.Таб,"");
Строка = СтрЗаменить(Строка,Символы.НПП,"");
Строка = СтрЗаменить(Строка,Символы.ПФ,"");
Строка = СтрЗаменить(Строка,Символы.ВТаб,"");
Строка = СтрЗаменить(Строка,Символ(182),"");//В EXCEL перенос по ALT+Enter дает перенос каретки, т.е символ 182
Для КодСимвола = 0 По 31 Цикл
Строка = СтрЗаменить(Строка,Символ(КодСимвола),"");
КонецЦикла;
Строка = СокрЛП(Строка);
Возврат Строка
Конецфункции
Функция вывод заголовка в основной процедуре:
&НаСервере
Функция ЗаголовокПрезентации(Ссылка)
Возврат "OLYMPIA-SOFT.com"
КонецФункции
Собираем нужные файлы для вывода фото:
&НаСервере Функция НашиФайлы(Контрагент) Запрос = Новый Запрос(" |ВЫБРАТЬ ПЕРВЫЕ 2 | Контрагенты.Ссылка КАК Ссылка, | Контрагенты.Наименование КАК Наименование, | ДоговорыКонтрагентов.Представление КАК Представление, | ДоговорыКонтрагентовПрисоединенныеФайлы.Ссылка КАК СсылкаФайл |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов | ПРАВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентовПрисоединенныеФайлы КАК ДоговорыКонтрагентовПрисоединенныеФайлы | ПО (ДоговорыКонтрагентовПрисоединенныеФайлы.ВладелецФайла = ДоговорыКонтрагентов.Ссылка) | ПО (Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент) |ГДЕ | Контрагенты.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Контрагент ); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); ТЗ = новый ТаблицаЗначений; ТЗ.Колонки.Добавить("АдресХранения"); ТЗ.Колонки.Добавить("Описание"); Пока Выборка.Следующий() Цикл Попытка // ненаходит двоичные данные (фото) ДФ = РаботаСФайлами.ДанныеФайла(Выборка.СсылкаФайл); ПутьКФайлу = ПолучитьИмяВременногоФайла(); ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДФ.СсылкаНаДвоичныеДанныеФайла); ДвоичныеДанные.Записать(ПутьКФайлу); АдресХранения = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор); строка_ТЗ = ТЗ.Добавить(); строка_ТЗ.АдресХранения = АдресХранения; строка_ТЗ.Описание = Выборка.Представление; УдалитьФайлы(ПутьКФайлу); исключение продолжить конецПопытки КонецЦикла; МассивФайлов = новый Массив; МассивФайлов = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТЗ); Возврат МассивФайлов; КонецФункции
Не забудьте создать шаблон презентации PowerPoint или воспользуйтесь нашим из примера.
Шаблон презентации PowerPoint.
На этом всё! Разбор и небольшие пояснения в видео ниже.
Вы можете написать Нам:
vk.com/olympiasoft
t.me/OlympiaSoft
8-968-898-25-75