При выгрузке данных из платформы 1С в документы MS Excel часто возникает необходимость вставить не просто длинную и громоздкую ссылку на веб-ресурс или файл, а сделать аккуратную кликабельную подпись — например, «посмотреть», «скачать» или «открыть картинку». Если просто записать URL как строку или некорректно составить формулу, Excel либо отображает текст как обычную строку, либо выдает ошибку заполнения ячейки.
В этой статье мы подробно проанализируем причины этой проблемы, разберем рабочий синтаксис работы через COM-объект Excel.Application, а также рассмотрим альтернативные варианты решения задачи, включая создание гиперссылок через встроенный ТабличныйДокумент без применения стороннего программного обеспечения.
Рассмотрим, с чем сталкиваются разработчики при попытке прописать формулу Excel из кода 1С. Обычно предпринимаются попытки записать конструкцию вида =ГИПЕРССЫЛКА("http://site.ru"; "посмотреть") в свойства ячейки FormulaR1C1 или Value.
Здесь возникают сразу три ошибки:
Formula (или FormulaR1C1) ожидает наименования функций на английском языке (HYPERLINK) и разделитель аргументов в виде запятой. Если передать русскоязычную функцию ГИПЕРССЫЛКА с точкой с запятой, Excel не сможем распарсить формулу. Для русскоязычных наименований требуется свойство FormulaLocal."").Value Excel воспринимает её как обычный текст. Чтобы гиперссылка заработала, пользователю приходится вручную заходить в ячейку и нажимать Enter.Наиболее корректным и простым способом создания гиперссылки при работе с COM-объектом Excel.Application является прямой вызов специализированного метода коллекции Hyperlinks.Add.
Разберем синтаксис метода Hyperlinks.Add:
Лист.Hyperlinks.Add(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)
Параметры метода означают следующее:
ExcelЛист.Cells(Строка, Колонка))."").Рассмотрим практический пример реализации выгрузки на языке 1С:
ExcelПриложение = Новый COMОбъект("Excel.Application");
Попытка
Состояние("Открытие файла Microsoft Excel...");
ExcelФайл = ExcelПриложение.WorkBooks.Open(ПапкаФайла + "/" + ИмяФайла + ".xlsx");
Исключение
Сообщить("Ошибка открытия файла Microsoft Excel: " + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
ExcelЛист = ExcelФайл.Sheets(1);
Для инд = 2 По КоличествоСтрок Цикл
// Определяем ячейку для вставки
Ячейка = ExcelЛист.Cells(инд, 8);
// Формируем адрес и отображаемый текст
АдресСсылки = "http://сайт.ru/image/data/tov_foto/fors/17200.jpg";
ТекстСсылки = "посмотреть";
// Добавляем гиперссылку через штатный метод COM-объекта
ExcelЛист.Hyperlinks.Add(Ячейка, АдресСсылки, "", "", ТекстСсылки);
КонецЦикла;
ExcelФайл.Save();
ExcelПриложение.Quit();
ExcelПриложение = Неопределено;
Если по каким-либо причинам требуется записать ссылку именно через встроенную функцию Excel ГИПЕРССЫЛКА, проанализируем, как сделать это корректно. Нам потребуется использовать свойство FormulaLocal и верно экранировать кавычки:
Для инд = 2 По КоличествоСтрок Цикл
Ячейка = ExcelЛист.Cells(инд, 8);
АдресСсылки = "http://сайт.ru/image/data/tov_foto/fors/17200.jpg";
ТекстСсылки = "посмотреть";
// Формируем локализованную формулу Excel с двойными кавычками
Ячейка.FormulaLocal = "=ГИПЕРССЫЛКА(""" + АдресСсылки + """; """ + ТекстСсылки + """)";
КонецЦикла;
Обращение к методам COM-объекта в цикле на каждой строке работает достаточно медленно при обработке тысяч записей. Чтобы существенно повысить скорость работы скрипта, отключим перерисовку экрана и автоматический пересчет формул на время заполнения файла:
// Отключаем обновление экрана и автопересчет перед циклом
ExcelПриложение.ScreenUpdating = Ложь;
ExcelПриложение.Calculation = -4135; // xlCalculationManual
Для инд = 2 По КоличествоСтрок Цикл
// Выполняем заполнение ячеек и добавление ссылок
ExcelЛист.Hyperlinks.Add(ExcelЛист.Cells(инд, 8), АдресСсылки, "", "", ТекстСсылки);
КонецЦикла;
// Включаем функции обратно перед сохранением
ExcelПриложение.Calculation = -4105; // xlCalculationAutomatic
ExcelПриложение.ScreenUpdating = Истина;
ExcelФайл.Save();
ExcelПриложение.Quit();
Использование COM-объекта Excel.Application имеет важный минус: на сервере или рабочем месте пользователя обязательно должен быть установлен MS Office, а сам процесс выгрузки занимает много времени. Платформа 1С позволяет решить задачу намного быстрее с помощью встроенного объекта ТабличныйДокумент.
Выясним, как сформировать кликабельную гиперссылку в ТабличныйДокумент и сохранить его в формат XLSX:
ТабДок = Новый ТабличныйДокумент;
// Заполняем строки табличного документа
Для инд = 1 По КоличествоСтрок Цикл
ОбластьЯчейка = ТабДок.ПолучитьОбласть("R" + Формат(инд, "ЧГ=0") + "C8");
// Устанавливаем отображаемый текст
ОбластьЯчейка.ТекущаяОбласть.Текст = "посмотреть";
// Включаем режим гиперссылки
ОбластьЯчейка.ТекущаяОбласть.Гиперссылка = Истина;
// Помещаем адрес ссылки в параметр расшифровки или непосредственно в свойство
ОбластьЯчейка.ТекущаяОбласть.ПараметрРасшифровки = "http://сайт.ru/image/data/tov_foto/fors/17200.jpg";
КонецЦикла;
// Сохраняем результат в файл формата Excel без вызова COM
ТабДок.Записать(ПапкаФайла + "/" + ИмяФайла + ".xlsx", ТипФайлаТабличногоДокумента.XLSX);
Мы проанализировали основные подходы к формированию гиперссылок при экспорте данных из 1С в Excel. При работе через COM-соединение наиболее надежным и лаконичным решением является метод ExcelЛист.Hyperlinks.Add(). Однако для высоконагруженных систем и серверных процедур оптимальным выбором будет применение штатного объекта ТабличныйДокумент, сохраняемого в формате XLSX напрямую.