Передача параметров во внешнюю печатную форму для УТ 10.3

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. Fox_65 1 08.10.24 20:21 Сейчас в теме
В конфигурации УТ 10.3 реализована пакетная печать документов с выбором руководителя. После выбора печатаются Торг 12 и Счет-Фактура. Последняя счет-фактура присоединена в виде внешней печатной формы. Задача - передать туда руководителя для подписи. Прошу помогите с идеями.
По теме из базы знаний
Найденные решения
2. user2033930 08.10.24 20:32 Сейчас в теме
А в чем проблема? Сделать какой-нить параметр сеанса, да юзать его.
Некошерно, но быстро.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. independ 1551 09.10.24 00:54 Сейчас в теме
6. Fox_65 1 09.10.24 07:24 Сейчас в теме
(5) Вот я так и сделал сначала. Но руководитель выбирается при каждой печати и приходится каждый раз перезаписывать дополнительные параметры в справочнике. А это не есть хорошо. Еще и на сети с десятком пользователей.
7. nomad_irk 76 09.10.24 07:49 Сейчас в теме
(6) вас никто не заставляет переписывать дополнительные параметры в справочнике, достаточно пользоваться структурой в которой они хранятся в виде одного из параметров функции Печать()
8. Fox_65 1 09.10.24 11:03 Сейчас в теме
(7) С этого места поподробнее. Как вы предлагаете загнать структуру в ДополнительныеПараметры?
Там могут храниться только примитивные типы насколько я знаю.
9. user2033930 09.10.24 11:05 Сейчас в теме
(8) Строка вполне себе примитивный тип.
10. nomad_irk 76 09.10.24 11:06 Сейчас в теме
(8)
Как вы предлагаете загнать структуру в ДополнительныеПараметры?

Она туда уже будет загнана на момент вызова функции Печать() модуля внешней обработки типовым кодом вызова доп. обработки
(8)
Там могут храниться только примитивные типы насколько я знаю.

кто вам такое сказал? там может хранится все то же, что и в обычной структуре в качестве значения элемента.
11. Fox_65 1 09.10.24 11:12 Сейчас в теме
(10) Дополнительные параметры - это ХранилищеЗначения. Поместить туда можно все что угодно, но для того, чтобы прочитать оттуда значения, нужно записать элемент. Или я не прав?
12. nomad_irk 76 09.10.24 11:13 Сейчас в теме
(11) нет, если там ничего не будет, то оно просто будет пустым, ничего не мешает заполнить его самостоятельно нужными данными.
13. Fox_65 1 09.10.24 11:15 Сейчас в теме
(12) Заполнить можно, при каждой печати они могут меняться. Что с этим делать?
15. Fox_65 1 09.10.24 11:41 Сейчас в теме
(12) Вы наверно не дочитали задачу. Есть обработка в которой выбирается реализация при отправке на печать выбирается руководитель для подписи. Печатается Торг12 и счет-фактура из документов. Т.к. Ут 10.3 снята с поддержки (если вы об этом не знали) обновления для новой счет-фактуры нет, и она прикрепляется в виде внешней печатной формы. Изменять конфигурацию из-за этого желания нет (в частности добавлять новые параметры сеанса). Могу переписать обработку и внешнюю печатную форму.
Т.е. не нужно постоянно измененное имя руководителя. Его можно изменить и в другом месте, а не в дополнительных параметрах. Нужно менять подписанта при каждой печати.
17. nomad_irk 76 09.10.24 11:44 Сейчас в теме
(15)
при отправке на печать выбирается руководитель для подписи.....
Нужно менять подписанта при каждой печати


Каким образом это делается сейчас в обработке печати, можете показать код?
16. nomad_irk 76 09.10.24 11:43 Сейчас в теме
(11) ДополнительныеПараметры имеет произвольный тип данных. Типовой алгоритм вызова внешней обработки формирует структуру.

Функция Печать() Экспорт
	
	ТабДок = Новый ТабличныйДокумент;
	
	//Ничто не мешает сделать так в другой форме обработки:
	Руководитель = ОткрытьМодальноФормуВыбораФизЛица();
	ДополнительныеПараметры.Вставить("Руководитель", Руководитель);
	
	.........
КонецФункции
Показать
18. Fox_65 1 09.10.24 11:48 Сейчас в теме
(16) Да нет. Список выбора руководителя выводится до печати. И его (руководителя) надо передать во внешнюю форму счет-фактуры. Печатается также и Торг-12.
19. nomad_irk 76 09.10.24 11:49 Сейчас в теме
(18) Это я понимаю, каким образом это у вас реализовано на данный момент в коде?

