Диалоговое окно из внешней печатной формы в управляемом приложении

1. 27.12.18 10:49 Сейчас в теме
Приветствую, коллеги!
Есть ВПФ для УП. Требуется после того, как пользователь выбрал из документа/журнала печать соответствующего макета открыть диалоговое окно, чтобы пользователь мог ввести числовую или текстовую информацию, которая влияла бы на формирование печатной формы.
Как это сделать?
Найденные решения
25. dhurricane 27.12.18 14:31 Сейчас в теме
(24) Полагаю, мне удалось найти подходящее решение.

Итак, описание регистрации сохраняется. Форму диалога также нужно будет рисовать. А вот процедуру печати необходимо перенести из модуля объекта обработки в модуль формы:
&НаКлиенте
Процедура КомандаПечати(Команда)
	
	ПользовательскиеЗначения = Новый Структура;
	ПользовательскиеЗначения.Вставить("ТекстСообщения", Объект.ТекстСообщения);
	
	МассивОбъектов = ОбъектыНазначения.ВыгрузитьЗначения();

	РезультатПечати = Печать(ИдентификаторКоманды, МассивОбъектов, ПользовательскиеЗначения);
	
	УправлениеПечатьюКлиент.ПечатьДокументов(
		РезультатПечати.КоллекцияПечатныхФорм, 
		РезультатПечати.ОбъектыПечати, 
		ЭтотОбъект.ВладелецФормы);
		
	ЭтотОбъект.Закрыть();
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция Печать(ИменаМакетов, МассивОбъектов, ПользовательскиеПараметры)
	
	КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов);
	ОбъектыПечати = Новый СписокЗначений;
	
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПечатьСДиалогом");
	Если ПечатнаяФорма <> Неопределено Тогда
        ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФормуСДиалогом(МассивОбъектов, ОбъектыПечати, ПользовательскиеПараметры);
        ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Печать с диалогом'");
	КонецЕсли;
	
	Результат = Новый Структура("КоллекцияПечатныхФорм,ОбъектыПечати");
	Результат.КоллекцияПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
	Результат.ОбъектыПечати = ОбъектыПечати;
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция СформироватьПечатнуюФормуСДиалогом(МассивОбъектов, ОбъектыПечати, ПользовательскиеПараметры)
	
	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.Область(1,1).Текст = "Это внешняя печтаная форма с диалогом.";
	ТабДокумент.Область(2,1).Текст = "Пользовательский текст: " + ПользовательскиеПараметры.ТекстСообщения;
	
	Возврат ТабДокумент;
	
КонецФункции
Показать
Прикрепленные файлы:
ПечатьСДиалогом.epf
Alex17; Volchock; Famza; dbachinsky; suepifanov; starbrain; +6 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. ben19791010 27.12.18 11:02 Сейчас в теме
(1)
Как это сделать?
это то не сложно, но дальше последует вопрос - а как перелать это с клиента на сервер, а потом бы еще и обратно на клиент ))
3. YannikAlx 27.12.18 11:06 Сейчас в теме
(2) А вот это как раз проще пареной репы!
У Объекта создается необходимые реквизиты, и именно их выносят на форму - дальше меняй их как и когда нужно.
Они сразу видны и на клиенте и на сервере
4. starbrain 27.12.18 11:15 Сейчас в теме
(2)
Я так понимаю, что во внешней обработке печатной формы нужно создать Форму, но как перехватить вызов процедуры Печать, чтобы эту форму открыть?
9. dhurricane 27.12.18 12:36 Сейчас в теме
(1) Я бы мог попробовать собрать пример, но для этого сообщите, пожалуйста, свою версию БСП.
starbrain; +1 Ответить
15. starbrain 27.12.18 12:50 Сейчас в теме
(9)
БСП не использую, но и не могу понять, как она может помочь решить проблему. Вопрос не по какой-то конкретной обработке или конфигурации, а в принципе, как это можно сделать.
20. dhurricane 27.12.18 12:55 Сейчас в теме
(15) Подключение ВПФ - это функционал БСП. И от версии к версии программный интерфейс может меняться.
22. starbrain 27.12.18 13:00 Сейчас в теме
(20)
Извиняюсь, ступил... Версия - 3.0.1.268.
Буду очень благодарен, если тоже (помимо доп. реквизитов) подскажете решение!
23. dhurricane 27.12.18 13:42 Сейчас в теме
(22) К сожалению, пока путного ничего не придумал. Мне не удалось найти стандартную функцию, передающую произвольную структуру параметров в менеджер печати обработки. Поэтому пока предлагаю такой костыль: сохранять в настройках обработки введенный пользователем текст.

Для этого в функции регистрации ВПФ добавляете команду печати с типом "Открытие формы":
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Печать с диалогом'");
Команда.Идентификатор = "ПечатьСДиалогом";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы()


