8.х Печать из обработки внешней печатной формы.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ximera, 24 сен 2009.

  1. TopicStarter Overlay
    ximera
    Offline

    ximera Опытный в 1С

    Регистрация:
    5 фев 2008
    Сообщения:
    205
    Симпатии:
    0
    Баллы:
    26
    Доброго времени суток.
    Существует обработка, которая на основании некоторых заполненных полей, создает документы реализации в автоматическом режиме. Документы сохраняются и проводятся. Требуется их только распечатать. Беда только в том что распечатать нужно используя не стандартный макет, а внешнюю печатную форму. Как мне обратиться к ней? что передать в процедуру ДокументРеализации.Печать()??
    Заранее благодарю
  2. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!

    Предположим что Вам нужно распечатать документ "РеализациятоваровУслуг", каой - нибудь макет. К сожалению Вы не написали какая у Вас конфигурация. Приведу пример для УТ 10.3.7.9.

    1. Соберем все макеты

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

    2. Получение списка макетов

    Код:
    МакетыНакладной = ПреобразоватьДеревоВСписок(ДеревоМакетовПечатиНакладной);
    
    
    
    Процедура для получения списка

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

    3. Печатаем макет

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

    Удачи!
  3. TopicStarter Overlay
    ximera
    Offline

    ximera Опытный в 1С

    Регистрация:
    5 фев 2008
    Сообщения:
    205
    Симпатии:
    0
    Баллы:
    26
    А если конфигурация Бухгалтерия Предприятия, то видоизменять в Вашем коде много придется?
  4. Serg2000
    Offline

    Serg2000

    Регистрация:
    13 июл 2011
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Код:
    ДеревоМакетовПечатиРН = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(Документы.РеализацияТоваровУслуг.СоздатьДокумент().Ссылка, Документы.РеализацияТоваровУслуг.СоздатьДокумент().ПолучитьСтруктуруПечатныхФорм(),,,Ложь);
    СтрМакета = ДеревоМакетовПечатиРН.Строки.найти("Накладная2", "Имя");
    Если (СтрМакета<>Неопределено) И (СтрМакета.Расшифровка<>Неопределено) И (ТипЗнч      (СтрМакета.Расшифровка)=Тип("Структура")) И   (СтрМакета.Расшифровка.СсылкаНаВнешнююОбработку<>Неопределено) Тогда
    ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Реализация.Ссылка, СтрМакета.Расшифровка);
    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляровРеализации1, ПечататьНаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(Реализация, Реализация.Метаданные().Представление()), Реализация.Ссылка);
    Иначе
    Реализация.Печать(СтрМакета.Значение, КоличествоЭкземпляровРеализации1, ПечататьНаПринтер);
    КонецЕсли;
    
    Ошибка
    Значение не является значением объектного типа (значение)
    Реализация.Печать(СтрМакета.значение, КоличествоЭкземпляровРеализации1, ПечататьНаПринтер);
  5. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Наверно СтрМакета = Неопределено. В отладчике посмотрите само дерево и так-ли в нем называется макет.
  6. Serg2000
    Offline

    Serg2000

    Регистрация:
    13 июл 2011
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Да! Не находил он мою форму по имени. Оказывается Имя "Нормальное" есть только у встроенных печатных форм! А у внешних какие то крякозябли типа "9a5444d2-a120-4fc4-bc84-5cc920127150"
    Но имя "нормальное" у внешней печатной формы заносится в колонку "Текст"
    Так что в моем случае нужно было заменить строку
    Код:
    СтрМакета = ДеревоМакетовПечатиРН.Строки.найти("Накладная2", "Имя");
    
    на строку
    Код:
    СтрМакета = ДеревоМакетовПечатиРН.Строки.найти("Накладная2", "Текст");
    

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