Как выгрузить данные из 1С в Excel с текстом гиперссылки вместо длинного URL?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При выгрузке данных из платформы 1С в документы MS Excel часто возникает необходимость вставить не просто длинную и громоздкую ссылку на веб-ресурс или файл, а сделать аккуратную кликабельную подпись — например, «посмотреть», «скачать» или «открыть картинку». Если просто записать URL как строку или некорректно составить формулу, Excel либо отображает текст как обычную строку, либо выдает ошибку заполнения ячейки.

В этой статье мы подробно проанализируем причины этой проблемы, разберем рабочий синтаксис работы через COM-объект Excel.Application, а также рассмотрим альтернативные варианты решения задачи, включая создание гиперссылок через встроенный ТабличныйДокумент без применения стороннего программного обеспечения.

Причина проблемы: почему обычное присвоение формул не работает

Рассмотрим, с чем сталкиваются разработчики при попытке прописать формулу Excel из кода 1С. Обычно предпринимаются попытки записать конструкцию вида =ГИПЕРССЫЛКА("http://site.ru"; "посмотреть") в свойства ячейки FormulaR1C1 или Value.

Здесь возникают сразу три ошибки:

  1. Разница между англоязычными и локализованными формулами: Свойство Formula (или FormulaR1C1) ожидает наименования функций на английском языке (HYPERLINK) и разделитель аргументов в виде запятой. Если передать русскоязычную функцию ГИПЕРССЫЛКА с точкой с запятой, Excel не сможем распарсить формулу. Для русскоязычных наименований требуется свойство FormulaLocal.
  2. Экранирование кавычек в 1С: Строковые литералы в языке 1С требуют двойного экранирования кавычек внутри строк ("").
  3. Присвоение текстового значения вместо вычисления: При записи строки в свойство Value Excel воспринимает её как обычный текст. Чтобы гиперссылка заработала, пользователю приходится вручную заходить в ячейку и нажимать Enter.

Решение 1: Использование метода Hyperlinks.Add в COM-объекте

Наиболее корректным и простым способом создания гиперссылки при работе с COM-объектом Excel.Application является прямой вызов специализированного метода коллекции Hyperlinks.Add.

Разберем синтаксис метода Hyperlinks.Add:

Лист.Hyperlinks.Add(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)

Параметры метода означают следующее:

  1. Anchor — ячейка или диапазон ячеек, в которую помещается ссылка (например, ExcelЛист.Cells(Строка, Колонка)).
  2. Address — полный URL-адрес или путь к файлу (чистая ссылка).
  3. SubAddress — адрес внутри книги Excel (закладка или диапазон ячеек; если не требуется, передается пустая строка "").
  4. ScreenTip — текст всплывающей подсказки при наведении курсора на ссылку.
  5. TextToDisplay — текст, который будет отображаться в ячейке вместо URL-адреса (например, «посмотреть»).

Рассмотрим практический пример реализации выгрузки на языке 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Приложение = Неопределено;

Решение 2: Использование свойства FormulaLocal

Если по каким-либо причинам требуется записать ссылку именно через встроенную функцию 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();

Альтернативное решение: Выгрузка через ТабличныйДокумент 1С (без использования COM)

Использование 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 напрямую.

← На главную