Доброго времени суток! Подскажите, как можно создать Excel файл в модуле объекта обработки и возможно ли это вообще? Программно нужно создать файл, с названиями колонок, типами. Раньше создавал на форме объекта с помощью COMОбъект. Сейчас возникла необходимость перебраться в модуль объекта. Спасибо!
---
Тут Вы не правы.
Можно создать Excel файл в несколько листов из Табличных документов.
Смотреть нужно в сторону: ПакетОтображаемыхДокументов
и есть хорошая статья: https://infostart.ru/public/979007/
---
если файл простой, без всяких там формул и макросов...то можно создать обычный табличный документ, и просто сохранить его в формате экселя.
---
А именно Excel можно как-нибудь? Просто у меня файл из 3 листов. Или как можно реализовать табличный документ в 3 листа? Спасибо!
---
Сделать с табличный документом ни как. Только если 3 табличных документа с тремя документами. Создать excel в модуле объекта можно
---
Тут Вы не правы.
Можно создать Excel файл в несколько листов из Табличных документов.
Смотреть нужно в сторону: ПакетОтображаемыхДокументов
и есть хорошая статья: https://infostart.ru/public/979007/
---
спасибо! не знал, возьму на заметку к себе
---
Спасибо! Все получилось
---
Подскажите как можно задать имена листам в получившемся файле?
---
Ну вы батенька и ЛЕНТЯЙ!

ЭлементПакетаОтображаемыхДокументов (RepresentableDocumentBatchItem)
Наименование (Title)
Использование:

Чтение и запись.
Описание:

Тип: Строка.
Наименование элемента пакета отображаемых документов. При сохранении пакета отображаемых документов в формате XLS, XLSX, ODS значение данного поля используется в качестве имени листа итогового документа.
Следующие символы при записи будут заменены на символ подчеркивания "_":
":", "/", "\", "?", "*", "[", "]", "`".

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:

Если длина значения превышает 31 символ, при записи она будет сокращена до 31 символа.
(17)
---
что мешает создавать также, как и раньше, только процедуру перенести в модуль объекта, ну и соответственно все это будет на сервере уже происходить.
---
Поддержу. Com объект доступен в модуле объекта
---
Конечно же можно

```1c
    Процедура СоздатьComОбъектExcel()

    Excel = Новый COMОбъект("Excel.Application");

    КонецПроцедуры
