Помогите разобраться.

Нужно программно открыть файл mxl на клиенте, как это делается интерактивно - файл - открыть

Передавать на сервер, там читать и передавать обратно не вариант, т.к. это уже не тот файл.
---
прямой связи нет.
У Табличного документа есть свойство "ИспользуемоеИмяФайла", в котором можно прописать имя файла, в который сохраняется документ, если пользователь выполнил команду "Сохранить". Его можно заполнить именем полученного файла на клиенте. Вот и вся связь.
---
если под "программно открыть файл mxl на клиенте" имеется ввиду прочитать в табличный документ, то в тонком клиенте никак.
То что визуально видите через файл- открыть, не отменяет обращение к серверу.

Передавать на сервер, там читать и передавать обратно не вариант, т.к. это уже не тот файл.
Что значит "уже не тот файл"?
---
Может я что-то не так понимаю, но при передаче данных с клиента на сервер и обратно теряется связь с начальным файлом.
Как мне кажется, этого не происходит при интерактивном открытии.

Или я ошибаюсь?
---
прямой связи нет.
У Табличного документа есть свойство "ИспользуемоеИмяФайла", в котором можно прописать имя файла, в который сохраняется документ, если пользователь выполнил команду "Сохранить". Его можно заполнить именем полученного файла на клиенте. Вот и вся связь.
---
вот пример, выполняющий точное соответствие при обычном открытии через файл - открыть.

```1c
    &НаКлиенте
    Процедура ОткрытьФайл(Команда)
    ОписаниеЗавершение = Новый ОписаниеОповещения("ЗавершениеПомещенияФайла", ЭтаФорма);
    ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Открытие файла",Ложь,"Табличный документ(*.mxl)|*.mxl");
    НачатьПомещениеФайлаНаСервер(ОписаниеЗавершение,,,,ПараметрыДиалога,УникальныйИдентификатор);
    КонецПроцедуры

    &НаКлиенте
    Процедура ЗавершениеПомещенияФайла(ОписаниеПомещенногоФайла, ДопПараметры) Экспорт

    Если ОписаниеПомещенногоФайла = Неопределено Тогда
    Возврат;
    КонецЕсли;

    Адрес = ОписаниеПомещенногоФайла.Адрес;
    ПутьКФайлу = ОписаниеПомещенногоФайла.СсылкаНаФайл.Файл.ПолноеИмя;
    ТабДок = Новый ТабличныйДокумент;
    ПрочитатьТабДок(ТабДок, Адрес);
    ТабДок.Показать(ПутьКФайлу, ПутьКФайлу);

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

    &НаСервере
    Функция ПрочитатьТабДок(ТабДок, Адрес)

    ДД = ПолучитьИзВременногоХранилища(Адрес);

    Поток = Новый ПотокВПамяти;
    Запись = Новый ЗаписьДанных(Поток);

    Запись.Записать(ДД);
    Запись.Закрыть();
    Поток.Перейти(0, ПозицияВПотоке.Начало);
    ТабДок.Прочитать(Поток);
    Поток.Закрыть();

    КонецФункции
```
---
Начиная с 8.3.9, функцию "ПрочитатьТабДок" из кода выше можно записать проще:

```1c
    &НаСервере
    Функция ПрочитатьТабДок(ТабДок, Адрес)

    Поток = ПолучитьИзВременногоХранилища(Адрес).ОткрытьПотокДляЧтения();
    ТабДок.Прочитать(Поток);
    Поток.Закрыть();

    КонецФункции
```
---
```1c
    &НаКлиенте
    Процедура ОткрытьMXL(Команда)

    Режим=РежимДиалогаВыбораФайла.Открытие;
    нДиалог= НОвый ДиалогВыбораФайла(Режим);
    нДиалог.ПредварительныйПросмотр = Ложь;
    Фильтр="Файл mxl (*.mxl)|*.mxl";
    нДиалог.Фильтр=Фильтр;
    нДиалог.Заголовок="Выберите файл для загрузки..." ;
    Если нДиалог.Выбрать() тогда
    ИмяФайла=нДиалог.ПолноеИмяФайла;
    иначе
    Возврат;
    КонецЕсли;

    Двоичное = Новый ДвоичныеДанные(ИмяФайла);
    Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);
    //с записью
    //ТабличныйДокумент = ПрочитатьMXLНаСервере(Адрес);
    //без записи - в потоке
    ТабличныйДокумент = ПрочитатьMXL_в_ТабДок(Адрес);
    ТабличныйДокумент.Показать(");

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

    &НаСервере
    Функция ПрочитатьMXLНаСервере(Адрес)
    ДД = ПолучитьИзВременногоХранилища(Адрес);
    ИмяФайла = ПолучитьИмяВременногоФайла("mxl"); ДД.Записать(ИмяФайла);
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Попытка
    ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    Исключение
    Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
    КонецПопытки;
    УдалитьФайлы(ИмяФайла);
    Возврат ТабличныйДокумент;
    КонецФункции

    &НаСервере
    Функция ПрочитатьMXL_в_ТабДок(Адрес)
    ТабДок = Новый ТабличныйДокумент;
    ДД = ПолучитьИзВременногоХранилища(Адрес);
    ТабДок.Прочитать(ДД.ОткрытьПотокДляЧтения(),СпособЧтенияЗначенийТабличногоДокумента.Текст,ТипФайлаТабличногоДокумента.MXL);
    Возврат ТабДок;
    КонецФункции
```
---
```1c
    &НаКлиенте
    Процедура Кнопка1Нажатие(Команда)
    ТекстовыйДокумент = Новый ТекстовыйДокумент;

    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("ТекстовыйДокумент",ТекстовыйДокумент);

    ОО = Новый ОписаниеОповещения("ТекстовыйДокумент_Прочитан",ЭтаФорма,ДопПараметры);
    ИмяФайла = "........";
    ТекстовыйДокумент.НачатьЧтение(ОО,ИмяФайла);

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

    &НаКлиенте
    Процедура ТекстовыйДокумент_Прочитан(ДопПараметры) Экспорт
    ДопПараметры.ТекстовыйДокумент.Показать();
    КонецПроцедуры
```
---
```1c
    &НаСервере
    Процедура ПрочитатьТабличныйДокументИзMXLНаСервере(АдресХранилища)

    Данные = ПолучитьИзВременногоХранилища(АдресХранилища);

    ИмяФайлаВременное = ПолучитьИмяВременногоФайла("mxl");

    Данные.Записать(ИмяФайлаВременное);
    ТабДок.Прочитать(ИмяФайлаВременное); // реквизит формы
    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());//передаем ТЗ
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    ПострЗ=ПЗ.Результат.Выгрузить();

    СоздатьТаблицуФормы("ТЗ","ТЗ",ПострЗ);

    Сообщить("Количество: " + ТЗВД.Количество());
    УдалитьФайлы(ИмяФайлаВременное);

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

    &НаКлиенте
    Процедура ПрочитатьТабДокИзMXL(ИмяФайла)

    ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

    АдресФайла = ";
    АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);

    ПрочитатьТабличныйДокументИзMXLНаСервере(АдресФайла);

    КонецПроцедуры // ()

    &НаКлиенте
    Процедура ПрочитатьMXL(Команда)
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
    ДиалогВыбораФайла.Фильтр = "Табличный документ (*.mxl)|*.mxl|Лист Excel (*.xls)|*.xls|Текстовый документ (*.txt)|*.txt|dBase III (*.dbf)|*.dbf|";
    Если ДиалогВыбораФайла.Выбрать() Тогда

    ТабличныйДокумент = Элементы.ТД;
    ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
    Если нРег(ФайлНаДиске.Расширение) = ".mxl" Тогда
    ПрочитатьТабДокИзMXL(ДиалогВыбораФайла.ПолноеИмяФайла);
    КонецЕсли;
    КонецЕсли
    КонецПроцедуры
```