Печать по умолчанию в документах и справочниках


В документах присутствует кнопка "Печать" и можно задать "Кнопку" для печати прямо из формы документа. Но печатных форм больше чем одна и хочется чтобы кнопок по умолчанию было побольше.

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

Необходимые изменения:

1 В своем общем модуле размещаем вспомогательную функцию

// Функция «расщепляет» строку на подстроки, используя заданный
//      разделитель. Разделитель может иметь любую длину.
//      Если в качестве разделителя задан пробел, рядом стоящие пробелы
//      считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
//      игнорируются.
//      Например,
//      РазложитьСтрокуВМассивПодстрок(«,один,,,два», «,») возвратит массив значений из пяти элементов,
//      три из которых — пустые строки, а
//      РазложитьСтрокуВМассивПодстрок(» один   два», » «) возвратит массив значений из двух элементов
//
//  Параметры:
//      Стр —           строка, которую необходимо разложить на подстроки.
//                      Параметр передается по значению.
//      Разделитель —   строка-разделитель, по умолчанию — запятая.
//
//  Возвращаемое значение:
//      массив значений, элементы которого — подстроки
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = «,») Экспорт

 МассивСтрок = Новый Массив();
 Если
Разделитель = » » Тогда
 
Стр = СокрЛП(Стр);
  Пока
1 = 1 Цикл
  
Поз = Найти(Стр, Разделитель);
   Если
Поз = 0 Тогда
   
МассивСтрок.Добавить(Стр);
    Возврат
МассивСтрок;
   КонецЕсли;
  
МассивСтрок.Добавить(Лев(Стр, Поз 1));
  
Стр = СокрЛ(Сред(Стр, Поз));
  КонецЦикла;
 Иначе
 
ДлинаРазделителя = СтрДлина(Разделитель);
  Пока
1 = 1 Цикл
  
Поз = Найти(Стр, Разделитель);
   Если
Поз = 0 Тогда
    Если (
СокрЛП(Стр) <> «») Тогда
    
МассивСтрок.Добавить(Стр);
    КонецЕсли;
    Возврат
МассивСтрок;
   КонецЕсли;
  
МассивСтрок.Добавить(Лев(Стр,Поз 1));
  
Стр = Сред(Стр, Поз + ДлинаРазделителя);
  КонецЦикла;
 КонецЕсли;
КонецФункции

2 В общей форме»ФормаВыбораПечатныхФорм» вносим изменения в Процедуру ПередОткрытием

и ПоУмолчаниюНажатие

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

    // Получить объект метаданных (переданный форме)
   
Объект = КлючУникальности;

    // Установить заголовок
   
Заголовок = «Печать: » + Объект;
    Если Не
ВладелецФормы = Неопределено Тогда
        Если Не
РаботаСДиалогами.ПроверитьМодифицированностьВФорме(Объект, ВладелецФормы) Тогда
           
Отказ = Истина;
            Возврат;
        КонецЕсли;
    КонецЕсли;

    // Проверка возможности печати объекта
   
Если Метаданные.Документы.Содержит(Объект.Метаданные()) И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить И Не УправлениеДопПравамиПользователей.РазрешитьПечатьНепроведенныхДокументов(Объект.Проведен) Тогда
       
Предупреждение(«Недостаточно полномочий для печати непроведенного документа!»);
       
Отказ = Истина;
        Возврат;
    КонецЕсли;

    НаПринтер = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, «ПечатьДокументовБезПредварительногоПросмотра») = Истина;

    // Получить внутренние печатные формы (имена макетов объектов)
   
Попытка
       
СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм()
    Исключение
       
СтруктураВнутреннихПечатныхФорм = Новый Структура;
    КонецПопытки;

    // Сформировать дерево макетов печати
   
ДеревоМакетовПечати = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(Объект.Ссылка, СтруктураВнутреннихПечатныхФорм,,,Ложь);

    // Установить макеты печати по умолчанию
   
ВыделенныеСтроки = ЭлементыФормы.ДеревоМакетовПечати.ВыделенныеСтроки;
   
ВыделенныеСтроки.Очистить();
    Для каждого
ТекущаяСтрока Из ДеревоМакетовПечати.Строки Цикл
        Если
ТекущаяСтрока.Пометка Тогда

            Если НЕ ВыделенныеСтроки.Количество() Тогда
               
ЭлементыФормы.ДеревоМакетовПечати.ТекущаяСтрока = ТекущаяСтрока;
            КонецЕсли;

            ВыделенныеСтроки.Добавить(ТекущаяСтрока);
            Прервать;
