Как программно сохранить печатную форму документа в Excel в 1С 7.7 и 8.x

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

Сохранение печатных форм в формат Excel — одна из самых частых задач, с которыми сталкивается разработчик 1С. Это необходимо для дальнейшего анализа данных пользователями, отправки отчетов по почте или интеграции с другими системами. В данной статье мы подробно разберем, как реализовать этот функционал, начиная от простых встроенных методов платформы и заканчивая сложными манипуляциями через COM-объекты.

Базовый метод сохранения в 1С 7.7

В версии 1С 7.7 задача решается достаточно лаконично. Если у нас уже сформирована таблица (объект типа Таблица), мы можем воспользоваться методом Записать. Проанализируем пример кода, где отчет сохраняется сразу после формирования:


// Пример для 1С 7.7
Таб = СоздатьОбъект("Таблица");
// ... здесь идет код формирования печатной формы ...
ПутьКФайлу = "C:\Reports\Torg12.xls";
// Второй параметр "1" указывает на формат Excel
Таб.Записать(ПутьКФайлу, 1); 

Важно помнить, что в 7.7 формат Excel ограничен старыми спецификациями. Если требуется более качественная конвертация «пиксель-в-пиксель», разработчики часто прибегают к использованию внешней компоненты Йоксель, которая позволяет более точно управлять параметрами экспорта.

Сохранение табличного документа в 1С 8.x

В современных версиях платформы (8.2, 8.3) основным объектом является ТабличныйДокумент. Метод Записать стал более гибким и поддерживает множество форматов. Рассмотрим, как программно сохранить форму в формате XLSX, который является более современным и компактным по сравнению со старым XLS.


// Пример для 1С 8.x (Управляемые и обычные формы)
ИмяФайла = "C:\Temp\ПрайсЛист.xlsx";
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Важный нюанс: при использовании ТипФайлаТабличногоДокумента.XLSX платформа формирует файл программно. Это означает, что на сервере или компьютере пользователя не обязательно должен быть установлен Microsoft Excel. Если же вы используете XLS97, учитывайте ограничение Excel на 65 536 строк.

Работа с несколькими листами в одной книге Excel

Иногда стандартного метода Записать недостаточно, например, когда нужно объединить несколько разных отчетов в один файл 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 останется в оперативной памяти («зависнет»), что может привести к утечке ресурсов на сервере приложений.

Решение проблемы с изображениями в Excel

Распространенная проблема: при сохранении прайс-листов с картинками через ТабДок.Записать() изображения либо пропадают, либо файл становится аномально тяжелым (например, 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:

  1. Автомасштаб страницы: Перед сохранением установите свойство ТабДок.АвтоМасштаб = Истина. Это позволит пользователю сразу распечатать документ из Excel без дополнительной настройки границ.
  2. Очистка временных файлов: Если вы сохраняли картинки или промежуточные книги на диск, всегда удаляйте их после завершения работы с COM-объектом, используя УдалитьФайлы().
  3. Проверка на веб-клиенте: Метод Записать() на сервере сохранит файл в файловую систему сервера. Если пользователь работает через браузер, вам необходимо передать файл на клиент через ПоместитьВоВременноеХранилище и ПолучитьФайл.
  4. Использование XLSX: Всегда отдавайте предпочтение формату XLSX. Он стабильнее, поддерживает больше строк и лучше работает с объектами внутри документа.

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

← На главную