28 марта 2010 г.

Как организовать подключение внешних печатных форм в документе 1C

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

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

Исходные данные: ОсновныеДействияФормы - идентификатор командной панели формы документа, на которой будет создано подменю печати. Подменю печати будет выглядеть так:

В модуле формы документа необходимо внести следующие изменения:

  • Описать переменные мДеревоМакетов, мПодменюПечати, мПечатьПоУмолчанию.
  • Добавить процедуры УстановитьКнопкиПечати, ОсновныеДействияФормыПечатьПоУмолчанию, ОсновныеДействияФормыПечать.
  • В процедуру обработки события формы ПередОткрытием добавить вызов процедуры УстановитьКнопкиПечати.
// Хранит дерево макетов печатных форм
Перем мДеревоМакетов;

// Хранит элемент управления подменю печати
Перем мПодменюПечати;

// Хранит элемент управления кнопку печать по умолчанию
Перем мПечатьПоУмолчанию;

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

// Процедура - обработчик нажатия на кнопку "Печать по умолчанию"
Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка)
    УниверсальныеМеханизмы.ПечатьПоДополнительнойКнопке(мДеревоМакетов, ЭтотОбъект, ЭтаФорма, Кнопка.Текст); 
КонецПроцедуры

// Процедура - обработчик нажатия на кнопку "Печать"
Процедура ОсновныеДействияФормыПечать(Кнопка)
    УниверсальныеМеханизмы.ПечатьПоДополнительнойКнопке(мДеревоМакетов, ЭтотОбъект, ЭтаФорма, Кнопка.Текст); 
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    // Установка кнопок печати
    УстановитьКнопкиПечати();
КонецПроцедуры

В модуле объекта (документа) нужно вставить процедуры Печать, процедуру формирования встроенной печатной формы (в моем случае это ПечатьСметыЗатрат) и процедуру ПолучитьСтруктуруПечатныхФорм. Если встроенных печатных форм несколько, то это нужно отразить в процедурах ПолучитьСтруктуруПечатныхФорм и Печать и добавить соответствующие процедуры формирования встроенных печатных форм. Если же встроенных печатных форм в документе нет вообще, то процедуру ПолучитьСтруктуруПечатныхФорм и процедуры формирования печатных форм можно опустить.

#Если Клиент Тогда

// Функция формирует табличный документ с печатной формой
//
// Возвращаемое значение:
//  Табличный документ - печатная форма
//
Функция ПечатьСметыЗатрат()
    ТабДокумент = Новый ТабличныйДокумент;
 
    //Здесь должен быть код формирования "встроенной" печатной формы

    Возврат ТабДокумент;
КонецФункции // ПечатьСметыЗатрат()

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

// Возвращает доступные варианты печати документа
//
// Возвращаемое значение:
//  Структура, каждая строка которой соответствует одному из вариантов печати
//  
Функция ПолучитьСтруктуруПечатныхФорм() Экспорт 
    Возврат Новый Структура("СметаЗатратПлан_Печать", "Смета затрат плановая");
КонецФункции // ПолучитьСтруктуруПечатныхФорм()

#КонецЕсли

Вот такой нехитрый функционал. Если не углубляться в подробности, то все довольно просто.

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

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

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

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

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