// ГДВ Для того чтобы только первая строка была выделена
       
КонецЕсли;
    КонецЦикла;

КонецПроцедуры // ПередОткрытием()

Процедура ПоУмолчаниюНажатие(Элемент)

    ТекущиеДанные = ЭлементыФормы.ДеревоМакетовПечати.ТекущиеДанные;
    Если 
ТекущиеДанные.Пометка тогда
       
ТекущиеДанные.Пометка=Ложь;
    иначе
       
ТекущиеДанные.Пометка=Истина;
    КонецЕсли;
   
// Сняли или поставили пометку теперь создадим кнопки
   
сч=0;
   
// Запоминает макет печать по умолчанию для текущего объекта метаданных.
   
ИмяМетаданных = КлючУникальности.Метаданные().Имя;
   
ТекущиеДанныеТекст=«»;
    Для каждого
Строка Из ДеревоМакетовПечати.Строки Цикл
        если
Строка.Пометка тогда
           
ТекущиеДанныеТекст=ТекущиеДанныеТекст+«,»+Строка.Текст;
        КонецЕсли;
    КонецЦикла;

    Если ПустаяСтрока(ТекущиеДанныеТекст) Тогда
       
СохранитьЗначение(ИмяМетаданных + «МакетПечати», Ложь);
    Иначе
       
СохранитьЗначение(ИмяМетаданных + «МакетПечати», Прав(ТекущиеДанныеТекст,СтрДлина(ТекущиеДанныеТекст)-1));
       
ФормированиеПечатныхФорм.СоздатьКнопкиПечати(КлючУникальности, ВладелецФормы);
    КонецЕсли;

КонецПроцедуры // ПоУмолчаниюНажатие()

 3 В общем модуле ФормированиеПечатныхФорм меняем процедуру СоздатьКнопкиПечать

Процедура СоздатьКнопкиПечати(ДокументОбъект, ФормаДокумента) Экспорт

    Попытка
        СтруктураВнутреннихПечатныхФорм = ДокументОбъект.ПолучитьСтруктуруПечатныхФорм()
    Исключение
       
СтруктураВнутреннихПечатныхФорм = Новый Структура;
    КонецПопытки;

    ДеревоМакетов = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(ДокументОбъект.Ссылка, СтруктураВнутреннихПечатныхФорм);

    //СтрокаПоУмолчанию = УниверсальныеМеханизмы.ПолучитьСтрокуДереваМакетовПоУмолчанию(ДокументОбъект.Метаданные().Имя, ДеревоМакетов);
   
СтрокиПоУмолчанию = УниверсальныеМеханизмы.ПолучитьСтрокиДереваМакетовПоУмолчанию(ДокументОбъект.Метаданные().Имя, ДеревоМакетов); // ГДВ

    Если ДеревоМакетов.Строки.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;

    ПанельКнопок = ФормаДокумента.ЭлементыФормы.ОсновныеДействияФормы;
   
КнопкиСправа = (ПанельКнопок.ВыравниваниеКнопок = ВыравниваниеКнопокКоманднойПанели.Право);

    Если ПанельКнопок.Кнопки.Найти(«Печать») = Неопределено Тогда
        Если
КнопкиСправа Тогда
           
ПанельКнопок.Кнопки.Вставить(0,, ТипКнопкиКоманднойПанели.Разделитель);
           
ПанельКнопок.Кнопки.Вставить(0,«Печать», ТипКнопкиКоманднойПанели.Действие, «Печать», Новый Действие(«ОсновныеДействияФормыПечать»));
        Иначе
           
ПанельКнопок.Кнопки.Добавить(, ТипКнопкиКоманднойПанели.Разделитель);
           
ПанельКнопок.Кнопки.Добавить(«Печать», ТипКнопкиКоманднойПанели.Действие, «Печать», Новый Действие(«ОсновныеДействияФормыПечать»));
        КонецЕсли;
    КонецЕсли;

//  Если (СтрокаПоУмолчанию <> Неопределено) И (ПанельКнопок.Кнопки.Найти(«ДействиеПечать») = Неопределено) Тогда
//      Если КнопкиСправа Тогда
//          ПанельКнопок.Кнопки.Вставить(0,, ТипКнопкиКоманднойПанели.Разделитель);
//          ПанельКнопок.Кнопки.Вставить(0,»ДействиеПечать», ТипКнопкиКоманднойПанели.Действие, СтрокаПоУмолчанию.Текст, Новый Действие(«ОсновныеДействияФормыПечатьПоУмолчанию»));
//      Иначе
//          ПанельКнопок.Кнопки.Добавить(, ТипКнопкиКоманднойПанели.Разделитель);
//          ПанельКнопок.Кнопки.Добавить(«ДействиеПечать», ТипКнопкиКоманднойПанели.Действие, СтрокаПоУмолчанию.Текст, Новый Действие(«ОсновныеДействияФормыПечатьПоУмолчанию»));
//      КонецЕсли;
//  КонецЕсли;
// ГДВ
Индекс               = ПанельКнопок.Кнопки.Количество() — 1; //  Удалить товар Осрам
Пока Индекс >= 0 Цикл
    Если
Найти(ПанельКнопок.Кнопки[Индекс].Имя,«ДействиеПечать») тогда ПанельКнопок.Кнопки.Удалить(Индекс); КонецЕсли;
   
Индекс = Индекс 1;
КонецЦикла;

Для ч=0 по СтрокиПоУмолчанию.Количество()-1 цикл
       
СтрокаПоУмолчанию=СтрокиПоУмолчанию.Получить(ч);
    Если (
СтрокаПоУмолчанию <> Неопределено) И (ПанельКнопок.Кнопки.Найти(«ДействиеПечать»+ч) = Неопределено) Тогда
        Если
КнопкиСправа Тогда
           
ПанельКнопок.Кнопки.Вставить(0,, ТипКнопкиКоманднойПанели.Разделитель);
           
ПанельКнопок.Кнопки.Вставить(0,«ДействиеПечать»+ч, ТипКнопкиКоманднойПанели.Действие, СтрокаПоУмолчанию.Текст, Новый Действие(«ОсновныеДействияФормыПечатьПоУмолчанию»));
        Иначе
           
ПанельКнопок.Кнопки.Добавить(, ТипКнопкиКоманднойПанели.Разделитель);
           
ПанельКнопок.Кнопки.Добавить(«ДействиеПечать»+ч, ТипКнопкиКоманднойПанели.Действие, СтрокаПоУмолчанию.Текст, Новый Действие(«ОсновныеДействияФормыПечатьПоУмолчанию»));
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
// ГДВ
КонецПроцедуры // УстановитьКнопкуПечати()

4 В Общй модуль УниверсальныеМеханизмы добавить Функцию ПолучитьСтрокиДереваМакетовПоУмолчанию

Функция ПолучитьСтрокиДереваМакетовПоУмолчанию(ИмяМетаданных,ДеревоКнопок) Экспорт  // ГДВ строки а не строка

    ИмяМакетаПоУмолчанию = ВосстановитьЗначение(ИмяМетаданных+ «МакетПечати»);

    Если ИмяМакетаПоУмолчанию = Ложь или ДеревоКнопок.Строки.Количество() = 0 Тогда

        СтрокаПоУмолчанию = Неопределено;

    Иначе
        // значит есть как минимум 1 строка
        // Разложим в
       
СтрокиПоУмолчанию= Новый Массив;
       
Строки=МодульДоработок.РазложитьСтрокуВМассивПодстрок(ИмяМакетаПоУмолчанию,«,»);
        Для
ч=0 по Строки.Количество()-1 цикл

        СтрокаПоУмолчанию = ДеревоКнопок.Строки.Найти(Строки.Получить(ч),«Текст»);

        Если СтрокаПоУмолчанию = Неопределено Тогда

            СтрокаПоУмолчанию = ДеревоКнопок.Строки[0];

        КонецЕсли;
        СтрокаПоУмолчанию.Пометка=Истина;
       
СтрокиПоУмолчанию.Добавить(СтрокаПоУмолчанию);
        КонецЦикла;
    КонецЕсли;

    Возврат СтрокиПоУмолчанию;

КонецФункции // ()

Общй модуль УниверсальныеМеханизмы  изменить функции НапечататьДокументПоУмолчанию и  ПолучитьДеревоМакетовПечати

// Кнопка=Неопределено,
Функция НапечататьДокументПоУмолчанию(Объект, Кнопка=Неопределено,КоличествоЭкземпляров = 0, НаПринтер = Ложь) Экспорт

    Если Метаданные.Документы.Содержит(Объект.Метаданные()) и Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить и Не УправлениеДопПравамиПользователей.РазрешитьПечатьНепроведенныхДокументов(Объект.Проведен) Тогда
       