Так понимаю, что-то вроде:

РуководительДляПодписи = ОткрытьМодальноФормуВыборавФизЛица();

ДопОбработка = Справочники.ДополнительныеОбработки.Найти("НаименованиеОбработки");
ОбработкаОбъект = ВнешниеОбработки.Подключить(ИмяВременногоФайла, ИмяРегистрацииОбработки);

ВПФ = ВнешниеОбработки.ИмяРегистрацииОбработки.Создать();
ВПФ.СсылкаНаОбъект = СсылкНаСчетФактура;
ТабДок = ВПФ.Печать();
20. Fox_65 1 09.10.24 11:55 Сейчас в теме
(19) После того, как я сделал все через Дополнительные параметры. Понял, что перезаписывать при каждой печати элемент справочника ВнешниеОбработки - это не выход. И просто передаю руководителя через ХранилищеОбщихНастроек. Думаю - это оптимально.
Перед печатью внешней формы сохраняю руководителя в хранилище, при печати достаю, после печати удаляю.
21. nomad_irk 76 09.10.24 11:57 Сейчас в теме
(20) зачем вообще тогда спрашиваете как сделать лучше?
делайте как умеете
22. Fox_65 1 09.10.24 12:03 Сейчас в теме
(21) Если бы мне здесь не посоветовали воспользоваться параметрами сеанса, я бы про это хранилище и не вспомнил бы. Так бы и оставил перезапись дополнительных параметров.
Может есть еще какие способы?
23. nomad_irk 76 09.10.24 12:09 Сейчас в теме
(22) я вам уже битые стопицот сообщений пытаюсь донести мысль о том, что не нужно вообще ничего никуда записывать и потом еще стирать - все работает через ДополнительныеПараметры дополнительной обработки.

От вас хочу увидеть реализацию в коде получения нужного руководителя и формирования печатной формы нужного документа, чтобы показать каким образом можно использовать ДополнительныеПараметры, но так понимаю, ваша реализация кодом сильно секретная.
Не буду настаивать, ваш вариант с помощью хранилища настроек рабочий.
28. Fox_65 1 09.10.24 13:21 Сейчас в теме
(23) Нет ничего секретного. Хотите увидеть код с Дополнительными Параметрами - пожалуйста
Руководители = Новый Структура;
Руководители.Вставить("Руководитель", ВыбРуководитель);
Руководители.Вставить("ГлавныйБухгалтер", ВыбРуководитель);
СсылкаВнОбработки = Справочники.ВнешниеОбработки.НайтиПоНаименованию("Счет-фактура1096");
ОбъектВнОбработки = СсылкаВнОбработки.ПолучитьОбъект();
ОбъектВнОбработки.Принадлежность[0].ДополнительныеПараметрыОбработки = Руководители;
ОбъектВнОбработки.Записать();
ДеревоМакетовПечати = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(СсылкаНаДокумент, Неопределено);
СтрокаКнопки = ДеревоМакетовПечати.Строки.Найти("Счет-фактура1096","Текст");
Расшифровка = СтрокаКнопки.Расшифровка; 
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда 
    ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(СсылкаНаДокумент, Расшифровка); 
    Если ТабДокумент <> Неопределено Тогда
        УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент);
    КонецЕсли;
КонецЕсли;
ОбъектВнОбработки.Принадлежность[0].ДополнительныеПараметрыОбработки = "";
ОбъектВнОбработки.Записать(); 
Показать

Соответственно во внешней форме я сначала проверяю есть ли что в дополнительных параметрах
Если Не ДополнительныеПараметры.Свойство("Руководитель")  = Неопределено Тогда
Макет.Параметры.Руководитель = ДополнительныеПараметры.Руководитель;
КонецЕсли;


Вот такой код
29. nomad_irk 76 09.10.24 13:27 Сейчас в теме
(28) А теперь следите за руками, как говорится:

Руководители = Новый Структура;
Руководители.Вставить("Руководитель", ВыбРуководитель);
Руководители.Вставить("ГлавныйБухгалтер", ВыбРуководитель);

ДеревоМакетовПечати = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(СсылкаНаДокумент, Неопределено);
СтрокаКнопки = ДеревоМакетовПечати.Строки.Найти("Счет-фактура1096","Текст");
Расшифровка = СтрокаКнопки.Расшифровка; 

