Имя: Пароль:
1C
 
1С ДО, Внешняя обработка
0 soldierboy
 
27.06.25
09:18
Всем привет, написал код для внешней печатной формы, загрузил внешнюю обработку в "Дополнительные отчеты и обработки" и при печати документа выдает ошибку печатная форма недоступна. Уже перепроверил название макета указанного в коде, но результат ноль. Версия Документооборота  КОРП ред 3.0.

Вот код обработки
#Область СведенияОВнешнейОбработке

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
	
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("Справочник.ДокументПредприятия");
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
	
	ПараметрыРегистрации.Вставить("Наименование", "Шаблон договора с внешним экспертом");
	ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
	ПараметрыРегистрации.Вставить("Версия", "1.0");
	ПараметрыРегистрации.Вставить("Информация", "Внешняя печатная форма ""Шаблон договора с внешним экспертом");
	
	ТаблицаКоманд = ПолучитьТаблицуКоманд();
	ДобавитьКоманду(ТаблицаКоманд, "Шаблон договора с внешним экспертом", "ДоговорСВнешнимЭкспертом", "ВызовСерверногоМетода");
	
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ВызовСерверногоМетода", ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL")
	
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление 			= Представление;
	НоваяКоманда.Идентификатор 			= Идентификатор;
	НоваяКоманда.Использование 			= Использование;
	НоваяКоманда.ПоказыватьОповещение 	= ПоказыватьОповещение;
	НоваяКоманда.Модификатор 			= Модификатор;
	
КонецПроцедуры

#КонецОбласти

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати) Экспорт
	
	ПараметрыПечати = Новый Структура;
	//Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Спецификация") Тогда
	//	СформироватьПечатнуюФорму(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, "Спецификация", "Спецификация",
	//		ОбъектыПечати, ПараметрыВывода);
	//КонецЕсли;
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ДоговорСВнешнимЭкспертом") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
		КоллекцияПечатныхФорм,
		"ДоговорСВнешнимЭкспертом", 
		////////////**********************Понять для чего нужна эта строка
		НСтр("ru = 'Договор с экспертами'"),
		СформироватьПечатнуюФорму(МассивОбъектов,ОбъектыПечати, ПараметрыПечати),
		,
		"ПФ_ДоговорСВнешнимЭкспертом"
		);
	КонецЕсли;
	
	
