И так сразу к делу!
Пример учебно-показательный, поэтому модуль формы справочника "Контрагенты", просто "Кнопка". Выводит то что мы заполним из данных и прикреплённые фото из договоров (банально ради примера).
Всё, как можно кратко. Больше в документации "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
	|	Контрагенты.Ссылка КАК Ссылка,
	|	Контрагенты.Наименование КАК Наименование,
	|	ДоговорыКонтрагентов.Представление КАК Представление,
	|	ДоговорыКонтрагентовПрисоединенныеФайлы.Ссылка КАК СсылкаФайл
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
	|			ПРАВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентовПрисоединенныеФайлы КАК ДоговорыКонтрагентовПрисоединенныеФайлы
	|			ПО (ДоговорыКонтрагентовПрисоединенныеФайлы.ВладелецФайла = ДоговорыКонтрагентов.Ссылка)
	|		ПО (Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент)
	|ГДЕ
	|	Контрагенты.Ссылка = &Ссылка");
	
	Запрос.УстановитьПараметр("Ссылка", Контрагент );
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	ТЗ = новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("АдресХранения");
	ТЗ.Колонки.Добавить("Описание");
	
	Пока Выборка.Следующий() Цикл
		Попытка
			// ненаходит двоичные данные (фото)
			ДФ = РаботаСФайлами.ДанныеФайла(Выборка.СсылкаФайл);
			ПутьКФайлу = ПолучитьИмяВременногоФайла();
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДФ.СсылкаНаДвоичныеДанныеФайла);
			ДвоичныеДанные.Записать(ПутьКФайлу);
			АдресХранения = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор);
			
			строка_ТЗ = ТЗ.Добавить();
			строка_ТЗ.АдресХранения = АдресХранения;
			строка_ТЗ.Описание = Выборка.Представление;
			УдалитьФайлы(ПутьКФайлу);
		исключение
			продолжить
		конецПопытки
	КонецЦикла;	
	
	МассивФайлов = новый Массив;
	МассивФайлов = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТЗ);
	
	Возврат МассивФайлов;
	
КонецФункции


free-icon-important-5579098.png Не забудьте создать шаблон презентации PowerPoint или воспользуйтесь нашим из примера.  free-icon-downloading-3502665.png Шаблон презентации PowerPoint.

На этом всё!  Разбор и небольшие пояснения в видео ниже. 

  Вы можете написать Нам:  vk.com/olympiasoft    t.me/OlympiaSoft     icons8-whatsapp-100.png 8-968-898-25-75