Сохранение печатных форм в формат Excel — одна из самых частых задач, с которыми сталкивается разработчик 1С. Это необходимо для дальнейшего анализа данных пользователями, отправки отчетов по почте или интеграции с другими системами. В данной статье мы подробно разберем, как реализовать этот функционал, начиная от простых встроенных методов платформы и заканчивая сложными манипуляциями через COM-объекты.
В версии 1С 7.7 задача решается достаточно лаконично. Если у нас уже сформирована таблица (объект типа Таблица), мы можем воспользоваться методом Записать. Проанализируем пример кода, где отчет сохраняется сразу после формирования:
// Пример для 1С 7.7
Таб = СоздатьОбъект("Таблица");
// ... здесь идет код формирования печатной формы ...
ПутьКФайлу = "C:\Reports\Torg12.xls";
// Второй параметр "1" указывает на формат Excel
Таб.Записать(ПутьКФайлу, 1);
Важно помнить, что в 7.7 формат Excel ограничен старыми спецификациями. Если требуется более качественная конвертация «пиксель-в-пиксель», разработчики часто прибегают к использованию внешней компоненты Йоксель, которая позволяет более точно управлять параметрами экспорта.
В современных версиях платформы (8.2, 8.3) основным объектом является ТабличныйДокумент. Метод Записать стал более гибким и поддерживает множество форматов. Рассмотрим, как программно сохранить форму в формате XLSX, который является более современным и компактным по сравнению со старым XLS.
// Пример для 1С 8.x (Управляемые и обычные формы)
ИмяФайла = "C:\Temp\ПрайсЛист.xlsx";
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Важный нюанс: при использовании ТипФайлаТабличногоДокумента.XLSX платформа формирует файл программно. Это означает, что на сервере или компьютере пользователя не обязательно должен быть установлен Microsoft Excel. Если же вы используете XLS97, учитывайте ограничение Excel на 65 536 строк.
Иногда стандартного метода Записать недостаточно, например, когда нужно объединить несколько разных отчетов в один файл Excel на разные листы. Штатными средствами 1С «склеить» листы в один XLSX нельзя, поэтому мы воспользуемся COM-соединением. Проанализируем алгоритм создания многолистового документа:
Процедура ПеренестиОтчетВКнигуExcel(ПутьКОбщейКниге, ПутьКЛистуИсточнику, ИмяНовогоЛиста, НомерПозиции) Экспорт
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен!");
Возврат;
КонецПопытки;
Эксель.Visible = Ложь;
Эксель.DisplayAlerts = Ложь;
// Открываем или создаем основную книгу
Попытка
КнигаОтчетов = Эксель.Workbooks.Open(ПутьКОбщейКниге);
Исключение
КнигаОтчетов = Эксель.Workbooks.Add();
КнигаОтчетов.SaveAs(ПутьКОбщейКниге);
КонецПопытки;
// Открываем временный файл, который мы заранее сохранили методом ТабДок.Записать()
Попытка
ЛистОтчета = Эксель.Workbooks.Open(ПутьКЛистуИсточнику);
Исключение
Эксель.Quit();
Возврат;
КонецПопытки;
// Копируем лист в основную книгу
ЛистОтчета.Worksheets(1).Name = ИмяНовогоЛиста;
ЛистОтчета.Worksheets(1).Copy(КнигаОтчетов.Worksheets(НомерПозиции));
ЛистОтчета.Close(0);
КнигаОтчетов.Save();
КнигаОтчетов.Close(-1);
Эксель.Quit();
КонецПроцедуры
Обратите внимание на обязательный вызов Эксель.Quit(). Если этого не сделать, процесс excel.exe останется в оперативной памяти («зависнет»), что может привести к утечке ресурсов на сервере приложений.
Распространенная проблема: при сохранении прайс-листов с картинками через ТабДок.Записать() изображения либо пропадают, либо файл становится аномально тяжелым (например, 100 Мб вместо 5 Мб). Выясним причину: встроенный конвертер 1С иногда некорректно упаковывает бинарные данные картинок в структуру Excel.
Для решения этой проблемы мы можем вставлять изображения напрямую через COM. Это гарантирует правильное позиционирование и значительно уменьшает размер итогового файла. Разберем по шагам пример вставки картинки в конкретную ячейку:
// Выборка содержит номенклатуру и хранилище с картинкой
Пока Выборка.Следующий() Цикл
Если ЗначениеЗаполнено(Выборка.ОсновноеИзображение) Тогда
// Сохраняем картинку из базы во временный файл
ИмяВременнойКартинки = ПолучитьИмяВременногоФайла("jpg");
КартинкаИзБазы = Выборка.ОсновноеИзображение.Хранилище.Получить();
КартинкаИзБазы.Записать(ИмяВременнойКартинки);
// Определяем ячейку, куда нужно вставить фото
Ячейка = Лист.Cells(ТекущаяСтрока, 1);
Лист.Rows(ТекущаяСтрока).RowHeight = 100; // Высота строки под картинку
// Вставляем картинку через COM
КартинкаОбъект = Лист.Pictures.Insert(ИмяВременнойКартинки);
КартинкаОбъект.Left = Ячейка.Left;
КартинкаОбъект.Top = Ячейка.Top;
// Масштабируем
КартинкаОбъект.ShapeRange.LockAspectRatio = Истина; // Сохранять пропорции
КартинкаОбъект.Height = 90;
КонецЕсли;
КонецЦикла;
Для удобства пользователя хорошим тоном считается сразу открыть сохраненный файл. В управляемом приложении 1С для этого используется метод ЗапуститьПриложение. Посмотрим на пример кода для кнопки «Сохранить и открыть»:
&НаКлиенте
Процедура СохранитьИОткрыть(Команда)
ИмяФайла = "D:\MyReport.xlsx";
// Код сохранения табличного документа на сервере...
// ...
ЗапуститьПриложение(ИмяФайла);
КонецПроцедуры
Проанализируем основные советы, которые помогут избежать ошибок при программном формировании Excel:
ТабДок.АвтоМасштаб = Истина. Это позволит пользователю сразу распечатать документ из Excel без дополнительной настройки границ.COM-объектом, используя УдалитьФайлы().Записать() на сервере сохранит файл в файловую систему сервера. Если пользователь работает через браузер, вам необходимо передать файл на клиент через ПоместитьВоВременноеХранилище и ПолучитьФайл.XLSX. Он стабильнее, поддерживает больше строк и лучше работает с объектами внутри документа.Таким образом, мы рассмотрели полный цикл работы с экспортом в Excel: от простых команд до продвинутых техник управления COM-интерфейсом. Используя эти примеры, вы сможете реализовать надежную выгрузку отчетов любой сложности.