Добрый вечер, пытаюсь открыть файл эксель программно из 1С, чтобы вывести пользователю, но 1С зависает и действия не происходит
Подскажите пожалуйста, Что я делаю не так. Заранее спасибо

```1c
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Заказ-Наряд", "Заказ-Наряд", СформироватьЗаказНаряд(МассивОбъектов, ОбъектыПечати));

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

    Функция СформироватьЗаказНаряд (МассивОбъектов, ОбъектыПечати)

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.КлючПараметровПечати = "ПараметрыПечати_ЗаказНаряд";
    ИмяФайлаДляСохранения = ";

    Для Каждого ТекущийДокумент Из МассивОбъектов Цикл

    Макет = ПолучитьМакет("ПФ_ЗаказНаряд");

    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    ТабличныйДокумент.Вывести(ОбластьМакета);

    КонецЦикла;

    ТабличныйДокумент.Записать("C:\Новая\test.xls",ТипФайлаТабличногоДокумента.XLS);

    ЗапуститьПриложение("C:\Новая\test.xls");

    Возврат ТабличныйДокумент;

    КонецФункции
```
---
Начинать надо с изменения параметров регистрации ВПФ. Свойство "Использование" команды должно быть "ВызовКлиентскогоМетода".
---
В модуле формы внешней обработки должна быть процедура Печать. В ней и работайте:

```1c
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

    КонецПроцедуры
```
---
Это все выполняется в условиях какого приложения: управляемого или обычного?
---
Управляемого
---
В таком случае вот это не рабочий код:

 ТабличныйДокумент.Записать("C:\Новая\test.xls",ТипФайлаТабличногоДокумента.XLS);

    ЗапуститьПриложение("C:\Новая\test.xls");

т.к. сервер 1С может не иметь диска C: вообще и не иметь ассоциированных с *.xls приложений.

В общем случае, вам необходимо разработать свой собственный механизм вывода на печать, типовой механизм не будет работать как вы хотите.
---
так можно же во временное хранилище записать
---
можно, но в любом случае придется переключаться в клиентский контекст.
---
База файловая или клиент-сервер?
---
Клиент - Сервер
---
Вообщем, вот эти действия:
ТабличныйДокумент.Записать("C:\Новая\test.xls",ТипФайлаТабличногоДокумента.XLS);
ЗапуститьПриложение("C:\Новая\test.xls");
Надо делать на клиенте, а не на сервере.
---
Если не прописывать директиву, то автоматически функция на сервере исполняется?
---
Вот, а то что этот код пытается сделать, это записать на сервере 1С этот файл и там же его открыть.
(7) Да, по умолчанию сервер.
---
Скажите пожалуйста еще вопрос по этой теме, я вот файл сохраняю через ТабличныйДокумент.Записать, но если файл уже есть, то обрывается запись и пишет что файл занят, как это пофиксить? Временным наименованием?
---
Если файл открыть, то не даст перезаписать. Можете перед записью проверить наличие файла

```1c
    Файл = Новый Файл(ПутьКФайлу);
    Если Файл .Существует() Тогда
    //файл есть, нужно другое имя
    Иначе
    //Файла нет, можно записывать.
    КонецЕсли;
```
---
```1c
    &НаСервере
    Функция СформироватьЗаказНаряд (МассивОбъектов, ОбъектыПечати)

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.КлючПараметровПечати = "ПараметрыПечати_ЗаказНаряд";
    ИмяФайлаДляСохранения = ";

    Для Каждого ТекущийДокумент Из МассивОбъектов Цикл

    Макет = ПолучитьМакет("ПФ_ЗаказНаряд");

    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");

    ОбластьМакета.Параметры.НомерДокумента = ТекущийДокумент.Номер;
    ОбластьМакета.Параметры.ДатаДокумента = Формат(ТекущийДокумент.Дата,"ДФ=dd.MM.yyyy");
    ОбластьМакета.Параметры.ДатаПриемаТС = Формат(ТекущийДокумент.ДатаСоздания,"ДФ=dd.MM.yyyy");
    //ОбластьМакета.Параметры.ГосНомер = Формат(ТекущийДокумент.ДатаСоздания,"ДФ=dd.MM.yyyy");

    ТабличныйДокумент.Вывести(ОбластьМакета);

    КонецЦикла;

    ЗаписатьИОткрытьФайл(ТабличныйДокумент);

    Возврат ТабличныйДокумент;

    КонецФункции

    &НаКлиенте
    Функция ЗаписатьИОткрытьФайл(ТабДок)

    ТабДок.Записать("C:\Новая\test.xls",ТипФайлаТабличногоДокумента.XLS);

    ЗапуститьПриложение("C:\Новая\test.xls");

    Возврат ";

    КонецФункции
```

Пишет что функция ЗаписатьИОткрытьФайл Неопределена
---
Нельзя с сервера вызвать клиент. С клиента на сервер можно.
---
А как тогда можно это обрисовать?
---
У Вас функция "СформироватьЗаказНаряд" возвращает ТабличныйДокумент. Если возвращает на клиент, там и прописывайте.
---
Возвращает в процедуру печать
---
Она выполняется на клиенте?
---
Директивы нету, значит на сервере
---
Начинать надо с изменения параметров регистрации ВПФ. Свойство "Использование" команды должно быть "ВызовКлиентскогоМетода".
---
```1c
    Функция СведенияОВнешнейОБработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.асЗаказНаряд"); //Указываем документ к которому делаем внешнюю печ. форму
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Заказ-Наряд"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
    ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("Информация", ");
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Заказ-Наряд", "Заказ-Наряд", "ВызовКлиентскогоМетода", Истина, "ПечатьMXL");
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации

    КонецФункции

    Функция ПолучитьТаблицуКоманд()

    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));//как будет выглядеть описание печ.формы для пользователя
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета печ.формы
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

    Возврат Команды;

    КонецФункции

    Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ")

    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;

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

    &НаКлиенте
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Заказ-Наряд", "Заказ-Наряд", СформироватьЗаказНаряд(МассивОбъектов, ОбъектыПечати));

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

    &НаКлиенте
    Функция СформироватьЗаказНаряд (МассивОбъектов, ОбъектыПечати)

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.КлючПараметровПечати = "ПараметрыПечати_ЗаказНаряд";
    ИмяФайлаДляСохранения = ";

    Для Каждого ТекущийДокумент Из МассивОбъектов Цикл

    Макет = ПолучитьМакет("ПФ_ЗаказНаряд");

    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");

    ОбластьМакета.Параметры.НомерДокумента = ТекущийДокумент.Номер;
    ОбластьМакета.Параметры.ДатаДокумента = Формат(ТекущийДокумент.Дата,"ДФ=dd.MM.yyyy");
    ОбластьМакета.Параметры.ДатаПриемаТС = Формат(ТекущийДокумент.ДатаСоздания,"ДФ=dd.MM.yyyy");
    //ОбластьМакета.Параметры.ГосНомер = Формат(ТекущийДокумент.ДатаСоздания,"ДФ=dd.MM.yyyy");

    ТабличныйДокумент.Вывести(ОбластьМакета);

    КонецЦикла;

    ТабличныйДокумент.Записать("C:\Новая\test.xls",ТипФайлаТабличногоДокумента.XLS);

    ЗапуститьПриложение("C:\Новая\test.xls");

    Возврат ТабличныйДокумент;

    КонецФункции
    (18) ВызовКлиентскогоМетода
```

Не запускается всеравно ((
---
Это внешняя печатная форма?
---
Да, внешняя печатная, нужно чтобы документ записался в эксель, открылся пользователю, но при этом не вывелся в 1С на показ
---
Тогда переделывать, делайте как написали в (18).
---
В модуле формы внешней обработки должна быть процедура Печать. В ней и работайте:

```1c
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

    КонецПроцедуры
```
---
то есть в ней и заполнять макет без возврат?
---
Необязательно, можно оставить всё как есть:

```1c
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ТабДок = ОбработкаОбъект.СформироватьЗаказНаряд(ОбъектыНазначенияМассив, Неопределено);
    // и т.д.
    КонецПроцедуры
```
---
&НаКлиенте

```1c
    {ОбщийМодуль.УправлениеПечатью.Модуль(1202)}: Метод объекта не обнаружен (Печать)
    ВнешняяОбработкаОбъект.Печать(
```
---
А не пробовали использовать

КомандаПечати.ФорматСохранения = ТипФайлаТабличногоДокумента.XLS
---
Сохраняет хорошо, при открытии уходит в цикл и зависает
---
Клиентская процедура Печать в модуле формы обработки?
---
Да
---
Не особо понимаю как он должен увидеть эту процедуру печать в модуле формы, если я её запускаю как ВПФ, не через Файл-Открыть
---
Разобрался, видимо обработка закэшировалась, иначе не могу объяснить почему в модуле форму не виделась процедура, пересохранил обработку через "Сохранить как...", всё заработало, огромное спасибо!