При автоматизации выгрузки данных из 1С в Excel часто возникает задача создания интерактивных отчетов. Одной из таких задач является добавление графических элементов (например, кнопок-стрелок или логотипов), при нажатии на которые пользователь перемещается на другой лист книги или открывает внешний ресурс. В этой статье мы подробно разберем, как реализовать это с помощью механизма COM-соединения.
Для решения задачи нам необходимо выполнить два последовательных действия: сначала вставить объект изображения на лист, а затем добавить этот объект в коллекцию гиперссылок листа. Рассмотрим подробнее, какие объекты и методы нам потребуются.
Для работы с Excel из 1С мы традиционно используем объект COMObject("Excel.Application"). Основная сложность заключается в том, что гиперссылка в Excel может быть привязана либо к текстовому содержимому ячейки, либо к графическому объекту (фигуре). В нашем случае «якорем» (Anchor) для ссылки будет выступать именно объект картинки.
Прежде всего, нам нужно создать экземпляр приложения Excel, добавить рабочую книгу и определить листы, с которыми мы будем работать. Проанализируем типичный код инициализации:
// Создаем объект приложения
Excel = Новый COMОбъект("Excel.Application");
// Делаем его видимым для отладки (необязательно)
Excel.Visible = Истина;
// Добавляем новую книгу или открываем существующую
Книга = Excel.Workbooks.Add();
// Получаем ссылки на листы
Лист1 = Книга.Worksheets(1);
Лист2 = Книга.Worksheets(2); // Лист, на который будем переходить
Существует несколько способов вставки картинки. Самый простой — использование метода Pictures.Insert(). Однако, если мы хотим иметь полный контроль над размерами и положением изображения, рекомендуется использовать метод Shapes.AddPicture().
Рассмотрим пример с использованием Pictures.Insert, как наиболее лаконичный для простых задач:
ПутьКФайлу = "C:\Pictures\Arrow.png";
// Вставляем картинку на первый лист
Картинка = Лист1.Pictures.Insert(ПутьКФайлу);
// Настроим положение картинки относительно ячеек
ЯчейкаДляВставки = Лист1.Cells(5, 2); // Строка 5, колонка 2
Картинка.Top = ЯчейкаДляВставки.Top;
Картинка.Left = ЯчейкаДляВставки.Left;
Важно помнить, что объект Картинка, который возвращает метод Insert, является тем самым объектом, к которому мы позже привяжем ссылку.
Теперь перейдем к самой важной части — превращению картинки в активную ссылку. Для этого используется метод Hyperlinks.Add(). Выясним причину, по которой обычная текстовая ссылка здесь не подходит: текстовая ссылка привязана к значению ячейки, а нам нужно, чтобы кликабельной была вся область изображения.
Синтаксис метода Hyperlinks.Add требует следующих параметров:
Картинка)."".Разберем пример кода для перехода на второй лист:
// Формируем адрес перехода.
// Важно: если в имени листа есть пробелы, его нужно брать в одинарные кавычки.
АдресПерехода = "'" + Лист2.Name + "'!A1";
// Добавляем гиперссылку к объекту картинки
Лист1.Hyperlinks.Add(Картинка, "", АдресПерехода);
После выполнения этого кода изображение станет интерактивным. При наведении курсора мыши он будет менять форму на «указательный палец», а при клике произойдет автоматический переход на Лист2 к ячейке A1.
В современных версиях Excel метод Pictures.Insert иногда вставляет картинку как связь с файлом. Если вы планируете передавать файл Excel другим пользователям, лучше использовать Shapes.AddPicture, чтобы внедрить изображение непосредственно в документ.
Проанализируем ситуацию, когда нам нужно жестко задать размеры изображения:
// Параметры: Путь, LinkToFile, SaveWithDocument, Left, Top, Width, Height
Картинка = Лист1.Shapes.AddPicture(ПутьКФайлу, Ложь, Истина, 100, 100, 50, 50);
// Также добавляем ссылку
Лист1.Hyperlinks.Add(Картинка, "", "'" + Лист2.Name + "'!A1");
Чтобы отчет выглядел профессионально, мы можем добавить всплывающую подсказку, которая будет появляться при наведении на картинку. Для этого используется параметр ScreenTip метода Hyperlinks.Add.
Лист1.Hyperlinks.Add(Картинка, "", АдресПерехода, "Нажмите, чтобы перейти на Лист 2");
Также полезно настроить свойство Placement, чтобы картинка корректно вела себя при изменении размеров строк и колонок. Например, значение 1 заставляет картинку перемещаться и масштабироваться вместе с ячейками, а значение 2 — только перемещаться.
Давайте объединим все наши изыскания в один готовый блок кода, который можно использовать в обработке 1С:
Процедура ДобавитьКартинкуССсылкой(ИмяФайлаКартинки)
Попытка
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист1 = Книга.Worksheets(1);
// Создадим второй лист для теста перехода
Лист2 = Книга.Worksheets.Add();
Лист2.Name = "ЦелевойЛист";
Лист1.Activate();
// Вставляем картинку
Картинка = Лист1.Pictures.Insert(ИмяФайлаКартинки);
// Позиционируем в ячейку B2
ЦелеваяЯчейка = Лист1.Cells(2, 2);
Картинка.Top = ЦелеваяЯчейка.Top;
Картинка.Left = ЦелеваяЯчейка.Left;
// Добавляем гиперссылку на Лист2
АдресВнутриКниги = "'ЦелевойЛист'!A1";
Лист1.Hyperlinks.Add(Картинка, "", АдресВнутриКниги, "Перейти к данным");
Excel.Visible = Истина;
Исключение
Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Мы рассмотрели, как с помощью 1С и технологии COM управлять графическими объектами в Excel. Ключевым моментом является использование объекта Picture или Shape в качестве первого аргумента (Anchor) метода Hyperlinks.Add. Это позволяет создавать удобные навигационные меню и интерактивные элементы управления прямо внутри ваших выгрузок, что значительно повышает удобство работы пользователей с данными.