Ошибка во внешней печатной форме счета УНФ
Всем привет. Опыт программирования небольшой. Прошу помощи...
Сделал внешнюю печ. форму счета.
Если запустить ее как внешнюю обработку - все печатается и из документа "счет" и из документа "Заказ покупателя".
Но если добавить ее как внеш. печ. форму, то при попытке печати из документа Счет, выдает ошибку:
"Значение не является значением объектного типа (Табличный документ)"
Делал вроде как обычно: скопировал код из процедуры "Печать" из модуля менеджера документа Счет,
потом перенес туда процедуры из обработки "ПечатьСчетаНаОплату"
Но в процедуре Печать как-то не так, как было у меня раньше...
Раньше была команда:
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(...
А в этой такой команды нет.
Не могу разобраться, что сделать, чтобы заработало?
Сделал внешнюю печ. форму счета.
Если запустить ее как внешнюю обработку - все печатается и из документа "счет" и из документа "Заказ покупателя".
Но если добавить ее как внеш. печ. форму, то при попытке печати из документа Счет, выдает ошибку:
"Значение не является значением объектного типа (Табличный документ)"
Делал вроде как обычно: скопировал код из процедуры "Печать" из модуля менеджера документа Счет,
потом перенес туда процедуры из обработки "ПечатьСчетаНаОплату"
Но в процедуре Печать как-то не так, как было у меня раньше...
Раньше была команда:
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(...
А в этой такой команды нет.
Не могу разобраться, что сделать, чтобы заработало?
По теме из базы знаний
- Внешняя печатная форма «СчетНаОплату» для Управление Небольшой Фирмой 1.4
- Комплект документов (Счет + УПД) для Заказа клиента. УНФ 1.6, УТ 11.4
- Печать договора поставки для УТ 11.5, УТ 11.4, КА 2.4 и ERP 2.4 (внешняя печатная форма)
- Универсальный передаточный документ (УПД) для УНФ и КА 2.0 (в том числе и в редакции Федеральный закон от 31.07.2023 № 389-ФЗ)
- 1С:УНФ 8. Полиграфия 2
Найденные решения
(7) Вам шашечки или ехать? ;)
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:
Я просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ТабДок = ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетНаОплату", "СчетНаОплату",
ТабДок,,"СчетНаОплату");
Возврат ТабДок;
КонецФункции
Функция ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати)
ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Универсальные_СчетНаОплатуВнешняя";//Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_СчетНаОплату";//Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
ПечатнаяФорма.СинонимМакета = "Счет на оплату";//Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);
Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.СчетНаОплату") Тогда
ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
Иначе
Ошибки = Неопределено;
ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокументаЗаказ(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле, Ошибки);
КонецЕсли;
Если СтрокаТаблицы.ЧастичнаяОплата Тогда
Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
КонецЕсли;
ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);
КонецЕсли;
КонецЦикла;
//Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда
//
// Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
// Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
// ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
// КонецЕсли;
// КонецЦикла;
//
//КонецЕсли;
//ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов,
//КоллекцияПечатныхФорм);
Возврат ТабДок;
КонецФункции
ПоказатьЯ просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Печать - это не функция, а процедура. ТабличныйДокумент это реквизит коллекции печатных форм. УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию есть и широко используется, почему его нет у вас не знаю.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ДоговорПоставки") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Договор поставки", "Договор поставки", ПечатнаяФорма(МассивОбъектов, ОбъектыПечати));
КонецЕсли;
КонецПроцедуры
(2) сокращу код, что бы была понятна мысль которую хочу донести:
что видим:
0) в цикле, при каждой итерации, пересоздаются переменные ПечатнаяФорма и ТабДок
1) первая переменная за пределы этой функции не выходит, так зачем её создавать и заполнять?
2) вторая - возвращается только последнее значение... тогда зачем нужен цикл и многократное её формирование?
PS как уже сказали выше, что-то в логике у вас совсем не так как надо...
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);
КонецЕсли;
КонецЦикла;
Возврат ТабДок;
КонецФункции
Показать0) в цикле, при каждой итерации, пересоздаются переменные ПечатнаяФорма и ТабДок
1) первая переменная за пределы этой функции не выходит, так зачем её создавать и заполнять?
2) вторая - возвращается только последнее значение... тогда зачем нужен цикл и многократное её формирование?
PS как уже сказали выше, что-то в логике у вас совсем не так как надо...
(4) RustamZz, благодарю за ответ.
"Печать - это не функция, а процедура"
-----------
Сделал функцией, чтобы отладить печать через запуск формы обработки.
По идее, не результат не влияет (раньше так уже делал).
============
что-то в логике у вас совсем не так как надо...
-------------
Вот в этом и вопрос.
Код скопировал из процедуры печати из модуля менеджера документа "Счет..." (УНФ)
И не понимаю, как там это работает.
Видимо, пойду стандартным путем - сделаю как у вас в (3)
"Печать - это не функция, а процедура"
-----------
Сделал функцией, чтобы отладить печать через запуск формы обработки.
По идее, не результат не влияет (раньше так уже делал).
============
что-то в логике у вас совсем не так как надо...
-------------
Вот в этом и вопрос.
Код скопировал из процедуры печати из модуля менеджера документа "Счет..." (УНФ)
И не понимаю, как там это работает.
Видимо, пойду стандартным путем - сделаю как у вас в (3)
(5)
наверняка в УНФ есть обработки с именем начинающемся на "Печать"
возьми от туда за образец процедуру Печать, она должна иметь примерно такой вид:
PS взял из УТ, грузить УНФ специально для этого сообщения - лень.
(5)
для отладки, в моём примере примере есть "СформироватьПечатнуюФормуЗаказаКлиента()"
в вашем СформироватьПФ(), т.е. делать ещё Печать функцией - не вижу смысла.
Вот в этом и вопрос
наверняка в УНФ есть обработки с именем начинающемся на "Печать"
возьми от туда за образец процедуру Печать, она должна иметь примерно такой вид:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаказКлиента") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ЗаказКлиента",
НСтр("ru = 'Заказ клиента'"),
СформироватьПечатнуюФормуЗаказаКлиента(СтруктураТипов, ОбъектыПечати, ПараметрыПечати));
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, СтруктураТипов, КоллекцияПечатныхФорм);
КонецПроцедуры
Показать(5)
Сделал функцией, чтобы отладить печать через запуск формы обработки.
для отладки, в моём примере примере есть "СформироватьПечатнуюФормуЗаказаКлиента()"
в вашем СформироватьПФ(), т.е. делать ещё Печать функцией - не вижу смысла.
(6)
Процедура Печать в модуле менеджера документа "Счет на оплату" (УНФ) выглядит так
Именно поэтому и возник вопрос: может ли этот код работать во внешней печ. форме?
(ну, в документе "Счет на оплату" он же работает)
Но вот как он работает, я не понимаю... (((
наверняка в УНФ есть обработки с именем начинающемся на "Печать"
Процедура Печать в модуле менеджера документа "Счет на оплату" (УНФ) выглядит так
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, Обработки.ПечатьСчетНаОплату.ИдентификаторПечатнойФормы(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле));
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
ПечатнаяФорма.ПолныйПутьКМакету = Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
ПечатнаяФорма.СинонимМакета = Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);
ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
Если СтрокаТаблицы.ЧастичнаяОплата Тогда
Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
КонецЕсли;
Обработки.ПечатьСчетНаОплату.СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, СтрокаТаблицы.ЧастичнаяОплата);
КонецЕсли;
КонецЦикла;
Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда
Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов,
КоллекцияПечатныхФорм);
КонецПроцедуры
ПоказатьИменно поэтому и возник вопрос: может ли этот код работать во внешней печ. форме?
(ну, в документе "Счет на оплату" он же работает)
Но вот как он работает, я не понимаю... (((
(7) Вам шашечки или ехать? ;)
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:
Я просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ТабДок = ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетНаОплату", "СчетНаОплату",
ТабДок,,"СчетНаОплату");
Возврат ТабДок;
КонецФункции
Функция ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати)
ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Универсальные_СчетНаОплатуВнешняя";//Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_СчетНаОплату";//Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
ПечатнаяФорма.СинонимМакета = "Счет на оплату";//Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);
Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.СчетНаОплату") Тогда
ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
Иначе
Ошибки = Неопределено;
ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокументаЗаказ(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле, Ошибки);
КонецЕсли;
Если СтрокаТаблицы.ЧастичнаяОплата Тогда
Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
КонецЕсли;
ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);
КонецЕсли;
КонецЦикла;
//Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда
//
// Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
// Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
// ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
// КонецЕсли;
// КонецЦикла;
//
//КонецЕсли;
//ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов,
//КоллекцияПечатныхФорм);
Возврат ТабДок;
КонецФункции
ПоказатьЯ просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот