gifts2017

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

Опубликовал Amid Dimas (dimas103) в раздел Программирование - Практика программирования

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

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

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

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 Поиском можно найти и зменить везде ОсновныеДействияФормыПечатьПоУмолчанию, побочный эффект в "ФормаВыбораПечатныхФорм" по кнопке ПоУмолчаниюНажатие при нажатии первый раз Форма выделяется второй раз выделение снимается. 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Множественная печать по умолчанию в документах.
.txt 14,18Kb
17.05.12
24
.txt 14,18Kb 24 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Вадим Карасев (2vadmaster) 15.11.13 10:39
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа