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

при попытке выполнить вот такой код выдает форму запроса а не выбранного документа.

&НаКлиенте
Процедура выгрузить(Команда)

Док = ЭтотОбъект;
сообщить(док)

КонецПроцедуры
---
Так можно же внутри формы перейти на сервер

Но, наверно я не прав, правда в другом), не совсем понятна задача, есть реквизит документа на форме?
Тогда ссылка = Объект.НашДокумент, где НашДокумент - название реквизита, стоит приложить скрин формы из конфигуратора
---
А владелец формы вообще заполнен в этой обработке? Как она вызывается?

Для решения этой конкретной задачи внешняя обработка в принципе не нужна, но если менять конфигурацию нельзя, то:
1. Создают внешнюю обработку в соответствии с требованиями платформы (ищи в гугле "Внешняя обработка 1С").
2. В ней делают кнопку выгрузить.
3. Регистрируют ее в системе, добавляют список документов, для которых она будет доступна. При нажатии на появившуюся в форме документов кнопку вызывается эта обработка.

Если есть возможность изменять конфигурацию, то просто делают глобальную команду, в тип источника которой закидывают все те объекты, которые хочется выгрузить., а там такой примерно код:

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

    //Док = ЭтотОбъект;
    Док = ВладелецФормы.Объект.Ссылка;
    сообщить(док)

    КонецПроцедуры
```
---
{Обработка.ВыгрузкаФайлов.Форма.Форма.Форма(78)}: Значение не является значением объектного типа (Объект)
  Док = ВладелецФормы.Объект.Ссылка;
---
А владелец формы вообще заполнен в этой обработке? Как она вызывается?

Для решения этой конкретной задачи внешняя обработка в принципе не нужна, но если менять конфигурацию нельзя, то:
1. Создают внешнюю обработку в соответствии с требованиями платформы (ищи в гугле "Внешняя обработка 1С").
2. В ней делают кнопку выгрузить.
3. Регистрируют ее в системе, добавляют список документов, для которых она будет доступна. При нажатии на появившуюся в форме документов кнопку вызывается эта обработка.

Если есть возможность изменять конфигурацию, то просто делают глобальную команду, в тип источника которой закидывают все те объекты, которые хочется выгрузить., а там такой примерно код:

```1c
    З = Новый ЗаписьXML;
    З.Открыть(ИмяФайла);
    СериализаторXDTO.ЗаписатьXML(З, Источник);
    З.Закрыть();
```
Все.
---
я кажется понял в чем проблема. у меня команда выгрузить доступна через сервис . а нужно я так понимаю чтобы кнопка была на форме документа. или не обязательно?
https://pastenow.ru/ed357736335e26bec8779e9012e898f5Скрытый текст
---
Почитал как создается обработка по вашей ссылке. Понял, что сильно тупанул. Добавил реквизит с типом документссылка. Теперь перед выгрузкой можно выбрать нужный документ. Теперь вопрос как передать эту ссылку на сервер? Понимаю, что вопросы тупые и на уровне начальных уроков, но курсы по программированию, которые я проходил, были ужасные. По этому такие вопросы.
---
просто передаете, как аргумент функции. А если это реквизит формы, то и не надо передавать - он там есть.
---
да понял спасибо.
---
Создать обработку, в ней сделать поле с типом ЛюбаяСылка. После выбора документа в это поле, получить ссылку Поле.Ссылка
---
В текущем момента ЭтотОбъект = ДанныеФормы, а не ссылка на объект, поможет
 Док = РеквизитФормыВЗначение(Объект);
---
РеквизитФормыВЗначение(Объект) насколько я знаю она доступна только на сервере. но перед тем как идти на сервер мне нужно получить ссылку на документ. или я не прав?
---
Так можно же внутри формы перейти на сервер

Но, наверно я не прав, правда в другом), не совсем понятна задача, есть реквизит документа на форме?
Тогда ссылка = Объект.НашДокумент, где НашДокумент - название реквизита, стоит приложить скрин формы из конфигуратора
---
в целом я разобрался как передать ссылку на сервер. но при РеквизитФормыВЗначение выдает такую ошибку:

{Обработка.ВыгрузкаФайлов.Форма.Форма.Форма(39)}: Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
Док = РеквизитФормыВЗначение(ДокументСсылка);
по причине:
Несоответствие типов (параметр номер '1')
Несоответствие типов (параметр номер '1')

вот сам код:

```1c
    &НаСервере
    Процедура выгрузитьНаСервере(ДокументСсылка)

    Док = РеквизитФормыВЗначение(ДокументСсылка);
    Для каждого реквизит Из Док.метаданные().реквизиты Цикл
    Сообщить(Реквизит);
    КонецЦикла;

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

    &НаКлиенте
    Процедура выгрузить(Команда,ДокументСсылка)

    ВыгрузитьНаСервере(ДокументСсылка);

    КонецПроцедуры
```
---
Объясните еще пожалуйста как работать с РеквизитФормыВЗначение. что должно подставляться в параметр "Имя реквизита". у меня почему то при попытке подставить туда ДокументСсылка выдает ошибку."Недопустимое значение параметра (параметр номер '1')"
или дайте почитать что нибудь для тупых на эту тему...
---
в общем в итоге вот что получилось.

```1c
    &НаСервере
    Процедура выгрузитьНаСервере(ДокСсылка)

    Текст = Новый ТекстовыйДокумент;
    ИмяДокумента = ДокСсылка.Метаданные().Имя;
    ДатаДокумента = ДокСсылка.Дата;
    текст.ДобавитьСтроку(" + ИмяДокумента);
    текст.ДобавитьСтроку(" + ДатаДокумента);

    для каждого Шреквизит из ДокСсылка.метаданные().Реквизиты цикл
    текст.ДобавитьСтроку("+ Шреквизит.Имя+"="+Докссылка["+Шреквизит.имя]) ;
    конецЦикла;

    Для каждого ТабЧасть из докссылка.Метаданные().ТабличныеЧасти Цикл //Определеяем имена табличных частей
    Для каждого ТекСтрока из Докссылка[ТабЧасть.имя] цикл //используя имя табличной части получить строки ТЧ
    для каждого ТЧреквизит из Табчасть.реквизиты цикл //находясь на строке ТЧ перебираем реквизиты ТЧ

    текст.ДобавитьСтроку("ТабличныеЧасти."+ ТабЧасть.Имя+" "+ ТЧреквизит.Имя+"="+ТекСтрока["+ТЧреквизит.имя]);

    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    Текст.Записать("C:\1C\2.txt");
    КонецПроцедуры

    &НаКлиенте
    Процедура выгрузить(Команда)
    ВыгрузитьНаСервере(ДокСсылка);
    КонецПроцедуры]Скрытый текст
```