Управляемые формы.
Имеется форма списка документов.
Делаю команду для вывода списка на печать. Пишу код:
&НаКлиенте
Процедура Команда1(Команда)
ТабДок = РеестрНаСервере();
ТабДок.Показать();
КонецПроцедуры
&НаСервере
Функция РеестрНаСервере()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции // РеестрНаСервере()
Показать
Работает!
Вопрос: как реализовать общую команду печати для некоторых списков документов?
Я подозреваю, что нужно как-то превратить ДинамическийСписок в Тип Таблица формы, и передать его на сервер, чтобы обратиться к ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных().
Что-то типа:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
Форма = ПараметрыВыполненияКоманды.Источник;
Список = Новый РеквизитФормы("Список",Новый ОписаниеТипов("ТаблицаФормы"));
//Список = Новый ДанныеФ
КопироватьДанныеФормы(Форма.Список,Список);
ТабДок = РеестрНаСервере(Список);
ТабДок.Показать();
КонецПроцедуры
&НаСервере
Функция РеестрНаСервере(Список)
Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции // РеестрНаСервере()
Показать
Но так не получается.
Несоответствие типов (параметр номер '1')
{РасширениеРС_ВО ОбщаяКоманда.РасшРС_ВывестиСписок.МодульКоманды(10)}: КопироватьДанныеФормы(Форма.Список,Список);
&Вместо("ВыполнитьКоманду")
Процедура Расш1_ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник, Результат)
Если ПараметрыВызова = "Расш1_ПечатьСписка" Тогда
Результат = "Тут возвращаем табдок форма тут у нас есть";
Иначе
ПродолжитьВызов(Форма, ПараметрыВызова, Источник, Результат);
КонецЕсли;
КонецПроцедуры
Доступен только на Сервере. А в модуле команды нет такого способа как в модуле формы документа.
Может я не правильно Вас понял?
Можно фрагмент кода увидеть?
(1) можете конечно и дальше пробовать, но ИМХО без вариантов.
Смотрите типы для : Список = Новый РеквизитФормы("Список",Новый ОписаниеТипов("ТаблицаФормы"));
И Форма.Список.
Они не совместимы.
Динамический список через клиент никак не скопировать. На сервер не передать. Он без формы не существует.
ТаблицаФормы это обертка. Без Динамического списка (в данном случае) она тоже ничего не значит.
Пересмотрите требование к задаче. Возможно понадобится метод в самой форме, который и будет передавать нужные данные.
(14) Ну я так и думал, что нельзя.
Но очень хочется создать общую команду, наставить галочек в свойстве "Тип параметра команды" и радоваться жизни.
На всякий случай приготовил пример базы.
Вдруг кому-то это удастся реализовать - покажите как.
Спасибо!
(3) В какой обработке?
У меня есть общая команда. В ней есть модуль команды.
На клиенте имеется возможность обратиться к форме, из которой эту команду нажали.
Хочу получить параметры СКД динамического списка, но вот незадача, метод ПолучитьИсполняемуюСхемуКомпоновкиДанных() доступен только на сервере.
Как сделать то?
Элементы[ИмяСписка] - так будет работать только в модуле формы. В модуле команды нет коллекции "Элементы"
(8) Форму передавать на сервер? А это как?
Вот так чтоли?
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
Форма = ПараметрыВыполненияКоманды.Источник;
ТабДок = РеестрНаСервере(Форма);
ТабДок.Показать();
КонецПроцедуры
&НаСервере
Функция РеестрНаСервере(Форма)
Схема = Форма.Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Форма.Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции // РеестрНаСервере()
Показать
Так ошибка получается:
Ошибка отображения типов:
Отсутствует отображение для типа 'ФормаКлиентскогоПриложения'
{РасширениеРС_ВО ОбщаяКоманда.РасшРС_ВывестиСписок.МодульКоманды(4)}: ТабДок = РеестрНаСервере(Форма);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ФормаКлиентскогоПриложения'
(10) У меня общая команда. В ней есть модуль команды. В модуле команды нет Формы как таковой. Я её получаю из входного параметра ПараметрыВыполненияКоманды клиентского вызова команды ОбработкаКоманды().
Все функции и процедуры в модуле команды с директивой &НаСервере работают как &НаСервереБезКонтекста, так как Формы нет.
(12) А, общая команда... Ну тогда в модуле формы сделать экспортный клиентский метод, и дергать его из обработчика команды. Он уже в свою очередь дергает общие серверные методы...
А вот если в модуль формы лезть не хочется, тогда надо думать ещё сильнее.
Ибо получить форму на сервере (серверный контекст) можно только в модуле формы, в этом проблема да.
&Вместо("ВыполнитьКоманду")
Процедура Расш1_ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник, Результат)
Если ПараметрыВызова = "Расш1_ПечатьСписка" Тогда
Результат = "Тут возвращаем табдок форма тут у нас есть";
Иначе
ПродолжитьВызов(Форма, ПараметрыВызова, Источник, Результат);
КонецЕсли;
КонецПроцедуры
(20) Стандартная команда исчезла для форм списков в расширении. Обсуждается здесь. И никакими бубнами с правами не хочет отображаться. Помогло только этот программный способ.
(24) Ваш ответ самый интересный. Но к сожалению не подходит для меня, так как я уже в расширении и доработку нужно делать для моих форм списков документов расширения. Причина - отсутствие стандартной команды "Вывести список". Пропала и не хочет появляться, как здесь.
(25) Ну раз у вас свои собственные формы в расширениях, то никто не может вам запретить их править. Тогда (16) - нет необходимости использовать БСП, все можно сделать двумя методами - один одинаковый в каждой форме, и один общий для фактического выполнения команды.