Расшифровка.ДополнительныеПараметрыОбработки = Руководители;

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


Просто я не уверен, что ДополнительныеПараметрыОбработки находятся "в корне" структуры Расшифровка.
24. Fox_65 1 09.10.24 12:12 Сейчас в теме
(19) Да наподобие. Только через УниверсальныеМеханизмы.НапечататьВнешнююФорму.
25. nomad_irk 76 09.10.24 12:17 Сейчас в теме
(24) как именно вызывается метод? какие параметры используются?
26. Fox_65 1 09.10.24 12:38 Сейчас в теме
(25) Метод так и называется УниверсальныеМеханизмы.НапечататьВнешнююФорму.

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

Показать
27. nomad_irk 76 09.10.24 12:46 Сейчас в теме
(26) хорошо, разбираемся дальше.
Что внутри Расшифровка? Какие ключи и их значения есть у структуры?
30. Fox_65 1 09.10.24 13:31 Сейчас в теме
(27) Это стандартная структура дерева значений для выбранного макета. У вас что Ут 10 нет? Ладно. Вот вам стандартная функция из Ут 10
Функция НапечататьВнешнююФорму(Ссылка, ИсточникМакета) Экспорт
	
	ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ХранилищеВнешнейОбработки.Получить();
	Если ДвоичныеДанные = Неопределено Тогда
		ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
	КонецЕсли;
	ДополнительныеПараметры = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ДополнительныеПараметрыОбработки.Получить();
	
	Если ДвоичныеДанные = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТабДокумент = Неопределено;
	
	ИмяФайла = ПолучитьИмяВременногоФайла("epf");
	Попытка
		ДвоичныеДанные.Записать(ИмяФайла);
		Обработка = ВнешниеОбработки.Создать(ИмяФайла);
		Обработка.СсылкаНаОбъект = Ссылка;
		
		// Передать внешней обработке дополнительные параметры
		Если ДополнительныеПараметры <> Неопределено Тогда
			// Если у внешней обработки есть реквизит для дополнительных параметров, присвоить ему значение
			Если НЕ Обработка.Метаданные().Реквизиты.Найти("ДополнительныеПараметры") = Неопределено Тогда
				Обработка.ДополнительныеПараметры = ДополнительныеПараметры;
			КонецЕсли;
		КонецЕсли;
		
		ТабДокумент = Обработка.Печать();
		УдалитьФайлы(ИмяФайла);
		
		Если ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") И (ПустаяСтрока(ТабДокумент.ИмяПараметровПечати)) Тогда
			Попытка
				ИдентификаторОбработки = Строка(ИсточникМакета.СсылкаНаВнешнююОбработку.УникальныйИдентификатор());
				ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_" + СтрЗаменить(ИдентификаторОбработки, "-", "_");
				ТабДокумент.ИмяПараметровПечати = ТабДокумент.ИмяПараметровПечати + "_" + Ссылка.Метаданные().Имя;
			Исключение
			
			КонецПопытки;
		КонецЕсли;
	Исключение
		ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось сформировать внешнюю печатную форму!");
	КонецПопытки;
	
	Возврат ТабДокумент;

КонецФункции

Показать
31. nomad_irk 76 09.10.24 13:34 Сейчас в теме
(30) Если УТ10 настолько старая, что оперирует ДополнительныеПараметры в виде ХЗ, то заверните свою структуру с руководителями в ХЗ, делов-то.

Расшифровка.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ДополнительныеПараметрыОбработки = Новый ХранилищеЗначений(Руководители, Новый СжатиеДанных(9));

