Почему при экспорте ТабличногоДокумента в Excel файл сохраняется пустым и как его заполнить?

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

При работе с 1С у нас часто возникает задача программного выгрузки данных в формат Excel. Для этого мы обычно используем объект ТабличныйДокумент. Однако, если мы просто создадим новый экземпляр этого объекта и сразу попытаемся его записать в файл, то получим пустой Excel-файл. Давайте разберем, почему это происходит и как правильно заполнить ТабличныйДокумент перед его сохранением.

Суть проблемы, с которой столкнулся автор темы, заключается в следующем: код ТабличныйДокумент = Новый ТабличныйДокумент(); ТабличныйДокумент.Записать("C:\РОТ.XLSX", ТипФайлаТабличногоДокумента.XLSX); действительно создаст файл Excel, но он будет пустым. Почему? Потому что Новый ТабличныйДокумент() создает лишь "чистый лист" или пустой холст. Чтобы на этом холсте появились данные, их нужно туда явно поместить.

Для заполнения ТабличногоДокумента данными в 1С существует несколько основных подходов, которые мы сейчас подробно рассмотрим. Наиболее распространенным и гибким является использование макетов и их областей.

1. Использование макетов и областей для заполнения ТабличногоДокумента

Этот подход является стандартным и наиболее мощным для формирования сложных отчетов и документов. Он подразумевает, что у нас есть заранее подготовленный макет, в котором определены различные области (например, "Шапка", "Строка", "Подвал") и указаны параметры для их заполнения.

Разберем процесс по шагам:

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

Давайте посмотрим на полный пример кода, который объединяет эти шаги:


&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
    // Создаем новый пустой ТабличныйДокумент, в который будем выводить данные
    ТабличныйДокумент = Новый ТабличныйДокумент();
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ОтчетПродажи"; // Можно указать, для сохранения настроек печати

    Попытка
        // 1. Получаем макет. Предположим, что макет находится в текущей обработке или форме
        // Имя макета "МакетОтчета"
        Макет = ЭтотОбъект.ПолучитьМакет("МакетОтчета"); 

        // 2. Подготавливаем и выводим область "Шапка"
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ОбластьШапка.Параметры.НазваниеОтчета = "Сводный отчет по продажам";
        ОбластьШапка.Параметры.ПериодОтчета = "с " + Формат(НачалоПериода, "ДФ=dd.MM.yyyy") + " по " + Формат(КонецПериода, "ДФ=dd.MM.yyyy");
        ОбластьШапка.Параметры.ДатаФормирования = ТекущаяДата();
        ТабличныйДокумент.Вывести(ОбластьШапка);

        // 3. Подготавливаем данные для табличной части (имитация)
        МоиДанные = Новый ТаблицаЗначений();
        МоиДанные.Колонки.Добавить("Товар");
        МоиДанные.Колонки.Добавить("Количество");
        МоиДанные.Колонки.Добавить("Цена");
        МоиДанные.Колонки.Добавить("Сумма");

        НоваяСтрока = МоиДанные.Добавить();
        НоваяСтрока.Товар = "Компьютер";
        НоваяСтровая.Количество = 5;
        НоваяСтрока.Цена = 50000;
        НоваяСтрока.Сумма = 250000;

        НоваяСтрока = МоиДанные.Добавить();
        НоваяСтрока.Товар = "Монитор";
        НоваяСтрока.Количество = 10;
        НоваяСтрока.Цена = 15000;
        НоваяСтрока.Сумма = 150000;

        НоваяСтрока = МоиДанные.Добавить();
        НоваяСтрока.Товар = "Мышь";
        НоваяСтрока.Количество = 20;
        НоваяСтрока.Цена = 1000;
        НоваяСтрока.Сумма = 20000;

        // 4. Выводим табличную часть (область "СтрокаТаблицы")
        ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");
        ВсегоСумма = 0;
        Для Каждого СтрокаДанных Из МоиДанные Цикл
            ОбластьСтрока.Параметры.Товар = СтрокаДанных.Товар;
            ОбластьСтрока.Параметры.Количество = СтрокаДанных.Количество;
            ОбластьСтрока.Параметры.Цена = СтрокаДанных.Цена;
            ОбластьСтрока.Параметры.Сумма = СтрокаДанных.Сумма;
            ТабличныйДокумент.Вывести(ОбластьСтрока);
            ВсегоСумма = ВсегоСумма + СтрокаДанных.Сумма;
        КонецЦикла;

        // 5. Подготавливаем и выводим область "Подвал" или "Итоги"
        ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
        ОбластьПодвал.Параметры.ИтоговаяСумма = ВсегоСумма;
        ТабличныйДокумент.Вывести(ОбластьПодвал);

        // 6. Указываем путь для сохранения файла
        ИмяФайла = "C:\ОтчетПродажи_" + Формат(ТекущаяДата(), "ДФ=ггггММдд_ччммсс") + ".xlsx";

        // 7. Сохраняем заполненный ТабличныйДокумент в файл Excel
        ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
        Сообщить("Файл успешно сохранен: " + ИмяФайла);

    Исключение
        Сообщить("Ошибка при выгрузке в Excel: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Для того чтобы приведенный выше код работал, нам необходимо создать макет с именем "МакетОтчета", который будет содержать области "Шапка", "СтрокаТаблицы" и "Подвал" со следующими параметрами:

  1. Область "Шапка": параметры [НазваниеОтчета], [ПериодОтчета], [ДатаФормирования].
  2. Область "СтрокаТаблицы": параметры [Товар], [Количество], [Цена], [Сумма].
  3. Область "Подвал": параметр [ИтоговаяСумма].

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

2. Прямое заполнение ячеек ТабличногоДокумента

Для более простых случаев, когда у нас нет сложной структуры с шапками и подвалами, или когда требуется точечно заполнить определенные ячейки, мы можем обращаться к ячейкам ТабличногоДокумента напрямую по их координатам (номеру строки и колонки). Это менее гибко для больших объемов данных, но может быть полезно.

Рассмотрим, как это работает:

  1. Обращение к ячейке. Мы можем получить доступ к отдельной ячейке с помощью метода ПолучитьЯчейку(), указав номер строки и колонки или ее строковое представление (например, "R1C1" для A1).
  2. Установка значения. После получения ячейки мы можем установить ее текст, числовое значение, формат и другие свойства.

ТабличныйДокумент = Новый ТабличныйДокумент();

// Установка заголовка в ячейку A1
ТабличныйДокумент.Область("R1C1").Текст = "Мой простой отчет";
ТабличныйДокумент.Область("R1C1").Шрифт = Новый Шрифт("Arial", 12, Истина); // Жирный шрифт
ТабличныйДокумент.Область("R1C1").ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

// Установка значений в ячейки
ТабличныйДокумент.Область("R2C1").Текст = "Товар";
ТабличныйДокумент.Область("R2C2").Текст = "Количество";
ТабличныйДокумент.Область("R2C3").Текст = "Цена";

ТабличныйДокумент.Область("R3C1").Текст = "Карандаш";
ТабличныйДокумент.Область("R3C2").Текст = 100;
ТабличныйДокумент.Область("R3C3").Текст = 5;

// Пример установки числового формата
ТабличныйДокумент.Область("R3C3").Формат = "ЧЦ=15; ЧДЦ=2";

ТабличныйДокумент.Записать("C:\ПростойОтчет.XLSX", ТипФайлаТабличногоДокумента.XLSX);

Этот метод подходит для небольших и простых таблиц, где не требуется сложное форматирование, которое удобнее задать в макете.

3. Использование ПостроителяОтчета

Для выгрузки табличных данных (например, из ТаблицыЗначений или результата запроса) в ТабличныйДокумент без предварительного создания макета можно использовать объект ПостроительОтчета. Он позволяет автоматически сформировать ТабличныйДокумент на основе структуры данных.

Рассмотрим основные шаги:

  1. Инициализация ПостроителяОтчета. Создаем новый экземпляр ПостроительОтчета.
  2. Установка источника данных. В качестве источника данных можно использовать ТаблицуЗначений, результат запроса или другие табличные данные.
  3. Настройка полей. Мы можем указать, какие поля должны быть выведены и в каком порядке.
  4. Формирование ТабличногоДокумента. ПостроительОтчета может сам сформировать ТабличныйДокумент, который затем можно сохранить.

ТабличныйДокумент = Новый ТабличныйДокумент();

// 1. Создаем ТаблицуЗначений с данными
МоиДанные = Новый ТаблицаЗначений();
МоиДанные.Колонки.Добавить("Товар");
МоиДанные.Колонки.Добавить("Количество");
МоиДанные.Колонки.Добавить("Цена");
МоиДанные.Колонки.Добавить("Сумма");

НоваяСтрока = МоиДанные.Добавить();
НоваяСтрока.Товар = "Компьютер";
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 50000;
НоваяСтрока.Сумма = 250000;

НоваяСтрока = МоиДанные.Добавить();
НоваяСтрока.Товар = "Монитор";
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 15000;
НоваяСтрока.Сумма = 150000;

// 2. Создаем ПостроительОтчета
ПостроительОтчета = Новый ПостроительОтчета();
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(МоиДанные);

// 3. Добавляем поля отчета
ПостроительОтчета.ДобавитьПоле("Товар", "Товар");
ПостроительОтчета.ДобавитьПоле("Количество", "Количество");
ПостроительОтчета.ДобавитьПоле("Цена", "Цена");
ПостроительОтчета.ДобавитьПоле("Сумма", "Сумма");

// 4. Устанавливаем макет вывода (можно не указывать, тогда будет использоваться стандартный)
// ПостроительОтчета.Макет = ПолучитьМакет("МакетПостроителя"); 

// 5. Формируем ТабличныйДокумент
ТабличныйДокумент = ПостроительОтчета.СкомпоноватьРезультат();

// 6. Записываем сформированный ТабличныйДокумент в файл
ТабличныйДокумент.Записать("C:\ОтчетПостроителя.XLSX", ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Файл сформирован ПостроителемОтчета: C:\ОтчетПостроителя.XLSX");

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

Важные аспекты и нюансы

  1. Очистка ТабличногоДокумента. Если мы используем один и тот же объект ТабличныйДокумент для нескольких выгрузок или формируем его в несколько этапов, мы можем захотеть очистить его содержимое перед новым заполнением с помощью метода Очистить(). Однако, при создании нового Новый ТабличныйДокумент() это не требуется, так как он изначально пуст.
  2. Сохранение форматирования и формул. При использовании макетов, все форматирование (цвета, шрифты, границы ячеек), а также формулы, заданные в макете, будут перенесены в итоговый Excel-файл. Это делает макеты очень мощным инструментом.
  3. Работа с COM-объектами Excel. В некоторых особо сложных случаях, когда требуется очень тонкая настройка Excel (например, работа с VBA-макросами, специальными функциями Excel, построение диаграмм), может потребоваться использование COM-объектов Excel напрямую. Однако, это значительно усложняет код и привязывает его к установленной на клиентском компьютере версии Excel, поэтому такой подход применяется реже и только в случаях, когда стандартные возможности ТабличногоДокумента недостаточны.
  4. Ошибки и исключения. Всегда рекомендуется заключать код выгрузки в блок Попытка...Исключение...КонецПопытки, чтобы корректно обрабатывать возможные ошибки, например, отсутствие прав доступа к папке для сохранения файла или ошибки при работе с данными.

Итак, мы выяснили, что создание пустого файла Excel при программной выгрузке ТабличногоДокумента является ожидаемым поведением, если мы не предприняли шаги по его заполнению. Для успешной выгрузки необходимо предварительно наполнить ТабличныйДокумент данными, используя один из рассмотренных методов: через макеты и области, прямое обращение к ячейкам или с помощью ПостроителяОтчета. Наиболее гибким и распространенным способом является работа с макетами, позволяющая создавать сложные и хорошо отформатированные документы.

← На главную