FAQ: Как создать внешнюю печатную форму на основе готовой

Тема в разделе "Статьи", создана пользователем BabySG, 20 янв 2012.

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Как создать внешнюю печатную форму на основе готовой? 1С 8.0/8.1
    _______________________________________________________

    Для разработки ВПФ в управляемом режиме (конфигурации на основе БСП, например: УТ11, УНФ) - читайте Технология создания внешних печатных форм, обработок, отчетов для управляемого режима 8.2.

    Предполагается, что у вас есть уже знания, полученные в процессе чтения этой темы, поэтому подробно затрагиваются только новые вопросы.

    Итак: нам потребовалось немного изменить макет счёта на оплату покупателю (работать будем с конфигигурацией Бухгалтерия 1.6):
    - убрать заголовок в макете счета на оплату (текст "Внимание! Оплата данного счета ..., при наличии доверенности и паспорта.")
    - изменить представление поставщика (т.е. нас) по требованию банка
    (задача из реальной жизни с временем работы на 15-20 минут)

    Создание обработки будет состоять их двух этапов:
    1 - создание полного аналога исходной печатной формы
    2 - доработка под собственные нужды

    Этап первый

    Для начала создадим пустую внешнюю обработку, только макет создавать не будем -
    мы его скопируем для последующего изменения из основной конфигурации. Чтобы скопировать макет в обработку из конфигурации - достаточно
    выделить его в дереве объектов, далее зайти в меню Правка-Копировать, после в дереве данных обработки в ветке макетов выбрать
    в меню Правка-Вставить Более удобный путь - напрямую перетащить мышкой этой макет из основной конфигурации в дерево данных
    обработки.

    Дальше открываем модуль объекта...
    [​IMG]
    ... и пишем такой код:
    Код:
    Функция Печать() Экспорт
    //... тут мы что-нибудь напишем потом
    КонецФункции
    Что мы сделали: для работы внешней печатной формы требуется экспортная (т.е. видимая для других объектов конфигурации) функция Печать,
    которая должна возвращать в основную программу сформированный табличный документ для предварительно просмотра и последующей печати.

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

    После того, как вставим текст функции - попробуем сохранить обработку. Конфигуратор предупредит нас, что в модуле он обнаружил ошибки и выведет
    их в в окно служебных сообщений. Вот примерный тест этих ошибок:
    Код:
    {ВнешняяОбработка.ВнешняяОбработка1(102,7)}: Переменная не определена (Тип)
    Если <<!--?-->>Тип = "Счет" Тогда
    {ВнешняяОбработка.ВнешняяОбработка1(224,7)}: Переменная не определена (Тип)
    Если <<!--?-->>Тип = "Счет" Тогда
    {ВнешняяОбработка.ВнешняяОбработка1(107,15)}: Переменная не определена (СтруктурнаяЕдиница)
    Если ТипЗнч(<<!--?-->>СтруктурнаяЕдиница) = Тип("СправочникСсылка.БанковскиеСчета") Тогда
    {ВнешняяОбработка.ВнешняяОбработка1(108,40)}: Переменная не определена (СтруктурнаяЕдиница)
    Банк = ?(НЕ ЗначениеЗаполнено(<<!--?-->>СтруктурнаяЕдиница.БанкДляРасчетов), СтруктурнаяЕдиница.Банк, СтруктурнаяЕдиница.БанкДляРасчетов);
    {ВнешняяОбработка.ВнешняяОбработка1(108,77)}: Переменная не определена (СтруктурнаяЕдиница)
    Банк = ?(НЕ ЗначениеЗаполнено(СтруктурнаяЕдиница.БанкДляРасчетов), <<!--?-->>СтруктурнаяЕдиница.Банк, СтруктурнаяЕдиница.БанкДляРасчетов);
    {ВнешняяОбработка.ВнешняяОбработка1(108,102)}: Переменная не определена (СтруктурнаяЕдиница)
    Банк = ?(НЕ ЗначениеЗаполнено(СтруктурнаяЕдиница.БанкДляРасчетов), СтруктурнаяЕдиница.Банк, <<!--?-->>СтруктурнаяЕдиница.БанкДляРасчетов);
    {ВнешняяОбработка.ВнешняяОбработка1(112,38)}: Переменная не определена (СтруктурнаяЕдиница)
    НомерСчета = ВернутьРасчетныйСчет(<<!--?-->>СтруктурнаяЕдиница);
    {ВнешняяОбработка.ВнешняяОбработка1(123,21)}: Переменная не определена (СтруктурнаяЕдиница)
    Если ПустаяСтрока(<<!--?-->>СтруктурнаяЕдиница.ТекстКорреспондента) Тогда
    {ВнешняяОбработка.ВнешняяОбработка1(125,27)}: Переменная не определена (СтруктурнаяЕдиница)
    Если ЗначениеЗаполнено(<<!--?-->>СтруктурнаяЕдиница.БанкДляРасчетов) Тогда
    {ВнешняяОбработка.ВнешняяОбработка1(126,59)}: Переменная не определена (СтруктурнаяЕдиница)
    ТекстКорреспондента = ТекстКорреспондента + " р/с " + <<!--?-->>СтруктурнаяЕдиница.НомерСчета
    {ВнешняяОбработка.ВнешняяОбработка1(127,15)}: Переменная не определена (СтруктурнаяЕдиница)
    + " в " + <<!--?-->>СтруктурнаяЕдиница.Банк + " " + СтруктурнаяЕдиница.Банк.Город;
    {ВнешняяОбработка.ВнешняяОбработка1(127,47)}: Переменная не определена (СтруктурнаяЕдиница)
    + " в " + СтруктурнаяЕдиница.Банк + " " + <<!--?-->>СтруктурнаяЕдиница.Банк.Город;
    {ВнешняяОбработка.ВнешняяОбработка1(130,26)}: Переменная не определена (СтруктурнаяЕдиница)
    ТекстКорреспондента = <<!--?-->>СтруктурнаяЕдиница.ТекстКорреспондента;
    {ВнешняяОбработка.ВнешняяОбработка1(112,17)}: Процедура или функция с указанным именем не определена (ВернутьРасчетныйСчет)
    НомерСчета = <<!--?-->>ВернутьРасчетныйСчет(СтруктурнаяЕдиница);
    Давайте разберём эти ошибки:
    *** 1. Переменная не определена (Тип) - если посмотреть исходный код функции, становиться ясно, что переменная тип являлась параметром:
    Функция ПечатьСчетаЗаказа(Тип), мы же этот параметр удалили. В данном случае - этот параметр содержал в себе строку с именем макета
    для печати. Т.к. нам требуется печатать только один макет - определеим эту переменную следующим образом: мы измененим заголовок
    функции Печать в модуле обработки:
    Код:
    Функция Печать(Тип = "Счет")
    Что означает такая запись: она означает, что если в функцию небыл передан параметр, то параметр Тип примет значение
    по умолчанию "Счет", что нам и требуется для работы.

    *** 2. Переменная не определена (СтруктурнаяЕдиница) - данная переменная является реквизитом документа СчетНаОплатуПокупателю, т.к.
    в модуле внешней печатной формы мы этот реквизит не видим (мы не находимся в теле объекта документ), то получим эту переменную через
    ссылку на документ, т.е. через реквизит обработки СсылкаНаОбъект, в который програама передат ссылку на текущий документ.
    Добавим в начало функции следующую строку:
    Код:
    СтруктурнаяЕдиница = СсылкаНаОбъект.СтруктурнаяЕдиница;
    *** 3. Процедура или функция с указанным именем не определена (ВернутьРасчетныйСчет) - данная функция определена (т.е. описана) в модуле
    документа, соответственно - нам достаточно полностью перенести код этой функции в нашу обработку.

    Итак, теперь модуль обработки выглядит примерно следующим образом:

    Код:
    Функция ВернутьРасчетныйСчет(СчетКонтрагента)
    
    БанкДляРасчетов = СчетКонтрагента.БанкДляРасчетов;
    Результат       = ?(БанкДляРасчетов.Пустая(), СчетКонтрагента.НомерСчета, СчетКонтрагента.Банк.КоррСчет);
    
    Возврат Результат;
    
    КонецФункции // ВернутьРасчетныйСчет()
    
    // Функция формирует табличный документ с печатной формой заказа или счета,
    // разработанного методистами
    //
    // Возвращаемое значение:
    //  Табличный документ - сформированная печатная форма
    //
    Функция Печать(Тип = "Счет") Экспорт
    
    СтруктурнаяЕдиница = СсылкаНаОбъект.СтруктурнаяЕдиница;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
    
    // ...текст программы...
    
    ОбластьМакета.Параметры.Заполнить(Шапка);
    ТабДокумент.Вывести(ОбластьМакета);
    
    Возврат ТабДокумент;
    КонецФункции // ПечатьСчетаЗаказа()
    
    
    Если всё правильно сделано - то теперь мы можем сохранить обработку и мы получим полный внешний аналог встроенной печатной формы.

    Этап второй

    Теперь внесём необходимые изменения при печати в макет (предполагается, что вы умеете работать с макетами), а также изменим
    текст поставщика в шапке счёта.
    [​IMG]
    Как мы видим по коду программы, текст получателя заполняется в этом месте:
    Код:
    Если ПустаяСтрока(СтруктурнаяЕдиница.ТекстКорреспондента) Тогда
    ТекстКорреспондента = СведенияОПоставщике.ПолноеНаименование;
    Если ЗначениеЗаполнено(СтруктурнаяЕдиница.БанкДляРасчетов) Тогда
    ТекстКорреспондента = ТекстКорреспондента + " р/с " + СтруктурнаяЕдиница.НомерСчета
    + " в " + СтруктурнаяЕдиница.Банк + " " + СтруктурнаяЕдиница.Банк.Город;
    КонецЕсли;   
    Иначе
    ТекстКорреспондента = СтруктурнаяЕдиница.ТекстКорреспондента;
    КонецЕсли;       
    ОбластьМакета.Параметры.ПредставлениеПоставщика = ТекстКорреспондента;
    Закзазчик поставил условие, что бы текст для данной ячеки брался из наименования плательщика в платежных поручениях на
    перечисление налогов. Этот текст храниться в реквизите элемента справочника Организации - нам осталось только
    получить к нему доступ. Если посмотреть на реквизиты документа, то мы уидим что в них храниться данные об организации,
    по которой выписывался документ, а нужный нам текст храниться в реквизите организации - теперь мы знаем, как получить доступ:
    Код:
    ОбластьМакета.Параметры.ПредставлениеПоставщика =
    СсылкаНаОбъект.Организация.НаименованиеПлательщикаПриПеречисленииНалогов;
    Вот и всё - макет готов к работе и его можно подключать к конфигурации!


    В этой теме вы можете взять обработку, которая должна была получиться в итоге.

    BabySG

    PS. Обсуждения, вопросы, предложения - всё в этой теме.
    Последнее редактирование модератором: 8 мар 2014
Статус темы:
Закрыта.

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