Как программно выгрузить табличную часть документа 1С в Excel без использования внешних компонент?

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

Когда мы сталкиваемся с необходимостью экспорта данных из табличной части документа 1С в формат Excel, особенно в управляемых формах и без привлечения сторонних внешних компонент, перед нами встает задача программной работы с объектом ТабличныйДокумент. Этот объект предоставляет мощные возможности для формирования печатных форм и их последующего сохранения в различные форматы, включая Excel. Мы подробно разберем, как реализовать такую выгрузку, а также упомянем готовые инструменты для сохранения данных табличных частей форм в Excel. Рассмотрим различные подходы к формированию заголовков, шапки таблицы и данных, уделяя внимание форматированию.

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

Основы работы с объектом ТабличныйДокумент для выгрузки в Excel

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

  1. Создание экземпляра ТабличныйДокумент: Первым шагом всегда будет создание нового экземпляра объекта ТабличныйДокумент.
  2. 
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДОКУМЕНТА_РЕАЛИЗАЦИЯ"; // Опционально, для сохранения настроек печати
    

    Мы инициализируем новый табличный документ, который будет выступать в качестве контейнера для наших данных перед экспортом. Свойство ИмяПараметровПечати используется, если необходимо сохранять или восстанавливать настройки печати, но для простой выгрузки это не всегда критично.

  3. Сохранение в файл Excel: После заполнения ТабличногоДокумента, мы используем метод Записать() для сохранения его в файл нужного формата.
  4. 
    ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    ДиалогСохраненияФайла.Заголовок = "Сохранить отчет";
    ДиалогСохраненияФайла.ПолноеИмяФайла = "Реализация_" + СсылкаНаДокумент.Номер + ".xlsx"; // Предлагаемое имя файла
    ДиалогСохраненияФайла.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx|Все файлы (*.*)|*.*";
    
    Если ДиалогСохраненияФайла.Выбрать() Тогда
        ПолноеИмяФайла = ДиалогСохраненияФайла.ПолноеИмяФайла;
        ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
        Сообщить("Отчет успешно сохранен в " + ПолноеИмяФайла);
    Иначе
        Сообщить("Сохранение отчета отменено.");
    КонецЕсли;
    

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

Способ 1: Формирование Excel с использованием макета

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

  1. Создание макета в конфигураторе: Мы создадим новый макет для нашего документа. В нем мы определим именованные области: "Заголовок", "Шапка", "СтрокаДанных". Это позволит в дальнейшем легко масштабировать решение, например, если потребуется реализовать печать любой печатной формы, зарегистрированной в БСП, для любой конфигурации.
  2. Например, в области "Заголовок" можно разместить текст "Отчет по реализации товаров и услуг" и параметр [ТекстДокумента]. В области "Шапка" — заголовки колонок "Номенклатура", "Количество", "Цена", "Сумма". А в области "СтрокаДанных" — параметры [НоменклатураНаименование], [Количество], [Цена], [Сумма].

  3. Программное заполнение ТабличногоДокумента с использованием макета: Теперь, когда макет готов, мы можем использовать его для вывода данных.
  4. 
    Макет = ПолучитьМакет("МакетДляВыгрузки"); // Предполагаем, что имя макета 'МакетДляВыгрузки'
    ТабДок = Новый ТабличныйДокумент;
    
    // Вывод заголовка
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьЗаголовок.Параметры.ТекстДокумента = "Отчет по реализации товаров и услуг"; // Заполняем параметр макета
    ОбластьЗаголовок.Параметры.ДокументНомер = СсылкаНаДокумент.Номер;
    ОбластьЗаголовок.Параметры.ДокументДата = Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
    ТабДок.Вывести(ОбластьЗаголовок);
    
    // Вывод шапки таблицы
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("Шапка");
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    
    // Вывод данных из табличной части
    ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаДанных");
    Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
        ОбластьСтроки.Параметры.НоменклатураНаименование = СтрокаТЧ.Номенклатура.Наименование;
        ОбластьСтроки.Параметры.Количество = СтрокаТЧ.Количество;
        ОбластьСтроки.Параметры.Цена = СтрокаТЧ.Цена;
        ОбластьСтроки.Параметры.Сумма = СтрокаТЧ.Сумма;
        ТабДок.Вывести(ОбластьСтроки);
    КонецЦикла;
    
    // Далее код сохранения ТабДок в файл Excel, как показано выше
    // ...
    

    Мы используем метод ПолучитьМакет() для получения ссылки на наш макет. Заполнение параметров и вывод областей обеспечивают чистоту кода и легкость в модификации внешнего вида отчета, поскольку все изменения форматирования вносятся непосредственно в макет.

