При работе в конфигурациях 1С (особенно в классических решениях вроде УПП 1.3 на обычных формах) пользователи часто сталкиваются с необходимостью выгрузить отчеты в сторонние форматы. Одним из самых проблемных объектов для экспорта традиционно является Диаграмма Ганта. Стандартная попытка сохранить табличный документ, содержащий этот графический элемент, в формат .xls или .xlsx приводит к разочарованию: диаграмма выгружается в виде статичной картинки, которая к тому же обрезается по границе видимой области экрана.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем доступные обходные пути и реализуем несколько практических способов выгрузки данных с сохранением визуальной структуры.
Для того чтобы найти оптимальное решение, выясним первопричину некорректного поведения платформы 1С:Предприятие при экспорте диаграмм:
ДиаграммаГанта является интерактивным векторным объектом внутри платформы. При сохранении в Excel система не может конвертировать его в аналогичный встроенный график MS Excel, поэтому просто делает «снимок» (рендеринг в картинку) и вставляет его на рабочий лист.Рассмотрим по шагам три основных метода решения этой проблемы, начиная от простых хитростей и заканчивая профессиональной выгрузкой через COM-соединение.
Если пользователям достаточно получить качественную картинку графика в Excel, но без усечения по ширине, мы можем прибегнуть к программной хитрости. Перед непосредственной записью документа в формат Excel мы принудительно увеличим ширину графического объекта в коде. Это заставит платформу отрендерить диаграмму полностью.
Разберем пример кода, реализующий этот подход:
// Предположим, что ТабличныйДокумент - это готовый отчет с диаграммой Ганта
Если ТабличныйДокумент.Рисунки.Количество() > 0 Тогда
// Получаем первый рисунок, в котором находится наша диаграмма
РисунокДиаграммы = ТабличныйДокумент.Рисунки[0];
// Сохраняем исходные размеры для последующего восстановления
ИсходнаяШирина = РисунокДиаграммы.Ширина;
// Программно увеличиваем ширину рисунка в несколько раз (коэффициент подбирается экспериментально)
// Это заставит платформу 1С развернуть временную шкалу на всю реальную длину
РисунокДиаграммы.Ширина = РисунокДиаграммы.Ширина * 5;
// Настраиваем параметры печати для корректного размещения
ТабличныйДокумент.Автомасштаб = Истина;
// Производим запись в файл Excel
ПутьКФайлу = "C:\Выгрузка\ДиаграммаГанта.xlsx";
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
// Возвращаем исходную ширину объекту в форме, чтобы не испортить визуал пользователю
РисунокДиаграммы.Ширина = ИсходнаяШирина;
Предупреждение("Файл успешно сохранен в: " + ПутьКФайлу);
КонецЕсли;
Важное примечание: Этот метод прост в реализации, однако он по-прежнему оставляет диаграмму обычной картинкой. Пользователи не смогут удалять отдельные строки в Excel так, чтобы график автоматически перестраивался.
Если бизнес-требования жестко настаивают на возможности редактирования данных в Excel (например, ручное удаление ненужных строк или корректировка дат с автоматическим перестроением полос Ганта), нам придется отказаться от экспорта картинки из 1С. Вместо этого мы выгрузим в Excel «сырые» данные и программно построим на их основе оригинальную диаграмму Excel средствами VBA.
Для создания диаграммы Ганта в Excel чаще всего используется линейчатая диаграмма с накоплением (Stacked Bar Chart). Алгоритм выглядит следующим образом:
Давайте проанализируем пример кода на языке 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, диаграмма мгновенно перестроится автоматически.
Еще один популярный и отказоустойчивый метод — построение «псевдодиаграммы» Ганта непосредственно в ячейках Excel с помощью заливки фоновым цветом. Для этого в шапке таблицы формируется календарная шкала (например, дни месяца), а ячейки на пересечении строки задачи и дня окрашиваются в нужный цвет, если этот день попадает в интервал выполнения задачи.
Для реализации этого метода можно использовать встроенный механизм Условного форматирования Excel через COM, либо красить ячейки напрямую из 1С при формировании отчета:
// Заливка ячеек цветом в цикле 1С при выгрузке в Excel
Для СтолбецПериода = НачальныйСтолбец По КонечныйСтолбец Цикл
ТекущаяДатаСтолбца = ПолучитьДатуСтолбца(СтолбецПериода);
Если ТекущаяДатаСтолбца >= ДатаНачалаЗадачи И ТекущаяДатаСтолбца <= ДатаОкончанияЗадачи Тогда
// Окрашиваем ячейку в синий цвет (код цвета подбирается по палитре Excel)
Лист.Cells(ТекущаяСтрока, СтолбецПериода).Interior.Color = 16711680;
КонецЕсли;
КонецЦикла;
Такой подход полностью решает проблему «обрезанных картинок» и позволяет легко масштабировать и распечатывать полученный файл Excel штатными средствами офисного пакета.
Часто пользователи просят выгрузку в Excel просто потому, что интерфейс диаграммы Ганта в старых версиях 1С не позволял делать быстрые интерактивные отборы и скрывать ненужные строки «на лету» прямо на форме отчета.
Если вы планируете переходить на современные версии платформы (начиная с версии 8.3.21 и выше), обратите внимание на следующие встроенные улучшения, которые могут полностью избавить вас от необходимости выгрузки в Excel:
Применяйте описанные методики в зависимости от требований ваших пользователей: используйте быстрый хак с масштабированием рисунка для простых отчетов или реализуйте выгрузку через COM/OLE для построения полноценных интерактивных моделей планирования.