КонецПроцедуры   

Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыПечати) Экспорт
	
	// Объявление переменных
	Перем ТабличныйДокумент, Макет, Договор, РезультатЗапроса;
	Перем ВыборкаДетальныеЗаписи, ОбластьМакета;
	
	// Инициализация табличного документа
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб = Истина;
	ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
	
	// Получаем макет печатной формы
	Макет = ПолучитьМакет("ПФ_ДоговорСВнешнимЭкспертом");
	
	// Проверяем входные данные
	Если МассивОбъектов.Количество() = 0 Тогда
		Возврат ТабличныйДокумент;
	КонецЕсли;
	
	// Обрабатываем каждый документ в массиве
	Для Каждого Договор Из МассивОбъектов Цикл
		// Запрос данных контрагента
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|   Контрагенты.ИНН КАК ИНН,
		|   Контрагенты.ОсновнойБанковскийСчет КАК ОсновнойБанковскийСчет,
		|   Контрагенты.ОсновнойБанковскийСчет.Банк.Код КАК ОсновнойБанковскийСчетБанкКод,
		|   Контрагенты.ОсновнойБанковскийСчет.Банк.КоррСчет КАК ОсновнойБанковскийСчетБанкКоррСчет,
		|   Контрагенты.ОсновнойБанковскийСчет.НомерСчета КАК ОсновнойБанковскийСчетНомерСчета,
		|   Контрагенты.КонтактнаяИнформация.АдресЭП КАК АдресЭП,
		|   Контрагенты.ОсновнойБанковскийСчет.Банк КАК ОсновнойБанковскийСчетБанк
		|ИЗ
		|   Справочник.Контрагенты КАК Контрагенты
		|ГДЕ
		|   Контрагенты.Ссылка = &Контрагенты";
		
		Запрос.УстановитьПараметр("Контрагенты", Договор);
		
		Попытка
			РезультатЗапроса = Запрос.Выполнить();
		Исключение
			// Логирование ошибки запроса
			ЗаписьЖурналаРегистрации("ОшибкаПечатнойФормы", УровеньЖурналаРегистрации.Ошибка, , 
									 "Ошибка выполнения запроса: " + ОписаниеОшибки());
			Продолжить;
		КонецПопытки;
		
		// Проверка результатов запроса
		Если РезультатЗапроса = Неопределено ИЛИ РезультатЗапроса.Пустой() Тогда
			Продолжить;
		КонецЕсли;
		
		// Получаем данные контрагента
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		Если Не ВыборкаДетальныеЗаписи.Следующий() Тогда
			Продолжить;
		КонецЕсли;
		
		// Выводим основные области документа
		Попытка
			// Шапка договора
			ОбластьМакета = Макет.ПолучитьОбласть("ШапкаДоговор");
			ТабличныйДокумент.Вывести(ОбластьМакета);
			
			// Основные разделы договора
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "Шапка");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "ПредметДоговора");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "ОбязательстваСторон");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "ЦенаРаботИПорядокОплаты");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "СрокиИУсловияВыполненияРабот");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "ОтветственностьСторон");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "КонфиденциальнаяИнформация");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "СрокДействияДоговора");
			ВывестиОбластьМакета(Макет, ТабличныйДокумент, "ЗаключительноеПоложение");
			
			// Реквизиты и подписи сторон
			ОбластьМакета = Макет.ПолучитьОбласть("РеквизитыИПодписиСторон");
			ОбластьМакета.Параметры.Почта = ВыборкаДетальныеЗаписи.АдресЭП;
			ОбластьМакета.Параметры.ИНН = ВыборкаДетальныеЗаписи.ИНН;
			ОбластьМакета.Параметры.БИК = ВыборкаДетальныеЗаписи.ОсновнойБанковскийСчетБанкКод;
			ОбластьМакета.Параметры.КоррСчет = ВыборкаДетальныеЗаписи.ОсновнойБанковскийСчетБанкКоррСчет;
			ОбластьМакета.Параметры.НомерСчета = ВыборкаДетальныеЗаписи.ОсновнойБанковскийСчетНомерСчета;
			ОбластьМакета.Параметры.Банк = ВыборкаДетальныеЗаписи.ОсновнойБанковскийСчетБанк;
			
			// Дополнительные реквизиты
			ЗаполнитьДополнительныеРеквизиты(ОбластьМакета, Договор);
			
			ТабличныйДокумент.Вывести(ОбластьМакета);
			
			// Акт работ
			ОбластьМакета = Макет.ПолучитьОбласть("АктРабот");
			ЗаполнитьПараметрыАкта(ОбластьМакета, Договор);
			ТабличныйДокумент.Вывести(ОбластьМакета);
			
		Исключение
			// Логирование ошибки формирования печатной формы
			ЗаписьЖурналаРегистрации("ОшибкаПечатнойФормы", УровеньЖурналаРегистрации.Ошибка, , 
									 "Ошибка формирования печатной формы: " + ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
	
	Возврат ТабличныйДокумент;
КонецФункции

// Вспомогательная процедура для вывода области макета
Процедура ВывестиОбластьМакета(Макет, ТабличныйДокумент, ИмяОбласти)
	Область = Макет.ПолучитьОбласть(ИмяОбласти);
	ТабличныйДокумент.Вывести(Область);
КонецПроцедуры

// Вспомогательная процедура для заполнения дополнительных реквизитов
Процедура ЗаполнитьДополнительныеРеквизиты(ОбластьМакета, Договор)
	Перем Значение;
	
	// СНИЛС
	Значение = ПолучитьЗначениеРеквизита(Договор, "СНИЛС");
	ОбластьМакета.Параметры.СНИЛС = Значение;
	
	// Паспортные данные
	Значение = ПолучитьЗначениеРеквизита(Договор, "Дата Рождения");
	ОбластьМакета.Параметры.ДатаРождения = Значение;
	
	Значение = ПолучитьЗначениеРеквизита(Договор, "Серия Паспорта");
	ОбластьМакета.Параметры.СерияПаспорта = Значение;
	
	Значение = ПолучитьЗначениеРеквизита(Договор, "Номер паспорта");
	ОбластьМакета.Параметры.НомерПаспорта = Значение;
	
	Значение = ПолучитьЗначениеРеквизита(Договор, "Кем Выдан");
	ОбластьМакета.Параметры.КемВыданПаспорт = Значение;
	
	Значение = ПолучитьЗначениеРеквизита(Договор, "ДатаВыдачи");
	ОбластьМакета.Параметры.ДатаВыдачиПаспорта = Значение;
	
	// Адрес
	Значение = ПолучитьЗначениеРеквизита(Договор, "Адрес Регистрации");
	ОбластьМакета.Параметры.АдресРегистрации = Значение;
	
	// ФИО
	Значение = ПолучитьЗначениеРеквизита(Договор, "ФИО");
	ОбластьМакета.Параметры.ФИО = Значение;
КонецПроцедуры

// Вспомогательная процедура для заполнения параметров акта
Процедура ЗаполнитьПараметрыАкта(ОбластьМакета, Договор)
	Перем Значение;
	
	// Дата акта
	Значение = ПолучитьЗначениеРеквизита(Договор, "Дата");
	Если Значение = Неопределено Тогда
		Значение = ТекущаяДата();
	КонецЕсли;
	ОбластьМакета.Параметры.Дата = Значение;
	
	// Номер договора
	Значение = ПолучитьЗначениеРеквизита(Договор, "НомерДоговора2");
	ОбластьМакета.Параметры.НомерДоговора = Значение;
	
	// Дата договора
	Значение = ПолучитьЗначениеРеквизита(Договор, "ДатаДоговора2");
	Если Значение = Неопределено Тогда
		Значение = ТекущаяДата();
	КонецЕсли;
	ОбластьМакета.Параметры.ДатаДоговора = Значение;
КонецПроцедуры

// Вспомогательная функция для получения значения реквизита
Функция ПолучитьЗначениеРеквизита(Договор, ИмяРеквизита)
	Реквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
	Если Реквизит = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	Возврат УправлениеСвойствами.ЗначениеСвойства(Договор, Реквизит);
КонецФункции
1 Волшебник
 
27.06.25
11:23
Какой полный текст ошибки?
2 soldierboy
 
27.06.25
11:41
При печати документа выводит "Печатная форма недоступна"
3 Волшебник
 
27.06.25
11:43
(2) Найдите это сообщение в программном коде и проверьте условия его выдачи
4 reg0303
 
27.06.25
11:50
ТабличныйДокумент = Неопределено?
5 Gucci76
 
27.06.25
12:25
(0) Поищите как отлаживать ВПФ. А дальше дело техники.