Управляемые формы.
Имеется форма списка документов.

Делаю команду для вывода списка на печать. Пишу код:

```1c
    &НаКлиенте
    Процедура Команда1(Команда)
    ТабДок = РеестрНаСервере();
    ТабДок.Показать();
    КонецПроцедуры

    &НаСервере
    Функция РеестрНаСервере()

    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ДокументРезультат = Новый ТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Возврат Результат;

    КонецФункции // РеестрНаСервере()
```

Работает!

Вопрос: как реализовать общую команду печати для некоторых списков документов?
Я подозреваю, что нужно как-то превратить ДинамическийСписок в Тип Таблица формы, и передать его на сервер, чтобы обратиться к ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных().
Что-то типа:

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

    &НаСервере
    Функция РеестрНаСервере(Список)

    Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ДокументРезультат = Новый ТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Возврат Результат;

    КонецФункции // РеестрНаСервере()
```

Но так не получается.
Несоответствие типов (параметр номер '1')
{РасширениеРС_ВО ОбщаяКоманда.РасшРС_ВывестиСписок.МодульКоманды(10)}: КопироватьДанныеФормы(Форма.Список,Список);

Есть варианты?
---
Если конфа типовая, то практически во всех формах есть
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт

Можно извратнуться и перехватывать
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
в расширении.

т.е. в общей команде пишем

```1c
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    Контекст = "Расш1_ПечатьСписка";
    Результат = Неопределено;

    ПараметрыВыполненияКоманды.Источник.Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат);

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

в ПодключаемыеКоманды.ВыполнитьКоманду

```1c
    &Вместо("ВыполнитьКоманду")
    Процедура Расш1_ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник, Результат)

    Если ПараметрыВызова = "Расш1_ПечатьСписка" Тогда
    Результат = "Тут возвращаем табдок форма тут у нас есть";
    Иначе
    ПродолжитьВызов(Форма, ПараметрыВызова, Источник, Результат);
    КонецЕсли;

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

Изврат конечно, но как вариант...
---
РеквизитФормыВЗначение, а значение передать на сервер.
---
РеквизитФормыВЗначение
Доступен только на Сервере. А в модуле команды нет такого способа как в модуле формы документа.
Может я не правильно Вас понял?
Можно фрагмент кода увидеть?
---
А вот еще способ передачи данных из динамического списка в ТЗ:

```1c
    &НаСервере
    Функция Получить_ТЗ_Из_ДинамическогоСписка()

    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Возврат ТЗ;

    КонецФункции
```
---
Спасибо. Но это решение будет работать только в модуле формы. А нужно - в модуле команды.
---
можете конечно и дальше пробовать, но ИМХО без вариантов.
Смотрите типы для : Список = Новый РеквизитФормы("Список",Новый ОписаниеТипов("ТаблицаФормы"));
И Форма.Список.
Они не совместимы.
Динамический список через клиент никак не скопировать. На сервер не передать. Он без формы не существует.
ТаблицаФормы это обертка. Без Динамического списка (в данном случае) она тоже ничего не значит.

Пересмотрите требование к задаче. Возможно понадобится метод в самой форме, который и будет передавать нужные данные.
---
Ну я так и думал, что нельзя.
Но очень хочется создать общую команду, наставить галочек в свойстве "Тип параметра команды" и радоваться жизни.
На всякий случай приготовил пример базы.
Вдруг кому-то это удастся реализовать - покажите как.
Спасибо!
---
Можно добавить кнопку на каждую форму и передавать нужные настройки через параметры. Прописав свою процедуру печати в общем модуле.
---
А почему не передать имя реквизита формы (например "Список") в обработке уже писать Элементы[ИмяСписка]?
---
В какой обработке?
У меня есть общая команда. В ней есть модуль команды.
На клиенте имеется возможность обратиться к форме, из которой эту команду нажали.
Хочу получить параметры СКД динамического списка, но вот незадача, метод ПолучитьИсполняемуюСхемуКомпоновкиДанных() доступен только на сервере.
Как сделать то?
Элементы[ИмяСписка] - так будет работать только в модуле формы. В модуле команды нет коллекции "Элементы"
---
Ошибка здесь:

 Список = Новый РеквизитФормы("Список",Новый ОписаниеТипов("ТаблицаФормы"));

Должно быть:

Список = Новый РеквизитФормы("Список",Новый ОписаниеТипов("ДинамическийСписок"));

и дальше нужно с помощью метода ИзменитьРеквизиты добавить его в структуру реквизитов формы.
---
ИзменитьРеквизиты
Доступен только на сервере. И не совсем понятно, как он мне поможет в создании типа ТаблицаФормы, который может жить на сервере.

Мне нужно на сервере выполнить

```1c
    Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