Способ 2: Формирование Excel без использования макета (полностью программно)

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

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

  1. Подготовка ТабличногоДокумента и заголовков: Мы начинаем с создания экземпляра ТабличногоДокумента и сразу приступаем к формированию заголовка отчета.
  2. 
    ТабДок = Новый ТабличныйДокумент;
    
    // Заголовок отчета
    ОбластьЗаголовок = ТабДок.Области.ПолучитьОбласть(1, 1, 1, 4); // Строка 1, колонки с 1 по 4
    ОбластьЗаголовок.Текст = "Отчет по реализации товаров и услуг";
    ОбластьЗаголовок.Шрифт = Новый Шрифт("Arial", 12, Истина); // Жирный, размер 12pt
    ОбластьЗаголовок.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
    ОбластьЗаголовок.Объединить(); // Объединяем ячейки
    ТабДок.Вывести(ОбластьЗаголовок); // Выводим объединенную область в ТабличныйДокумент
    
    // Информация о документе
    ОбластьИнфоДокумента = ТабДок.Области.ПолучитьОбласть(2, 1, 2, 4); // Строка 2, колонки с 1 по 4
    ОбластьИнфоДокумента.Текст = "Документ № " + СсылкаНаДокумент.Номер + " от " + Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
    ОбластьИнфоДокумента.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
    ОбластьИнфоДокумента.Объединить();
    ТабДок.Вывести(ОбластьИнфоДокумента);
    
    // Мы также можем установить ширину колонок для лучшего отображения
    ТабДок.УстановитьШиринуКолонки(1, 30); // Ширина первой колонки 30 символов
    ТабДок.УстановитьШиринуКолонки(2, 10); // Ширина второй колонки 10 символов
    ТабДок.УстановитьШиринуКолонки(3, 15);
    ТабДок.УстановитьШиринуКолонки(4, 15);
    

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

  3. Формирование шапки таблицы с форматированием: Далее мы перейдем к созданию заголовков колонок табличной части.
  4. 
    СтрокаШапки = 4; // Начинаем выводить шапку с 4-й строки
    НомераКолонок = Новый Соответствие; // Для удобства определения колонок по их заголовкам
    
    ЗаголовкиКолонокТЧ = Новый Массив;
    ЗаголовкиКолонокТЧ.Добавить("Номенклатура");
    ЗаголовкиКолонокТЧ.Добавить("Количество");
    ЗаголовкиКолонокТЧ.Добавить("Цена");
    ЗаголовкиКолонокТЧ.Добавить("Сумма");
    
    Для ИндексКолонки = 0 По ЗаголовкиКолонокТЧ.ВГраница() Цикл
        НомерТекущейКолонки = ИндексКолонки + 1;
        ТекстЗаголовка = ЗаголовкиКолонокТЧ[ИндексКолонки];
    
        // Получаем область для текущей ячейки шапки
        ОбластьЯчейкиШапки = ТабДок.Области.ПолучитьОбласть(СтрокаШапки, НомерТекущейКолонки, СтрокаШапки, НомерТекущейКолонки);
        ОбластьЯчейкиШапки.Текст = ТекстЗаголовка;
        ОбластьЯчейкиШапки.Шрифт = Новый Шрифт("Arial", 10, Истина); // Жирный, 10pt
        ОбластьЯчейкиШапки.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
        ОбластьЯчейкиШапки.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
                
        // Устанавливаем границы для ячейки
        ОбластьЯчейкиШапки.ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиШапки.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиШапки.ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиШапки.ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
                
        ТабДок.Вывести(ОбластьЯчейкиШапки); // Выводим ячейку в ТабличныйДокумент
        НомераКолонок.Вставить(ТекстЗаголовка, НомерТекущейКолонки); // Сохраняем номера колонок для данных
    КонецЦикла;
    

    Для каждой колонки мы устанавливаем границы с помощью объектов Линия. Объект Соответствие помогает нам в дальнейшем точно определять, в какую колонку выводить данные.

  5. Вывод данных табличной части: После шапки мы приступаем к выводу непосредственно данных.
  6. 
    ТекущаяСтрокаДанных = СтрокаШапки + 1; // Данные начинаем выводить со следующей строки после шапки
    
    Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
        // Вывод Номенклатуры
        ОбластьЯчейкиДанных = ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДанных, НомераКолонок.Получить("Номенклатура"));
        ОбластьЯчейкиДанных.Текст = СтрокаТЧ.Номенклатура.Наименование;
        // Применяем те же границы, что и для шапки
        ОбластьЯчейкиДанных.ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиДанных.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиДанных.ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиДанных.ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ТабДок.Вывести(ОбластьЯчейкиДанных);
    
        // Вывод Количества
        ОбластьЯчейкиДанных = ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДанных, НомераКолонок.Получить("Количество"));
        ОбластьЯчейкиДанных.Текст = СтрокаТЧ.Количество;
        ОбластьЯчейкиДанных.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право; // Числовые данные обычно выравниваются по правому краю
        ОбластьЯчейкиДанных.ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиДанных.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиДанных.ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ОбластьЯчейкиДанных.ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
        ТабДок.Вывести(ОбластьЯчейкиДанных);
                
        // Аналогично для Цены и Суммы...
        ТекущаяСтрокаДанных = ТекущаяСтрокаДанных + 1; 
    КонецЦикла;
    

    Мы проходим по каждой строке табличной части, задаем выравнивание для числовых значений и применяем границы. После этого выводим каждую ячейку в ТабличныйДокумент.

  7. Оптимизация и дополнительные возможности:

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

← На главную