Не нужно ее при этом в сам элемент справочника пихать и перезаписывать.
32. Fox_65 1 09.10.24 13:49 Сейчас в теме
(31) Ут 10 Самая новая 10.3.88.3. И новее, дорогой мой, уже похоже не будет. Что поделаешь, что дополнительные параметры у них сделаны как ХЗ. Но это один из способов перенести во внешнюю печатную форму свои параметры. Согласитесь, что через ОХЗ получается менее геморойно.
33. user2107184 09.10.24 13:54 Сейчас в теме
(32)
Согласитесь, что через ОХЗ получается менее геморойно.
Ага. Ты же их потом за собой очищаешь? Или они продолжают храниться в разрезе пользователей?
Как бы намек на то, а что будет, если несколько человек одновременно будут печатать свои комплекты с разными подписантами?
35. Fox_65 1 09.10.24 14:00 Сейчас в теме
(33) Конечно. Мало того, что записываются для каждого пользователя, чтобы они лбами не сталкивались, но и после печати удаляются. Внешнюю форму ведь можно и просто из счет-фактуры распечатать (без обработки). Тогда там заполняются стандартные руководитель и главный бухгалтер. Если не удалю такая свистопляска пойдет.
38. user2107184 09.10.24 14:50 Сейчас в теме
(35) А если один пользюк в разных сеансах начнет печатать? )) Или в несколько потоков? )) Или несколько челов ходят под одним корпоративным пользюком?
39. Fox_65 1 09.10.24 14:57 Сейчас в теме
(38) Обработка не настолько продвинутая. Потоковая печать не предусмотрена. Печатается 1 комплект за раз. С одним подписантом.
34. nomad_irk 76 09.10.24 13:55 Сейчас в теме
(32)
Ут 10 Самая новая 10.3.88.3.

У меня есть ЗУП КОРП 2.5 последней доступной версии, там выглядит несколько иначе:
Функция НапечататьВнешнююФорму(Ссылка, ИсточникМакета) Экспорт
	
	Перем ДополнительныеПараметры;
	
	ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ХранилищеВнешнейОбработки.Получить();
	
	// Получить дополнительные параметры внешней обработки
	ИсточникМакета.Свойство("ДополнительныеПараметрыОбработки", ДополнительныеПараметры);
	
	Если ДвоичныеДанные = Неопределено Тогда
		ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
	КонецЕсли;
	
	Если ДвоичныеДанные = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТабДокумент = Неопределено;
	
	ИмяФайла = ПолучитьИмяВременногоФайла("epf");
	Попытка
		ДвоичныеДанные.Записать(ИмяФайла);
		Обработка = ВнешниеОбработки.Создать(ИмяФайла);
		Обработка.СсылкаНаОбъект = Ссылка;
		
		// Передать внешней обработке дополнительные параметры
		Если ДополнительныеПараметры <> Неопределено Тогда
			
			// Если у внешней обработки есть реквизит для дополнительных параметров, присвоить ему значение
			Если НЕ Обработка.Метаданные().Реквизиты.Найти("ДополнительныеПараметры") = Неопределено Тогда
				Обработка.ДополнительныеПараметры = ДополнительныеПараметры;
			КонецЕсли;
			
		КонецЕсли;
		
		ТабДокумент = Обработка.Печать();
		УдалитьФайлы(ИмяФайла);
	Исключение
		ОбщегоНазначенияЗК.СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось сформировать внешнюю печатную форму!");
	КонецПопытки;
	
	Возврат ТабДокумент;

КонецФункции
Показать


Согласитесь, что через ОХЗ получается менее геморойно.

Нет, хотя бы тем, что это еще очищать нужно, если пользователь отправит подряд несколько комплектов на печать с разными подписантами, то что в итоге получится - одному ктулху известно.
36. Fox_65 1 09.10.24 14:24 Сейчас в теме
(34) Так очищается сразу после печати комплекта. Я не жду пока сеанс закончится.
Кроме того через дополнительные параметры нет возможности разделить пользователей. Здесь больше вероятность, что напечатаются документы не с теми подписантами.
2. user2033930 08.10.24 20:32 Сейчас в теме
А в чем проблема? Сделать какой-нить параметр сеанса, да юзать его.
Некошерно, но быстро.
3. Fox_65 1 08.10.24 21:33 Сейчас в теме
(2) Интересная идея. У меня пока более некошерное решения. Через дополнительные параметры. Постоянная перезапись элемента справочника - вещь более жуткая.
4. Fox_65 1 08.10.24 22:20 Сейчас в теме
(2) Параметры сеанса немного слишком. Решил сделать через ХранилищеОбщихНастроек. Думаю так будет кошернее.
14. nomad_irk 76 09.10.24 11:19 Сейчас в теме
(13) я так понимаю, непосредственной перед печатью, открывается некая своя форма для выбора или просто происходит выбор нужного значения типовым методом, используйте это значение для добавления в "ДополнительныеПараметры" и дальше используйте в коде.
37. Fox_65 1 09.10.24 14:44 Сейчас в теме
Спасибо Всем! Похоже лучшее решение нашлось. Тема закрыта.
Оставьте свое сообщение

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