8.х v8.3: Как программно сформировать внешнюю печатную форму документа

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем zerbite, 15 янв 2016.

  1. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Имеется обработка в которой есть реквизит Объект.ПрихНакл, в которой хранится ссылка на документ ПоступлениеТоваровУслуг, для этого документа прописана внешняя печатная форма "Приемо-сдаточный акт", из документа все печатает. а как эту форму сформировать из обработки, или с любого другого случайного места?
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.568
    Симпатии:
    717
    Баллы:
    204
    Воспользоваться кодом формирования ПФ и запустить его в другом случайном месте.
  3. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    я уже написал такую процедуру, она запускается, формируется, но не выводиться на экран, что делать ума не приложу?
    причем менять Возврат ТабличныйДокумент; на ТабличныйДокумент.Показать(); не хотелось бы, потому как это поломается механизм стандартной печати из документа, кроме того показать - просто выведет на экран, а удобно когда он выводить в обработку печать документов со всем функционалом.
    :
    Процедура ПечатьИзВПФ(ИмяВПФ); //
    СсылкаНаВПФ = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяВПФ);
    Если СсылкаНаВПФ.Пустая() Тогда
    Сообщить("В справочнике 'Внешние обработки' не нашли внешнюю печатную форму с наименованием '"+ИмяВПФ+"'");
    Возврат;
    КонецЕсли;

    Попытка
    ИмяВременногоФайла = КаталогВременныхФайлов()+"тмп_впф.epf";
    Исключение
    Сообщить ("Невозможно создать файл обработке в каталоге временных файлов <<"+
    +КаталогВременныхФайлов()+">>. Возможно, не хватает прав доступа в Windows в папку для данного сеанса 1С ");
    Возврат;
    КонецПопытки;

    ДвоичныеДанные = СсылкаНаВПФ.ХранилищеОбработки.Получить();
    ДвоичныеДанные.Записать(ИмяВременногоФайла);

    Попытка
    ОбрОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла);
    //ОбрОбъект.ДокОбъект = ЭтотОбъект; // НЕ исп. метод скопировать. Передать ТАК - особенности ВДГБ;
    Исключение
    Сообщить("Ошибка создания объекта из временного файла обработки "+ИмяВременногоФайла);
    Возврат;
    КонецПопытки;

    МассивОбъектовНазначения = Новый Массив;
    МассивОбъектовНазначения.Добавить(Объект.ПрихНакл);

    ОбъектыПечати = Новый СписокЗначений;

    КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
    КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета");
    КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРЕГ");
    КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета");
    КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
    КоллекцияПечатныхФорм.Колонки.Добавить("Экземпляров");
    КоллекцияПечатныхФорм.Колонки.Добавить("Картинка");
    КоллекцияПечатныхФорм.Колонки.Добавить("ПолныйПутьКМакету");
    КоллекцияПечатныхФорм.Колонки.Добавить("ИмяФайлаПечатнойФормы");
    стр=КоллекцияПечатныхФорм.Добавить();
    стр.ИмяМакета="ПриемоСдаточныйАкт";
    стр.ИмяВРЕГ="ПРИЕМОСДАТОЧНЫЙАКТ";
    стр.Экземпляров=1;

    //ИмяМакета=ПриемоСдаточныйАкт, ИмяВРЕГ=ПРИЕМОСДАТОЧНЫЙАКТ, СинонимМакета=, ТабличныйДокумент=, Экземпляров=1, Картинка=, ПолныйПутьКМакету=, ИмяФайлаПечатнойФормы=,

    // Проба печати
    Попытка
    ОбрОбъект.печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, Ложь);
    //ТаблДок.Вывести();
    Исключение
    А=1; // Точка останова для отладки!
    Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке() )); // ВНЕШНЮЮ печатную форму из справончика ВПФ можно спокойно поправить!
    КонецПопытки;

    КонецПроцедуры


    а вот собственно модуль внешней обработки загрузки внешним файлом.

    Вложения:

  4. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.568
    Симпатии:
    717
    Баллы:
    204
    Так и не понял, в чем сложности взять код формировать ПФ из внешней обработки и использовать его в нужном месте, не меняя ничего?
    Красиво показать пользователю сформированную ПФ - этим занимается УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию()
    Формирование ПФ происходит непосредственно в СформироватьПечатнуюФормуПриемоСдаточногоАкта(МассивОбъектов[0], ОбъектыПечати)

    МассивОбъектов[0] - это говнокод в данном случае, т.к. при выделении юзером нескольких документов в списке и отправке на печать будет вылезать одна ПФ, первого документа из выделенного списка.
  5. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    1. вы смысле взять код? вы предлагаете сделать копию ВПФ в другой обработке?
    т.е. если потом потребуется доработать эту печатную форму, то надо будет менять в двух местах, либо они будут работать по разному, и вы это решение называет не "говноподходом"
    2. у меня уже обработка вызывается и через экспортную процуеду Печать, а значит и УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию() - тоже вызывается но на экране ничего не отображается.
    3. я знаю что формирование формы происходит в СформироватьПечатнуюФормуПриемоСдаточногоАкта() я ее сам написал, точнее сильно модифицировал.
    4.МассивОбъектов[0] - написано упрощенно, для того чтобы пусть хоть так счас распечатается - но даже и так не работает
  6. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.568
    Симпатии:
    717
    Баллы:
    204
    Что происходит внутри УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию()?
  7. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    не знаю), но судя по конфигуратору почти ничего:


    // Добавляет табличный документ в коллекцию печатных форм.
    //
    // Параметры:
    // КоллекцияПечатныхФорм - ТаблицаЗначений - см. ПодготовитьКоллекциюПечатныхФорм();
    // ИмяМакета - Строка - имя макета;
    // СинонимМакета - Строка - представление макета;
    // ТабличныйДокумент - ТабличныйДокумент - печатная форма документа;
    // Картинка - Картинка;
    // ПолныйПутьКМакету - Строка - путь к макету в дереве метаданных.
    Процедура ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, ИмяМакета, СинонимМакета, ТабличныйДокумент, Картинка = Неопределено, ПолныйПутьКМакету = "") Экспорт

    Стр = КоллекцияПечатныхФорм.Найти(ВРег(ИмяМакета), "ИмяВРЕГ");

    Если Стр <> Неопределено Тогда
    Стр.ТабличныйДокумент = ТабличныйДокумент;
    Стр.СинонимМакета = СинонимМакета;
    Стр.Картинка = Картинка;
    Стр.ПолныйПутьКМакету = ПолныйПутьКМакету;
    КонецЕсли;

    КонецПроцедуры
  8. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.568
    Симпатии:
    717
    Баллы:
    204
    Значит красивый вывод происходит с помощью другой процедуры/функции.
    Посмотрите как оно устроено в любой типовой более менее свежего релиза, особенно, с управляемыми формами.
    Последнее редактирование: 19 янв 2016
  9. alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    Кстати, а в подписках и общих модулях нигде не нужно прописывать объект, к которому подключается ПФ ?
  10. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    в этом и заключался вопрос!!! как это сделать... я уже смотрел и не смог найти - поэтому и обратился за помощью на этом форум
    --- Объединение сообщений, 19 янв 2016 ---
    тип объекта прописывается Поступление товаров и услуг

    Вложения:

  11. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.568
    Симпатии:
    717
    Баллы:
    204
    Чудеса начинаются с УправлениеПечатьюКлиент.ВыполнитьКомандуПечати() :)
  12. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    прошу прощения, поясните пожалуйста а как его использовать?
    с какими параметрами его вызывать?

    надо просто вызвать ВыполнитьКомандуПечати() ? или надо сначала выполнить печать(), а потом ВыполнитьКомандуПечати()
  13. TopicStarter Overlay
    zerbite
    Offline

    zerbite

    Регистрация:
    2 окт 2014
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    НЕТ, ответ оказался очень простой, без всей этой ерунды))

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

    ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);


    код должен выполняться на клиенте, а функция НайтиВПФ() - должны быть на сервере и возвращать ссылку из Справочники.ДополнительныеОтчетыИОбработки

Поделиться этой страницей