Как передать ДинамическийСписок НаСервер в типе ТаблицаФормы?

1. EvgeTrofi 135 24.02.21 16:06 Сейчас в теме
Управляемые формы.
Имеется форма списка документов.

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

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

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

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


Работает!

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

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

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

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

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

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


Есть варианты?
По теме из базы знаний
Найденные решения
19. EVKash 16 25.02.21 09:53 Сейчас в теме
(15) Если конфа типовая, то практически во всех формах есть
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт

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

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

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

Изврат конечно, но как вариант...
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. succub1_5 91 24.02.21 16:12 Сейчас в теме
(1)РеквизитФормыВЗначение, а значение передать на сервер.
5. EvgeTrofi 135 24.02.21 17:00 Сейчас в теме
(2)
РеквизитФормыВЗначение

Доступен только на Сервере. А в модуле команды нет такого способа как в модуле формы документа.
Может я не правильно Вас понял?
Можно фрагмент кода увидеть?
18. succub1_5 91 25.02.21 09:38 Сейчас в теме
(5)А вот еще способ передачи данных из динамического списка в ТЗ:
&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()
 
	Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
 
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	
	ТЗ = Новый ТаблицаЗначений;
	ПроцессорВывода.УстановитьОбъект(ТЗ); 
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	Возврат ТЗ;
 
КонецФункции
Показать
23. EvgeTrofi 135 25.02.21 12:48 Сейчас в теме
(18) Спасибо. Но это решение будет работать только в модуле формы. А нужно - в модуле команды.
14. spacecraft 24.02.21 19:02 Сейчас в теме
(1) можете конечно и дальше пробовать, но ИМХО без вариантов.
Смотрите типы для : Список = Новый РеквизитФормы("Список",Новый ОписаниеТипов("ТаблицаФормы"));
И Форма.Список.
Они не совместимы.
Динамический список через клиент никак не скопировать. На сервер не передать. Он без формы не существует.
ТаблицаФормы это обертка. Без Динамического списка (в данном случае) она тоже ничего не значит.

Пересмотрите требование к задаче. Возможно понадобится метод в самой форме, который и будет передавать нужные данные.
15. EvgeTrofi 135 24.02.21 19:16 Сейчас в теме
(14) Ну я так и думал, что нельзя.
Но очень хочется создать общую команду, наставить галочек в свойстве "Тип параметра команды" и радоваться жизни.
На всякий случай приготовил пример базы.
Вдруг кому-то это удастся реализовать - покажите как.
Спасибо!
Прикрепленные файлы:
1Cv8.zip
17. Ul_developer 25.02.21 07:22 Сейчас в теме
(1) Можно добавить кнопку на каждую форму и передавать нужные настройки через параметры. Прописав свою процедуру печати в общем модуле.
3. glek 120 24.02.21 16:23 Сейчас в теме
А почему не передать имя реквизита формы (например "Список") в обработке уже писать Элементы[ИмяСписка]?
6. EvgeTrofi 135 24.02.21 17:07 Сейчас в теме
(3) В какой обработке?
У меня есть общая команда. В ней есть модуль команды.
На клиенте имеется возможность обратиться к форме, из которой эту команду нажали.
Хочу получить параметры СКД динамического списка, но вот незадача, метод ПолучитьИсполняемуюСхемуКомпоновкиДанных() доступен только на сервере.
Как сделать то?
Элементы[ИмяСписка] - так будет работать только в модуле формы. В модуле команды нет коллекции "Элементы"
4. Азбука Морзе 106 24.02.21 16:45 Сейчас в теме
Ошибка здесь:

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

Должно быть:

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

и дальше нужно с помощью метода ИзменитьРеквизиты добавить его в структуру реквизитов формы.
7. EvgeTrofi 135 24.02.21 17:13 Сейчас в теме
(4)
ИзменитьРеквизиты

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

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

где Список - имеет тип ТаблицаФормы
8. FatPanzer 24.02.21 17:21 Сейчас в теме
(7) Ну так перенесите весь этот серверный код в серверный метод РеестрНаСервере()...
9. EvgeTrofi 135 24.02.21 17:27 Сейчас в теме
(8) Форму передавать на сервер? А это как?
Вот так чтоли?
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	Форма = ПараметрыВыполненияКоманды.Источник;
	ТабДок = РеестрНаСервере(Форма);
	ТабДок.Показать();
КонецПроцедуры

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

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

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

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


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

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

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

Все функции и процедуры в модуле команды с директивой &НаСервере работают как &НаСервереБезКонтекста, так как Формы нет.
16. FatPanzer 24.02.21 19:41 Сейчас в теме
(12) А, общая команда... Ну тогда в модуле формы сделать экспортный клиентский метод, и дергать его из обработчика команды. Он уже в свою очередь дергает общие серверные методы...
А вот если в модуль формы лезть не хочется, тогда надо думать ещё сильнее.
Ибо получить форму на сервере (серверный контекст) можно только в модуле формы, в этом проблема да.
11. Азбука Морзе 106 24.02.21 18:11 Сейчас в теме
(7) у таблицы формы не существует схемы компоновки данных, в этом ваша основная ошибка.
13. EvgeTrofi 135 24.02.21 18:27 Сейчас в теме
(11) Есть
Прикрепленные файлы:
19. EVKash 16 25.02.21 09:53 Сейчас в теме
(15) Если конфа типовая, то практически во всех формах есть
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт

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

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

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

Изврат конечно, но как вариант...
22. EvgeTrofi 135 25.02.21 12:45 Сейчас в теме
(19) Изврат интересный, но тогда пропадает основная цель: не редактируя все формы списков создать одну команду.
20. SlavaKron 25.02.21 11:12 Сейчас в теме
А чем стандартная команда "Вывести список..." не устраивает?
21. EvgeTrofi 135 25.02.21 12:43 Сейчас в теме
(20) Стандартная команда исчезла для форм списков в расширении. Обсуждается здесь. И никакими бубнами с правами не хочет отображаться. Помогло только этот программный способ.
24. EVKash 16 25.02.21 13:59 Сейчас в теме
(22) почему-же? форму как раз мы не трогаем.
Если конфа типовая, то практически во всех формах есть
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
25. EvgeTrofi 135 25.02.21 17:25 Сейчас в теме
(24) Ваш ответ самый интересный. Но к сожалению не подходит для меня, так как я уже в расширении и доработку нужно делать для моих форм списков документов расширения. Причина - отсутствие стандартной команды "Вывести список". Пропала и не хочет появляться, как здесь.
26. FatPanzer 25.02.21 18:08 Сейчас в теме
(25) Ну раз у вас свои собственные формы в расширениях, то никто не может вам запретить их править. Тогда (16) - нет необходимости использовать БСП, все можно сделать двумя методами - один одинаковый в каждой форме, и один общий для фактического выполнения команды.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот