Для решения нашей задачи изменим стандартный алгоритм формирования печати по "умолчанию".
Необходимые изменения:
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];
КонецЕсли;
СтрокаПоУмолчанию.Пометка=Истина;
СтрокиПоУмолчанию.Добавить(СтрокаПоУмолчанию);
КонецЦикла;
КонецЕсли;
Возврат СтрокиПоУмолчанию;
КонецФункции // ()
5 Общй модуль УниверсальныеМеханизмы изменить функции НапечататьДокументПоУмолчанию и ПолучитьДеревоМакетовПечати
// Кнопка=Неопределено,
Функция НапечататьДокументПоУмолчанию(Объект, Кнопка=Неопределено,КоличествоЭкземпляров = 0, НаПринтер = Ложь) Экспорт
Если Метаданные.Документы.Содержит(Объект.Метаданные()) и Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить и Не УправлениеДопПравамиПользователей.РазрешитьПечатьНепроведенныхДокументов(Объект.Проведен) Тогда
Сообщить("Недостаточно полномочий для печати непроведенного документа!");
Возврат Ложь;
КонецЕсли;
Попытка
СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм()
Исключение
СтруктураВнутреннихПечатныхФорм = Новый Структура;
КонецПопытки;
ДеревоМакетов = ПолучитьДеревоМакетовПечати(Объект.Ссылка, СтруктураВнутреннихПечатныхФорм);
Если Кнопка=Неопределено тогда // ГДВ
СтрокаПоУмолчанию = ПолучитьСтрокуДереваМакетовПоУмолчанию(Объект.Метаданные().Имя, ДеревоМакетов);
Если СтрокаПоУмолчанию = Неопределено Тогда
Сообщить("Печать по умолчанию не определена!");
Возврат Ложь;
КонецЕсли;
Расшифровка = СтрокаПоУмолчанию.Расшифровка;
Иначе
СтрокаПоУмолчанию = ДеревоМакетов.Строки.Найти(Кнопка.Текст,"Текст");
Расшифровка = СтрокаПоУмолчанию.Расшифровка;
КонецЕсли; // ГДВ
Расшифровка = СтрокаПоУмолчанию.Расшифровка;
Если ТипЗнч(Расшифровка) = Тип("Структура") и Расшифровка.ВидПечатнойФормы = Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма Тогда
Если Не РаботаСДиалогами.ПроверитьМодифицированность(Объект) Тогда
Возврат Ложь;
КонецЕсли;
ТабДокумент = НапечататьВнешнююФорму(Объект.Ссылка, Расшифровка);
ЭтоДокумент = Метаданные.Документы.Содержит(Объект.Метаданные());
НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ?(ЭтоДокумент, ОбщегоНазначения.СформироватьЗаголовокДокумента(Объект.Ссылка), Строка(Объект)), Объект.Ссылка);
Иначе
Объект.Печать(Расшифровка, КоличествоЭкземпляров, НаПринтер);
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ПолучитьДеревоМакетовПечати(СсылкаОбъекта, ВнутренниеПечатныеФормы, Действие = Неопределено, ДействиеУстановитьПечатьПоУмолчанию = Неопределено, ДобавлятьВДеревоРазделительИПечатьПоУмолчанию = Истина, ПредставлениеПечатнойФормы = Неопределено) Экспорт
// Сформировать структуру дерева
ДеревоКнопок = ИнициализироватьДеревоДополнительныхКнопок();
// Добавить в дерево встроенные печатные формы
ДобавитьВДеревоМакетовВстроенныеФормы(ДеревоКнопок, ВнутренниеПечатныеФормы, Действие, ДобавлятьВДеревоРазделительИПечатьПоУмолчанию, ПредставлениеПечатнойФормы);
// Добавить в дерево дополнительные печатные формы из Справочник.ДополнительныеПечатныеФормы
ДобавитьВДеревоМакетовДополнительныеФормы(ДеревоКнопок, СсылкаОбъекта, Действие, ВнутренниеПечатныеФормы, ДобавлятьВДеревоРазделительИПечатьПоУмолчанию, ПредставлениеПечатнойФормы);
// Получить имя макета печати по умолчанию
//СтрокаПоУмолчанию = ПолучитьСтрокуДереваМакетовПоУмолчанию(СсылкаОбъекта.Метаданные().Имя ,ДеревоКнопок);
СтрокиПоУмолчанию = ПолучитьСтрокиДереваМакетовПоУмолчанию(СсылкаОбъекта.Метаданные().Имя ,ДеревоКнопок); // ГДВ
//// Для подменю Печать объекта: установить пометку кнопки печати по умолчанию
//Если НЕ СтрокаПоУмолчанию = Неопределено Тогда
// СтрокаПоУмолчанию.Пометка = Истина;
//КонецЕсли; ГДВ сделано в другом месте
// Добавит печать по умолчанию
Если ДобавлятьВДеревоРазделительИПечатьПоУмолчанию И ДеревоКнопок.Строки.Количество() > 0 Тогда
ДобавитьСтрокуВДеревоКнопок(ДеревоКнопок, Строка(Новый УникальныйИдентификатор), ТипКнопкиКоманднойПанели.Разделитель);
ДобавитьСтрокуВДеревоКнопок(ДеревоКнопок, "ПечатьПоУмолчанию", ТипКнопкиКоманднойПанели.Действие, "По умолчанию...", ДействиеУстановитьПечатьПоУмолчанию, "ПечатьПоУмолчанию");
КонецЕсли;
Возврат ДеревоКнопок;
КонецФункции // ПолучитьДеревоМакетовПечати()
6 В Документе ЗаказПокупателя ФормаДокумента меняем Процедуру ОсновныеДействияФормыПечатьПоУмолчанию
Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка)
УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию(ЭтотОбъект,Кнопка); // ГДВ
КонецПроцедуры
7 Поиском можно найти и зменить везде ОсновныеДействияФормыПечатьПоУмолчанию, побочный эффект в "ФормаВыбораПечатныхФорм" по кнопке ПоУмолчаниюНажатие при нажатии первый раз Форма выделяется второй раз выделение снимается.