Есть код в управляемой форме, который отрабатывает почти без ошибок:

```1c
    &НаКлиенте
    Процедура МояКнопка(Команда)
    РекурсивнаяЗапись();
    КонецПроцедуры

    &НаСервере
    Процедура РекурсивнаяЗапись()
    // ...
    РекурсивнаяЗапись();
    // ...
    КонецПроцедуры
```

Как только я добавляю параметр в серверную процедуру, начинает ругаться на передачу с клиента на сервер: Ошибка преобразования данных XDTO: ... Отсутствует отображение для типа 'ДанныеФормыКоллекцияЭлементовДерева'
Вот изменённый код:

```1c
    &НаКлиенте
    Процедура МояКнопка(Команда)
    РекурсивнаяЗапись(); // Ошибка происходит уже здесь!
    КонецПроцедуры

    &НаСервере
    Процедура РекурсивнаяЗапись(Строки = Неопределено)
    // ...
    РекурсивнаяЗапись(СтрокаДерева.ПолучитьЭлементы());
    // ...
    КонецПроцедуры
```

Я ничего не передаю с клиента на сервер и не прошу передавать. Зачем ругаться? В этом собственно вопрос.
---
Кажется понял. Вот минимальный пример, воспроизводящий ошибку:
```1c
    &НаКлиенте
    Процедура МояКнопка(Команда)
    РекурсивнаяЗапись(); // Ошибка происходит уже здесь!
    КонецПроцедуры

    &НаСервере
    Процедура РекурсивнаяЗапись(Строки = Неопределено)

    Строки = Дерево.ПолучитьЭлементы();

    КонецПроцедуры
```
 Не смотря на то, что с клиента на сервер мы ничего не передавали, Параметру "Строки" внутри процедуры присваивается значение, которое нельзя передавать с сервера на клиент. Платформа неявно передает параметр на клиент. по окончании процедуры, если он задан без слова Знач. То есть, если бы Дерево.ПолучитьЭлементы() мы присвоили другой переменной, например Строки1, ошибки бы не произошло.
---
Преобразовывать в универсальную коллекцию необязательно. В качестве параметра рекурсивной функции лучше использовать строку дерева или само дерево, так как метод получения подчиненных строк у них одинаковый и первый вызов с клиента не вызовет ошибку, так как передаётся дерево. Тогда принцип будет примерно такой:
```1c
    &НаКлиенте
    Процедура МояКнопка(Команда)
    РекурсивнаяЗапись(Дерево); // Ошибка происходит уже здесь!
    КонецПроцедуры

    &НаСервере
    Процедура РекурсивнаяЗапись(СтрокаДерева)
    // ...
    Строки = СтрокаДерева.ПолучитьЭлементы();
    Для Каждого Стр Из Строки Цикл
    РекурсивнаяЗапись(Стр);
    КонецЦикла;
    // ...
    КонецПроцедуры
```
 Либо оставить всё как есть и добавить слово Знач перед параметром Строки.
---
Как не передаете? а вот это что такое:

```1c
    РекурсивнаяЗапись(СтрокаДерева.ПолучитьЭлементы());
```

Вы использовали ДанныеФормыКоллекцияЭлементовДерева, и система вам и сообщает, что так нельзя делать. Нельзя отобразить эти данные формы и, в том числе, изменять их на сервере. Если вы хотите использовать дерево в серверной процедуре, то вначале его нужно преобразовать

```1c
    МоеДеревоЗначений = РеквизитФормыВЗначение("НаименованиеРеквизитаФормыДерева");

    РекурсивнаяЗапись(МоеДеревоЗначений.Строки);

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

    &НаСервере
    Процедура РекурсивнаяЗапись(СтрокаДерева)
    // ...
    Строки = СтрокаДерева.ПолучитьЭлементы();
    Для Каждого Стр Из Строки Цикл
    РекурсивнаяЗапись(Стр);
    КонецЦикла;
    // ...
    КонецПроцедуры
```
 Либо оставить всё как есть и добавить слово Знач перед параметром Строки.
---
добавить слово Знач перед параметром Строки
Действительно, добавление модификатора Знач помогло. Благодарю.
Но для меня осталось загадкой, почему код до этого даже не доходил до серверной процедуры? Любопытно...
---
Кажется понял. Вот минимальный пример, воспроизводящий ошибку:
```1c
    &НаКлиенте
    Процедура МояКнопка(Команда)
    РекурсивнаяЗапись(); // Ошибка происходит уже здесь!
    КонецПроцедуры

    &НаСервере
    Процедура РекурсивнаяЗапись(Строки = Неопределено)

    Строки = Дерево.ПолучитьЭлементы();

    КонецПроцедуры
```
 Не смотря на то, что с клиента на сервер мы ничего не передавали, Параметру "Строки" внутри процедуры присваивается значение, которое нельзя передавать с сервера на клиент. Платформа неявно передает параметр на клиент. по окончании процедуры, если он задан без слова Знач. То есть, если бы Дерево.ПолучитьЭлементы() мы присвоили другой переменной, например Строки1, ошибки бы не произошло.