Сообщить(«Недостаточно полномочий для печати непроведенного документа!»);
        Возврат Ложь;
    КонецЕсли;

    Попытка
        СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм()
    Исключение
       
СтруктураВнутреннихПечатныхФорм = Новый Структура;
    КонецПопытки;

    ДеревоМакетов = ПолучитьДеревоМакетовПечати(Объект.Ссылка, СтруктураВнутреннихПечатныхФорм);

    Если Кнопка=Неопределено тогда   // ГДВ
   
СтрокаПоУмолчанию = ПолучитьСтрокуДереваМакетовПоУмолчанию(Объект.Метаданные().Имя, ДеревоМакетов);

    Если СтрокаПоУмолчанию = Неопределено Тогда

        Сообщить(«Печать по умолчанию не определена!»);
        Возврат Ложь;

    КонецЕсли;

    Расшифровка = СтрокаПоУмолчанию.Расшифровка;
    Иначе
   
СтрокаПоУмолчанию = ДеревоМакетов.Строки.Найти(Кнопка.Текст,«Текст»);
   
Расшифровка = СтрокаПоУмолчанию.Расшифровка;
    КонецЕсли;
// ГДВ

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

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

Функция ПолучитьДеревоМакетовПечати(СсылкаОбъекта, ВнутренниеПечатныеФормы, Действие = Неопределено, ДействиеУстановитьПечатьПоУмолчанию = Неопределено, ДобавлятьВДеревоРазделительИПечатьПоУмолчанию = Истина, ПредставлениеПечатнойФормы = Неопределено) Экспорт

    // Сформировать структуру дерева
   
ДеревоКнопок = ИнициализироватьДеревоДополнительныхКнопок();

    // Добавить в дерево встроенные печатные формы
   
ДобавитьВДеревоМакетовВстроенныеФормы(ДеревоКнопок, ВнутренниеПечатныеФормы, Действие, ДобавлятьВДеревоРазделительИПечатьПоУмолчанию, ПредставлениеПечатнойФормы);

    // Добавить в дерево дополнительные печатные формы из Справочник.ДополнительныеПечатныеФормы
   
ДобавитьВДеревоМакетовДополнительныеФормы(ДеревоКнопок, СсылкаОбъекта, Действие, ВнутренниеПечатныеФормы, ДобавлятьВДеревоРазделительИПечатьПоУмолчанию, ПредставлениеПечатнойФормы);

    // Получить имя макета печати по умолчанию
    //СтрокаПоУмолчанию = ПолучитьСтрокуДереваМакетовПоУмолчанию(СсылкаОбъекта.Метаданные().Имя ,ДеревоКнопок);
   
СтрокиПоУмолчанию = ПолучитьСтрокиДереваМакетовПоУмолчанию(СсылкаОбъекта.Метаданные().Имя ,ДеревоКнопок); // ГДВ

    //// Для подменю Печать объекта: установить пометку кнопки печати по умолчанию
    //Если НЕ СтрокаПоУмолчанию = Неопределено Тогда
    //  СтрокаПоУмолчанию.Пометка = Истина;
    //КонецЕсли; ГДВ сделано в другом месте

    // Добавит печать по умолчанию
    Если ДобавлятьВДеревоРазделительИПечатьПоУмолчанию И ДеревоКнопок.Строки.Количество() > 0 Тогда

        ДобавитьСтрокуВДеревоКнопок(ДеревоКнопок, Строка(Новый УникальныйИдентификатор), ТипКнопкиКоманднойПанели.Разделитель);

        ДобавитьСтрокуВДеревоКнопок(ДеревоКнопок, «ПечатьПоУмолчанию», ТипКнопкиКоманднойПанели.Действие, «По умолчанию…», ДействиеУстановитьПечатьПоУмолчанию, «ПечатьПоУмолчанию»);

    КонецЕсли;

    Возврат ДеревоКнопок;

КонецФункции // ПолучитьДеревоМакетовПечати()

6 В Документе ЗаказПокупателя ФормаДокумента меняем Процедуру ОсновныеДействияФормыПечатьПоУмолчанию

Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка)

    УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию(ЭтотОбъект,Кнопка); // ГДВ

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

7 Поиском можно найти и зменить везде ОсновныеДействияФормыПечатьПоУмолчанию, побочный эффект в «ФормаВыбораПечатныхФорм» по кнопке ПоУмолчаниюНажатие при нажатии первый раз Форма выделяется второй раз выделение снимается. 

1 Comment

  1. 2vadmaster

    Кнопка печать 🙂

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *