В начало

Программное добавление кнопки печати в БП-3.0.57.17

 

            Нужно программно добавить кнопку печати на форму документа в «БП-3.0.57.17».

Рис. Структура документа «Документ1»

 

Листинг. Общий модуль «УправлениеПечатьюПредопределяемый»

Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт

           

            СписокОбъектов.Добавить(Документы.Документ1);

           

            СписокОбъектов.Добавить(Справочники.БанковскиеСчета);

            СписокОбъектов.Добавить(Справочники.ДоверенностиНалогоплательщика);

            СписокОбъектов.Добавить(Справочники.ДоговорыКонтрагентов);

            СписокОбъектов.Добавить(Справочники.Контрагенты);

                ….

 

Листинг. Для «ФормыДокумента»

//////////////////////////

//Обработчики событий

//////////////////////////

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            // СтандартныеПодсистемы.ПодключаемыеКоманды

            ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);

            // Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

 

&НаСервере

Процедура ПриЧтенииНаСервере(ТекущийОбъект)

            // СтандартныеПодсистемы.ПодключаемыеКоманды

            ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);

            // Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

 

&НаКлиенте

Процедура ПриОткрытии(Отказ)

            // СтандартныеПодсистемы.ПодключаемыеКоманды

            ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);

            // Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

 

///////////////////////////////////////////////

// СтандартныеПодсистемы.ПодключаемыеКоманды

//////////////////////////////////////////////

&НаКлиенте

Процедура Подключаемый_ВыполнитьКоманду(Команда)

            ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);

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

 

&НаСервере

Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)

            ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);

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

 

&НаКлиенте

Процедура Подключаемый_ОбновитьКоманды()

            ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);

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

 

 

Листинг. Для «ФормыСписка»

&НаСервере

Процедура НастройкиДинамическогоСписка()

            Отчеты.РеестрДокументов.НастройкиДинамическогоСписка(ЭтотОбъект);

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

 

//================================================

// СтандартныеПодсистемы.ПодключаемыеКоманды

//================================================

&НаКлиенте

Процедура Подключаемый_ВыполнитьКоманду(Команда)

            Если Команда.Имя = "ПодменюПечатьОбычное_Реестр" Тогда

                        НастройкиДинамическогоСписка();

            КонецЕсли;

            ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);

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

 

&НаСервере

Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)

            ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);

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

 

&НаКлиенте

Процедура Подключаемый_ОбновитьКоманды()

            ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);

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

 

 

            Обработчики «ПриСозданииНаСервере» нужно СОЗДАВАТЬ, а не копировать или писать, иначе они не работают.

Рис. Создание обработчика «ПриСозданииНаСервере»

 

Листинг. Модуль менеджера документа «Документ1»

Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

            КомандаПечати = КомандыПечати.Добавить();

            КомандаПечати.Идентификатор = "Макет1";

            КомандаПечати.Представление = НСтр("ru = 'Макет1'");

            КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;

            //КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";

            //КомандаПечати.СписокФорм    = "ФормаСписка,ФормаДокумента";

                       

            КомандаПечати = КомандыПечати.Добавить();

            КомандаПечати.Идентификатор = "Макет2";

            КомандаПечати.Представление = НСтр("ru = 'Макет2'");

            КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;

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

 

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

            Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Макет1") Тогда

            УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Макет1", "Макет1",

            ПечатьМакета1(МассивОбъектов, ОбъектыПечати), ОбъектыПечати, "Документы.Документ1.Макет1");

            КонецЕсли;  

           

            Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Макет2") Тогда

            УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Макет2", "Макет2",

            ПечатьМакета2(МассивОбъектов, ОбъектыПечати), ОбъектыПечати, "Документы.Документ1.Макет2");

            КонецЕсли;                

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

 

Функция ПечатьМакета1(МассивОбъектов, ОбъектыПечати) Экспорт

            ТабДок = Новый ТабличныйДокумент;

            Макет = Документы.Документ1.ПолучитьМакет("Макет1");

            Запрос = Новый Запрос;

            Запрос.Текст =

            "ВЫБРАТЬ

            |          Документ1.Дата КАК Дата,

            |          Документ1.Номер КАК Номер

            |ИЗ

            |          Документ.Документ1 КАК Документ1";

            Выборка = Запрос.Выполнить().Выбрать();

           

            ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

            Шапка = Макет.ПолучитьОбласть("Шапка");

            ТабДок.Очистить();

           

            ВставлятьРазделительСтраниц = Ложь;

            Пока Выборка.Следующий() Цикл

                        Если ВставлятьРазделительСтраниц Тогда

                                   ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

                        КонецЕсли;

                       

                        ТабДок.Вывести(ОбластьЗаголовок);

                       

                        Шапка.Параметры.Заполнить(Выборка);

                        ТабДок.Вывести(Шапка, Выборка.Уровень());

                       

                        ВставлятьРазделительСтраниц = Истина;

            КонецЦикла;

Возврат ТабДок;

КонецФункции

 

Функция ПечатьМакета2(МассивОбъектов, ОбъектыПечати) Экспорт

            ТабДок = Новый ТабличныйДокумент;

            Макет = Документы.Документ1.ПолучитьМакет("Макет2");

            Запрос = Новый Запрос;

            Запрос.Текст =

            "ВЫБРАТЬ

            |          Документ1.Дата КАК Дата,

            |          Документ1.Номер КАК Номер

            |ИЗ

            |          Документ.Документ1 КАК Документ1";

            Выборка = Запрос.Выполнить().Выбрать();

           

            ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

            Шапка = Макет.ПолучитьОбласть("Шапка");

            ТабДок.Очистить();

           

            ВставлятьРазделительСтраниц = Ложь;

            Пока Выборка.Следующий() Цикл

                        Если ВставлятьРазделительСтраниц Тогда

                                   ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

                        КонецЕсли;

                       

                        ТабДок.Вывести(ОбластьЗаголовок);

                       

                        Шапка.Параметры.Заполнить(Выборка);

                        ТабДок.Вывести(Шапка, Выборка.Уровень());

                       

                        ВставлятьРазделительСтраниц = Истина;

            КонецЦикла;

Возврат ТабДок;

КонецФункции

 

            Если в процедуре «Печать», что находится в модуле менеджера указать «Документ.Документ1.Макет1» вместо «Документы.Документ1.Макет1», то вылетает ошибка.

Рис. Ошибка «Команда не может быть выполнена для указанного объекта»

 

            Эта же ошибка вылетает, если не установить флаг «Использовать всегда» напротив реквизита «Ссылка», что находится в динамическом списке «Список», т.е. в форме списка в динамическом списке ОБЯЗАТЕЛЬНО должна быть «Ссылка».

Рис. Установка флага «Использовать всегда»

 

            Далее тестируем.

Рис. Форма документа «Документ1» с выпадающим списком макетов для печати

 

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