Рисуете форму обработки с нужным интерфейсом. Режим открытия - блокировать окно владельца. Добавляете параметры формы: ДополнительнаяОбработкаСсылка типа ссылки на доп. обработки, ИдентификаторКоманды строкового типа и ОбъектыНазначения произвольного типа. Добавляете также реквизиты формы, соответствующие параметрам. При создании формы сохраняете параметры.

Добавляете на форму кнопку печати. В обработчике команды открываете печатную форму:
ВыполняемаяКоманда = Новый Структура;
ВыполняемаяКоманда.Вставить("Ссылка", ДополнительнаяОбработкаСсылка);
ВыполняемаяКоманда.Вставить("Идентификатор", ИдентификаторКоманды);

ПользовательскиеЗначения = Новый Структура;
ПользовательскиеЗначения.Вставить("ТекстСообщения", Объект.ТекстСообщения);

ЗаписатьВыбранныеЗначенияНаСервере(ДополнительнаяОбработкаСсылка, ПользовательскиеЗначения);

ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеПечатнойФормы(
	ВыполняемаяКоманда,
	ЭтотОбъект.ВладелецФормы,
	ОбъектыНазначения.ВыгрузитьЗначения());
	
ЭтотОбъект.Закрыть();
Показать


Перед открытием печатной формы всякий раз записываете в обработку введенный пользователем текст. Для этого используете предназначенный для хранения настроек реквизит справочника доп. обработок "ХранилищеНастроек":
&НаСервереБезКонтекста
Процедура ЗаписатьВыбранныеЗначенияНаСервере(ДополнительнаяОбработкаСсылка, ПользовательскиеЗначения)
	
	// Возможно потребуется установка привилегированного режима

	ОбработкаОбъект = ДополнительнаяОбработкаСсылка.ПолучитьОбъект();
	ОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(ПользовательскиеЗначения);
	ОбработкаОбъект.Записать();
	
КонецПроцедуры
Показать


Попробую еще посмотреть варианты решения это задачи. Возможно удастся найти более элегантное решение.
Прикрепленные файлы:
ПечатьСДиалогом.epf
starbrain; +1 Ответить
24. starbrain 27.12.18 13:48 Сейчас в теме
(23)
dhurricane, очень интересное решение, спасибо, буду пробовать!
25. dhurricane 27.12.18 14:31 Сейчас в теме
(24) Полагаю, мне удалось найти подходящее решение.

Итак, описание регистрации сохраняется. Форму диалога также нужно будет рисовать. А вот процедуру печати необходимо перенести из модуля объекта обработки в модуль формы:
&НаКлиенте
Процедура КомандаПечати(Команда)
	
	ПользовательскиеЗначения = Новый Структура;
	ПользовательскиеЗначения.Вставить("ТекстСообщения", Объект.ТекстСообщения);
	
	МассивОбъектов = ОбъектыНазначения.ВыгрузитьЗначения();

	РезультатПечати = Печать(ИдентификаторКоманды, МассивОбъектов, ПользовательскиеЗначения);
	
	УправлениеПечатьюКлиент.ПечатьДокументов(
		РезультатПечати.КоллекцияПечатныхФорм, 
		РезультатПечати.ОбъектыПечати, 
		ЭтотОбъект.ВладелецФормы);
		
	ЭтотОбъект.Закрыть();
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция Печать(ИменаМакетов, МассивОбъектов, ПользовательскиеПараметры)
	
	КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов);
	ОбъектыПечати = Новый СписокЗначений;
	
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПечатьСДиалогом");
	Если ПечатнаяФорма <> Неопределено Тогда
        ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФормуСДиалогом(МассивОбъектов, ОбъектыПечати, ПользовательскиеПараметры);
        ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Печать с диалогом'");
	КонецЕсли;
	
	Результат = Новый Структура("КоллекцияПечатныхФорм,ОбъектыПечати");
	Результат.КоллекцияПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
	Результат.ОбъектыПечати = ОбъектыПечати;
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция СформироватьПечатнуюФормуСДиалогом(МассивОбъектов, ОбъектыПечати, ПользовательскиеПараметры)
	
	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.Область(1,1).Текст = "Это внешняя печтаная форма с диалогом.";
	ТабДокумент.Область(2,1).Текст = "Пользовательский текст: " + ПользовательскиеПараметры.ТекстСообщения;
	
	Возврат ТабДокумент;
	
КонецФункции
Показать
Прикрепленные файлы:
ПечатьСДиалогом.epf
Alex17; Volchock; Famza; dbachinsky; suepifanov; starbrain; +6 Ответить
26. starbrain 27.12.18 15:13 Сейчас в теме
(25)

dhurricane, все работает! Именно то, что надо! Спасибо Вам!!!
5. Kovekh 27.12.18 12:01 Сейчас в теме
А если доп реквизит добавить? И при печати его отлавливать. В этом же нет ничего сложного
starbrain; +1 Ответить
6. starbrain 27.12.18 12:05 Сейчас в теме
(5)
А каким образом отлавливать то?
7. Kovekh 27.12.18 12:20 Сейчас в теме
(6)
в зависимости от того, какая у Вас конфигурация.

В новых ЗУПах и ERP доп реквизиты хранятся в табличной части у документа, справочника и т.д. И тогда можно делать запрос к нужной ТЧ, чтобы имя доп реквизита было равно нужному значению, которое можно глянуть в поле для разработчиков формы доп реквизита.

А если конфигурация старая, то у Вас, скорее всего, доп реквизиты хранятся в регистрах. Как там запрос делать, я точно не скажу. Но отловить это точно можно)
Можете поэкспериментировать - будет полезно))
starbrain; +1 Ответить
8. starbrain 27.12.18 12:34 Сейчас в теме
(7)
Мы, наверное, о разных вещах говорим.
У меня есть внешняя обработка, подключенная в качестве печатной формы к документу.
После того, как пользователь из документа начинает печатать эту фору, вызывается процедура Печать(...) из модуля ВПФ, естественно на сервере.
Как вывести какое-либо диалоговое окно с пользователем? Функция ВвестиЧисло() и ей подобные в серверной процедуре недоступны, вызвать процедуру НаКлиенте тоже нельзя. Как быть?
Прикрепленные файлы:
11. Kovekh 27.12.18 12:42 Сейчас в теме
(8)
Нет, просто я Вам предлагаю посмотреть на другую концепцию. Вы говорите, что Вам нужно заполнять это поле для того, чтобы оно влияло на Вашу печатную форму, верно? А если Вы к документу добавите дополнительный реквизит. Соответственно, это будет то поле, которое в Вашей логике должно влиять на формирование ВПФ. То есть не вызывать окно, а будет доп реквизит, где это значение вводится. Тогда при печати Вы просто смотрите этот реквизит и он у Вас влияет на Вашу ВПФ как Вам угодно. И заодно будет повод поразмыслить о модальности, от которой Вы отказываетесь, когда не вызываете функции вроде ВвестиЧисло().
starbrain; +1 Ответить
16. starbrain 27.12.18 12:51 Сейчас в теме
(11)
Ну, если бы можно было менять конфигурацию - то какой вопрос то? ) Именно вся фишки в том, чтобы конфу не трогать, а перехватить на клиенте печать ВПФ.
18. Kovekh 27.12.18 12:54 Сейчас в теме
(16)
Здравствуйте. Вы не знаете про механизм доп реквизитов в типовых конфигурациях? Не хотите почитать об этом механизме на своей конфе?)
starbrain; +1 Ответить
21. starbrain 27.12.18 12:56 Сейчас в теме
(18)
А, теперь понял. Да, это, пожалуй, вариант. Спасибо!
10. ben19791010 27.12.18 12:38 Сейчас в теме
начнем с того, что у Вас формы нет, где как Видно из Видного можно было бы разместить реквизиты ))
реквизиты пользователь будет вводить для печати после просмотра ВПФ?
после этого планируется этот же макет выводить?
12. YannikAlx 27.12.18 12:42 Сейчас в теме
(10) Вас там совсем отморозило в Сибири?
Про форму писали вы или дядя из Барнаула?
Как это сделать?
это то не сложно, но дальше последует вопрос

А вот когда форма то будет создана и открыта "не сложно", то появится возможность реквизиты то и разместить и увидеть...
13. ben19791010 27.12.18 12:44 Сейчас в теме
(12) опять ты дальше носа не видишь ни фига))) на скрине у ТС видно, что формы не видно ))
угомонись уже )) или у тебя дефицит общения? )
14. ben19791010 27.12.18 12:46 Сейчас в теме
(12)
А вот когда форма то будет создана и открыта

я про это собственно и написал в (10)
))) просто кто-то упорно хочет побазарить
17. YannikAlx 27.12.18 12:51 Сейчас в теме
(14) Вот побазарить опять же хочется кому-то реально, не давая никакой полезной информации вообще , просто упоминая о возможных вопросах в будущем...
Автор просит помощи именно в создании и открытии формы , которая ПЕРЕД формированием печати будет получать данные и вставлять в запросы.
Это пояснинение специально для тех кто далеко от нас...
19. starbrain 27.12.18 12:55 Сейчас в теме
(17)
Да, именно, либо создать форму (но когда и как ее открыть), либо другой способ "перехватить" процедуры на сервере, чтобы использовать механизмы, доступные на Клиенте.
Менять конфу нельзя, вариант типа открывать обработку через файл-открыть, задавать там параметры и выбирать печатаемый док - сами понимаете неприемлемое решение...
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Руководитель проектов 1С
Москва
зарплата от 200 000 руб.
Полный день

Консультант-аналитик 1С
Нижний Новгород
зарплата от 55 000 руб. до 100 000 руб.
Полный день

Аналитик 1С ERP
Санкт-Петербург
зарплата до 200 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб.
Полный день