```

Но вы должны понимать что у вас на сервере должен быть установлены компоненты excel.
И другое а действительно почему бы не создать табличный документ - заполнить его а затем просто сохранить в формате excel
---
Да, я не уточнил, на сервере не установлены компоненты excel и устанавливаться не будут(
---
тогда ни как, единственно может все таки и поможет создать табличный документ и сохранить его в формате excel. Не знаю как поведет себя программа
---
можно использовать win OLEDB драйвер excel, обычно они или уже установлены в win или их можно доустановить
разумеется, если сервер на win

например, что-то типа такого

```1c
    // создадим XLS-файл
    Если Настройки.СохранитьКакКнигаExcel97_2003 Тогда
    СтрокаПодключения = "
    |Provider = Microsoft.Jet.OLEDB.4.0;
    |Data Source = " + пДокументXLS + ".xls;
    |Extended Properties = "Excel 8.0;HDR=Yes"";
    Иначе
    СтрокаПодключения = "
    |Provider = Microsoft.ACE.OLEDB.12.0;
    |Data Source = " + пДокументXLS + ".xlsx;
    |Extended Properties = "Excel 12.0 Xml;HDR=Yes"";
    КонецЕсли;

    Catalog = Новый COMОбъект("ADOX.Catalog");
    Catalog.ActiveConnection = СтрокаПодключения;

    // формирование таблицы файла
    Table = Новый COMОбъект("ADOX.Table");
    Table.Name = "Лист1";

    лЧислоКолонокФайла = 0;
    Для Каждого Колонка Из лСтруктураТипаОбъектовXLS["РеквизитыТипаОбъектовXLS"] Цикл
    Table.Columns.Append(Колонка.ИмяРеквизитаXLS);
    лЧислоКолонокФайла = лЧислоКолонокФайла + 1;
    КонецЦикла;

    // открываем таблицу на запись данных
    Catalog.Tables.Append(Table);

    Table = Неопределено;
    Catalog = Неопределено;

    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(СтрокаПодключения);

    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;

    // формируем строку запроса для вставки данных в строку таблицы
    Для Каждого лСтрокаДанных Из пДанные Цикл

    лТекстЗначенийКолонок = " VALUES ('";

    Для Каждого лСтрокаРеквизита Из лСтруктураТипаОбъектовXLS["РеквизитыТипаОбъектовXLS"] Цикл

    лТипДанныхXLS = лСтрокаРеквизита.ТипДанныхXLS;

    // необязательные реквизиты получаем только если для них задано соответствие
    Если НЕ лСтрокаРеквизита.Обязательный Тогда
    // просто добавим пустое значение для сходимости числа параметров и значений запроса установки данных в таблицу
    Если лСтрокаРеквизита.ИмяРеквизита = " Тогда
    лТипДанныхXLS = "ЗНАЧЕНИЕ";
    КонецЕсли;

    // для необязательных неопределенных значений из набора данных (исключительно в рамках примера)
    Попытка
    лЗначение = лСтрокаДанных[лСтрокаРеквизита.ИмяРеквизита];
    Исключение
    лТипДанныхXLS = "ЗНАЧЕНИЕ";
    КонецПопытки;
    КонецЕсли;

    //значение реквизита XLS-объекта берется из соответствующего ему в макете реквизита набора данных
    Если лТипДанныхXLS = " Тогда
    лЗначениеРеквизита = XMLСтрока(лСтрокаДанных[лСтрокаРеквизита.ИмяРеквизита]); // используется внутреннее представление
    //значение реквизита XLS-объекта берется напрямую из макета, где оно записано в виде константы
    ИначеЕсли лТипДанныхXLS = "ЗНАЧЕНИЕ" Тогда
    лЗначениеРеквизита = лСтрокаРеквизита.ИмяРеквизита;
    //значение реквизита XLS-объекта берется из набора заранее определенных значений по умолчанию
    ИначеЕсли лТипДанныхXLS = "КОНСТАНТА" Тогда
    лЗначениеРеквизита = XLSПолучитьЗначениеПоУмолчанию(лСтрокаРеквизита.ИмяРеквизита);
    //значение реквизита XLS-объекта берется из соответствующего ему в макете реквизита набора данных и преобразуется по заданному правилу
    Иначе
    лЗначениеРеквизита = XLSПривестиЗначениеКТипу(лСтрокаДанных[лСтрокаРеквизита.ИмяРеквизита], лТипДанныхXLS);
    КонецЕсли;

    лТекстЗначенийКолонок = лТекстЗначенийКолонок + лЗначениеРеквизита + "','";

    КонецЦикла;

    лТекстЗапроса = "
    |INS ERT IN TO [Лист1]" + лТекстЗначенийКолонок;
    лТекстЗапроса = Сред(лТекстЗапроса, 1, СтрДлина(лТекстЗапроса)-2);
    лТекстЗапроса = лТекстЗапроса + ")";

    // записываем строку данных в таблицу
    Command.CommandText = лТекстЗапроса;
    Command.Execute();

    // очищаем строку запроса от данных для следующей вставки
    лТекстЗапроса = ";
    лТекстЗначенийКолонок = ";

    КонецЦикла;

    // запишем полученный файл и освободим подключение к ADO
    Command = Неопределено;
    Connection.Close();
    Connection = Неопределено;
```
---
тогда нельзя.
---
Кстати, сейчас попробыл сделать так. На сервере сфорировал отчет и сохранил его через файл - сохранить копию в excel. Отчет сохранился. На сервере я его открыть не могу ввиду того что нет excel. Открыл этот файл у себя - ексель его открывает как надо. То есть если все таки сделаете табличный документ и сохраните его в формате ексель на сервере (где нет екселя) а затем его откроете на клиенте где есть ексель - теоретически все должно получиться
---
Кстати. если есть в сети другие сервера, на которых эксель есть, то можно попробовать

```1c
    Новый COMОбъект("Excel.Application", <ИмяСервера>)
```

p/s сам не пробовал, но судя по описанию в сп должно работать.
---
Создавайте на клиенте, через двоичные данные кидайте на сервер, делов-то.