22 ноября 2009 г.

Как сделать подключаемую внешнюю печатную форму

В статье «Как правильно вносить изменения в типовые конфигурации 1С» я упомянул про подключаемые внешние печатные формы. Сделать внешнюю печатную форму совсем не сложно. Тем не менее этот вопрос часто обсуждается в Интернет-сообществах. В связи с этим сегодня объяснялка на заданную тему.

Подключение внешних печатных формы - это возможность типовых конфигураций, разработанных фирмой 1С, а не платформы «1С:Предприятие». Поэтому не удивляйтесь, если в конфигурациях других разработчиков Вы не обнаружите такой возможности.

Для пользователя функционал выглядит следующим образом. Для хранения внешних отчетов и обработок в конфигурации есть специальный справочник «Внешние обработки». В меню, как правило, имеется несколько различных команд для вызова данного справочника - «Дополнительные внешние печатные формы», «Дополнительные внешние обработки табличных частей», «Дополнительные внешние отчеты», «Дополнительные внешние обработки». Эти команды открывают один и тот же справочник «Внешние обработки», включая отбор по соответствующим видам обработок.

Форма элемента справочника для внешних печатных форм имеет вот такой вид:

Элемент справочника Внешние обработки для внешних печатных форм

Чтобы подключить внешнюю печатную форму необходимо выбрать внешнюю обработку и указать список объектов, для которых данная печатная форма будет использоваться. При необходимости, можно указать:

  • список дополнительных параметров, которые будут передаваться внешней обработке;
  • для каждого объекта несколько отборов, при выполнении которых печатная форма становится доступной для использования с данным объектом;
  • для каждого объекта свою отдельную печатную форму, но в списках печатных форм в объектах будет всегда появляться одинаковый пункт подменю;
  • для каждого объекта встроенную печатную форму, которая будет заменена указанной внешней.

Корректно зарегистрированная печатная форма будет выводиться в общем списке печатных форм объекта, вызываемого по кнопке «Печать». При этом форма будет помещена в конец этого списка, отделенная разделителем. Если подключаемая печатная форма заменяет стандартную, то она заменяется и показывается в списке стандартных печатных форм.

Список доступных печатных форм документа. Внешняя печатная форма помещается в конец списка через разделитель

Как видите, для пользователя нет практически никакой разницы между встроенными и внешними печатными формами.

Теперь посмотрим на функционал «изнутри», каким образом это все работает.

Внешняя печатная форма представляет собой внешнюю обработку, разработанную по определенным правилам. Чтобы соответствовать требованиям внешних печатных форм внешняя обработка должна содержать:

  1. Реквизит СсылкаНаОбъект, в который при вызове будет передана ссылка на объект, для которого необходимо выполнить печать.
  2. Экспортную функцию Печать() без параметров, возвращающую табличный документ.
  3. Необязательный реквизит ДополнительныеПараметры произвольного типа, которому будут передаваться дополнительные параметры примитивного типа в виде структуры.
  4. Также обработка может иметь в своем составе макет Параметры_Авторегистрации, используемый для автоматического заполнения принадлежности печатной формы в справочнике «Внешние обработки» и состоящий из 2-х колонок («полное имя метаданного» и «имя табличной части»).

Когда пользователь выбирает из списка печатных форм определенного объекта внешнюю печатную форму, конфигурация выполняет следующую последовательность действий:

  • Внешняя печатная форма, соответствующая выбору пользователя, сохраняется из справочника «Внешние обработки» во временный файл.
  • Реквизиту СсылкаНаОбъект внешней обработки присваивается значение ссылки на объект, для которого выполняется печать.
  • Если для печатной формы заданы дополнительные параметры и во внешней обработке существует реквизит ДополнительныеПараметры, в него передаются дополнительные параметры.
  • Управление передается экспортной функции Печать() внешней обработки.

Результатом работы функции Печать() должен стать сформированный табличный документ, который должен быть возвращен в качестве значения функции. Выводить табличный документ на печать (метод Напечатать()) или на экран (метод Показать()) не нужно, конфигурация сделает это сама.

При необходимости в обработке можно создать любые дополнительные реквизиты и экранную форму (формы) для работы с ними.

Далее в качестве примера приведен листинг модуля внешней печатной формы, которуя я назвал «Универсальная внешняя печатная форма».

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

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

Эта печатная форма, в принципе, должна корректно работать с любым документом. Все, что она делает, - печатает все реквизиты документа, а также дополнительные параметры, переданные в обработку, и дополнительные реквизиты самой обработки. Цель данной обработки - продемонстрировать на примере создание внешней печатной формы. Можете ее использовать в качестве шаблона при создании своих печатных форм.

Скачать готовую к использованию внешнюю обработку «Универсальная внешняя печатная форма» можно в кладовке:

Скачать Download

Комментировать в ВКонтакте

Комментировать в Facebook

Комментировать в Blogger

Комментариев нет:

Отправить комментарий