Как корректно сохранить диаграмму Ганта из 1С в Excel без обрезки графиков?

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

При работе в конфигурациях 1С (особенно в классических решениях вроде УПП 1.3 на обычных формах) пользователи часто сталкиваются с необходимостью выгрузить отчеты в сторонние форматы. Одним из самых проблемных объектов для экспорта традиционно является Диаграмма Ганта. Стандартная попытка сохранить табличный документ, содержащий этот графический элемент, в формат .xls или .xlsx приводит к разочарованию: диаграмма выгружается в виде статичной картинки, которая к тому же обрезается по границе видимой области экрана.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем доступные обходные пути и реализуем несколько практических способов выгрузки данных с сохранением визуальной структуры.

Почему стандартный экспорт в Excel работает некорректно?

Для того чтобы найти оптимальное решение, выясним первопричину некорректного поведения платформы 1С:Предприятие при экспорте диаграмм:

  1. Преобразование в растр: Элемент управления ДиаграммаГанта является интерактивным векторным объектом внутри платформы. При сохранении в Excel система не может конвертировать его в аналогичный встроенный график MS Excel, поэтому просто делает «снимок» (рендеринг в картинку) и вставляет его на рабочий лист.
  2. Эффект «видимой области»: Рендеринг картинки происходит на основе экранного представления. Если диаграмма длинная и уходит далеко за правый край монитора, платформа захватит только ту часть, которая отображалась в форме в момент вызова команды записи. Все, что осталось за кадром, бесследно исчезает.
  3. Ограничения сетки: При попытках сформировать диаграмму ячейками табличного документа 1С для последующей конвертации часто превышаются лимиты Excel по количеству колонок (особенно если шаг шкалы времени выбран мелкий — например, часы или дни на годовом интервале).

Рассмотрим по шагам три основных метода решения этой проблемы, начиная от простых хитростей и заканчивая профессиональной выгрузкой через COM-соединение.

Способ 1. Программный лайфхак с искусственным масштабированием

Если пользователям достаточно получить качественную картинку графика в Excel, но без усечения по ширине, мы можем прибегнуть к программной хитрости. Перед непосредственной записью документа в формат Excel мы принудительно увеличим ширину графического объекта в коде. Это заставит платформу отрендерить диаграмму полностью.

Разберем пример кода, реализующий этот подход:


// Предположим, что ТабличныйДокумент - это готовый отчет с диаграммой Ганта
Если ТабличныйДокумент.Рисунки.Количество() > 0 Тогда
    
    // Получаем первый рисунок, в котором находится наша диаграмма
    РисунокДиаграммы = ТабличныйДокумент.Рисунки[0];
    
    // Сохраняем исходные размеры для последующего восстановления
    ИсходнаяШирина = РисунокДиаграммы.Ширина;
    
    // Программно увеличиваем ширину рисунка в несколько раз (коэффициент подбирается экспериментально)
    // Это заставит платформу 1С развернуть временную шкалу на всю реальную длину
    РисунокДиаграммы.Ширина = РисунокДиаграммы.Ширина * 5; 
    
    // Настраиваем параметры печати для корректного размещения
    ТабличныйДокумент.Автомасштаб = Истина;
    
    // Производим запись в файл Excel
    ПутьКФайлу = "C:\Выгрузка\ДиаграммаГанта.xlsx";
    ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
    
    // Возвращаем исходную ширину объекту в форме, чтобы не испортить визуал пользователю
    РисунокДиаграммы.Ширина = ИсходнаяШирина;
    
    Предупреждение("Файл успешно сохранен в: " + ПутьКФайлу);
КонецЕсли;

Важное примечание: Этот метод прост в реализации, однако он по-прежнему оставляет диаграмму обычной картинкой. Пользователи не смогут удалять отдельные строки в Excel так, чтобы график автоматически перестраивался.

Способ 2. Полноценное построение графика в Excel через COM/OLE

Если бизнес-требования жестко настаивают на возможности редактирования данных в Excel (например, ручное удаление ненужных строк или корректировка дат с автоматическим перестроением полос Ганта), нам придется отказаться от экспорта картинки из 1С. Вместо этого мы выгрузим в Excel «сырые» данные и программно построим на их основе оригинальную диаграмму Excel средствами VBA.

Для создания диаграммы Ганта в Excel чаще всего используется линейчатая диаграмма с накоплением (Stacked Bar Chart). Алгоритм выглядит следующим образом:

  1. Выгружаем три колонки данных: Название задачи, Дата начала (в числовом формате Excel) и Длительность в днях.
  2. Создаем диаграмму с накоплением, где первый ряд — это дата старта, а второй — длительность.
  3. Программно делаем первый ряд данных прозрачным (убираем заливку и границы). На экране остаются только отрезки второго ряда, которые визуально и образуют диаграмму Ганта.

Давайте проанализируем пример кода на языке 1С, выполняющий данную операцию через COM-соединение:


// Шаг 1. Инициализация приложения Excel
Попытка
    ExcelApp = Новый COMОбъект("Excel.Application");
Исключение
    ВызватьИсключение "Не удалось запустить MS Excel. Убедитесь, что программа установлена.";
КонецПопытки;

ExcelApp.Visible = Ложь; // Выполняем построение в фоновом режиме
Книга = ExcelApp.Workbooks.Add();
Лист = Книга.Worksheets(1);
Лист.Name = "План-график";

// Шаг 2. Заполнение заголовков и исходных данных
Лист.Cells(1, 1).Value = "Задача";
Лист.Cells(1, 2).Value = "Старт";
Лист.Cells(1, 3).Value = "Длительность (дн)";

// Заполняем строки данными (в реальной задаче здесь будет обход вашей выборки или таблицы значений)
ТаблицаЗадач = ПолучитьТаблицуЗадач(); // Ваша функция получения данных
ТекущаяСтрока = 2;

Для Каждого СтрокаДанных Из ТаблицаЗадач Цикл
    Лист.Cells(ТекущаяСтрока, 1).Value = СтрокаДанных.Наименование;
    
    // Передаем дату начала. Важно форматировать её так, чтобы Excel распознал её как дату
    Лист.Cells(ТекущаяСтрока, 2).Value = Формат(СтрокаДанных.ДатаНачала, "ДФ=dd.MM.yyyy");
    Лист.Cells(ТекущаяСтрока, 3).Value = СтрокаДанных.ДлительностьДней;
    
    ТекущаяСтрока = ТекущаяСтрока + 1;
КонецЦикла;

// Шаг 3. Создание диаграммы на листе Excel
ДиаграммыЛиста = Лист.ChartObjects();
НоваяДиаграмма = ДиаграммыЛиста.Add(300, 10, 600, 400); // Координаты размещения графика на листе
График = НоваяДиаграмма.Chart;

// Указываем тип диаграммы: Линейчатая с накоплением (xlBarStacked имеет константу 58)
График.ChartType = 58; 

// Задаем источник данных (захватываем всю нашу таблицу)
ДиапазонДанных = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ТекущаяСтрока - 1, 3));
График.SetSourceData(ДиапазонДанных);

// Шаг 4. Настройка визуализации (делаем первый ряд невидимым)
Попытка
    ПервыйРяд = График.SeriesCollection(1);
    ПервыйРяд.Format.Fill.Transparency = 1; // Полная прозрачность заливки
    ПервыйРяд.Format.Line.Visible = 0;      // Отключаем границы ряда
Исключение
    // Обработка возможных ошибок позиционирования рядов в Excel
КонецПопытки;

// Отображаем Excel пользователю после завершения всех процедур построения
ExcelApp.Visible = Истина;

Этот метод гарантирует, что пользователь получит полноценный рабочий инструмент в Excel. Если он удалит строку с задачей непосредственно на листе Excel, диаграмма мгновенно перестроится автоматически.

Способ 3. Псевдо-Гант с использованием условного форматирования

Еще один популярный и отказоустойчивый метод — построение «псевдодиаграммы» Ганта непосредственно в ячейках Excel с помощью заливки фоновым цветом. Для этого в шапке таблицы формируется календарная шкала (например, дни месяца), а ячейки на пересечении строки задачи и дня окрашиваются в нужный цвет, если этот день попадает в интервал выполнения задачи.

Для реализации этого метода можно использовать встроенный механизм Условного форматирования Excel через COM, либо красить ячейки напрямую из 1С при формировании отчета:


// Заливка ячеек цветом в цикле 1С при выгрузке в Excel
Для СтолбецПериода = НачальныйСтолбец По КонечныйСтолбец Цикл
    ТекущаяДатаСтолбца = ПолучитьДатуСтолбца(СтолбецПериода);
    
    Если ТекущаяДатаСтолбца >= ДатаНачалаЗадачи И ТекущаяДатаСтолбца <= ДатаОкончанияЗадачи Тогда
        // Окрашиваем ячейку в синий цвет (код цвета подбирается по палитре Excel)
        Лист.Cells(ТекущаяСтрока, СтолбецПериода).Interior.Color = 16711680; 
    КонецЕсли;
КонецЦикла;

Такой подход полностью решает проблему «обрезанных картинок» и позволяет легко масштабировать и распечатывать полученный файл Excel штатными средствами офисного пакета.

Альтернатива: Стоит ли вообще использовать Excel?

Часто пользователи просят выгрузку в Excel просто потому, что интерфейс диаграммы Ганта в старых версиях 1С не позволял делать быстрые интерактивные отборы и скрывать ненужные строки «на лету» прямо на форме отчета.

Если вы планируете переходить на современные версии платформы (начиная с версии 8.3.21 и выше), обратите внимание на следующие встроенные улучшения, которые могут полностью избавить вас от необходимости выгрузки в Excel:

Применяйте описанные методики в зависимости от требований ваших пользователей: используйте быстрый хак с масштабированием рисунка для простых отчетов или реализуйте выгрузку через COM/OLE для построения полноценных интерактивных моделей планирования.

← На главную