```

где Список - имеет тип ТаблицаФормы
---
Ну так перенесите весь этот серверный код в серверный метод РеестрНаСервере()...
---
Форму передавать на сервер? А это как?
Вот так чтоли?

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

    &НаСервере
    Функция РеестрНаСервере(Форма)

    Схема = Форма.Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Форма.Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ДокументРезультат = Новый ТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Возврат Результат;

    КонецФункции // РеестрНаСервере()
```

Так ошибка получается:

Ошибка отображения типов:
Отсутствует отображение для типа 'ФормаКлиентскогоПриложения'
{РасширениеРС_ВО ОбщаяКоманда.РасшРС_ВывестиСписок.МодульКоманды(4)}: ТабДок = РеестрНаСервере(Форма);

по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
 форма: Элемент
 имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ФормаКлиентскогоПриложения'
---
ее не надо передавать она там есть
---
У меня общая команда. В ней есть модуль команды. В модуле команды нет Формы как таковой. Я её получаю из входного параметра ПараметрыВыполненияКоманды клиентского вызова команды ОбработкаКоманды().

Все функции и процедуры в модуле команды с директивой &НаСервере работают как &НаСервереБезКонтекста, так как Формы нет.
---
А, общая команда... Ну тогда в модуле формы сделать экспортный клиентский метод, и дергать его из обработчика команды. Он уже в свою очередь дергает общие серверные методы...
А вот если в модуль формы лезть не хочется, тогда надо думать ещё сильнее.
Ибо получить форму на сервере (серверный контекст) можно только в модуле формы, в этом проблема да.
---
у таблицы формы не существует схемы компоновки данных, в этом ваша основная ошибка.
---
Есть
---
Если конфа типовая, то практически во всех формах есть
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт

Можно извратнуться и перехватывать
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
в расширении.

т.е. в общей команде пишем

```1c
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    Контекст = "Расш1_ПечатьСписка";
    Результат = Неопределено;

    ПараметрыВыполненияКоманды.Источник.Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат);

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

в ПодключаемыеКоманды.ВыполнитьКоманду

```1c
    &Вместо("ВыполнитьКоманду")
    Процедура Расш1_ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник, Результат)

    Если ПараметрыВызова = "Расш1_ПечатьСписка" Тогда
    Результат = "Тут возвращаем табдок форма тут у нас есть";
    Иначе
    ПродолжитьВызов(Форма, ПараметрыВызова, Источник, Результат);
    КонецЕсли;

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

Изврат конечно, но как вариант...
---
Изврат интересный, но тогда пропадает основная цель: не редактируя все формы списков создать одну команду.
---
А чем стандартная команда "Вывести список..." не устраивает?
---
Стандартная команда исчезла для форм списков в расширении. Обсуждается здесь. И никакими бубнами с правами не хочет отображаться. Помогло только этот программный способ.
---
почему-же? форму как раз мы не трогаем.
Если конфа типовая, то практически во всех формах есть
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
---
Ваш ответ самый интересный. Но к сожалению не подходит для меня, так как я уже в расширении и доработку нужно делать для моих форм списков документов расширения. Причина - отсутствие стандартной команды "Вывести список". Пропала и не хочет появляться, как здесь.
---
Ну раз у вас свои собственные формы в расширениях, то никто не может вам запретить их править. Тогда (16) - нет необходимости использовать БСП, все можно сделать двумя методами - один одинаковый в каждой форме, и один общий для фактического выполнения команды.