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

18.05.12

Разработка - Универсальные функции

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Множественная печать по умолчанию в документах.
.txt 14,18Kb
24 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4243    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7868    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    53393    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7718    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67936    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9684    ke.92@mail.ru    17    

68
Для отправки сообщения требуется регистрация/авторизация