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

18.05.12

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

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

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

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

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

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

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С 8.3.24)

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

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

1 стартмани

18.03.2024    2669    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4603    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8816    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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