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

18.05.12

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Множественная печать по умолчанию в документах.
.txt 14,18Kb
24
24 Скачать (1 SM) Купить за 1 850 руб.

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

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

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С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20122    dimanich70    81    

144

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    4091    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    18058    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    5502    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14729    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

135
Оставьте свое сообщение