#Область ОписаниеПеременных
&НаСервере
Перем ПодчиненныеСправочники;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
МакетыВыгрузки = Параметры.МакетыВыгрузки;
ЗагрузитьНастройкиСпособГруппировкиОбъектов();
ЗаполнитьОбъектыСКомандамиПечати();
Если ГруппировкаПоРазделам Тогда
ЗаполнитьСписокМакетовПоРазделам();
Иначе
ЗаполнитьСписокМакетовПоОбъектам();
КонецЕсли;
Если Параметры.Свойство("ПоказыватьТолькоПользовательскиеИзмененные") Тогда
ОтборПоИспользованиюМакета = "ИспользуемыеИзмененные";
Иначе
ОтборПоИспользованиюМакета = Элементы.ОтборПоИспользованиюМакета.СписокВыбора[0].Значение;
КонецЕсли;
ЕстьПравоИзменения = ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ПользовательскиеМакетыПечати);
Если Не ЕстьПравоИзменения Тогда
СтандартнаяОбработка = Ложь;
ТекстСообщения = НСтр("ru = 'Недостаточно прав для изменения макетов.'");
ВызватьИсключение(ТекстСообщения, КатегорияОшибки.НарушениеПравДоступа);
КонецЕсли;
ЕстьДополнительныеЯзыки = Ложь;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
ДополнительныеЯзыкиПечатныхФорм = МодульУправлениеПечатьюМультиязычность.ДополнительныеЯзыкиПечатныхФорм();
Элементы.ОтборПоЯзыку.СписокВыбора.Добавить("", НСтр("ru = 'Все'"));
Для Каждого Язык Из ДополнительныеЯзыкиПечатныхФорм Цикл
ПредставлениеЯзыка = МодульМультиязычностьСервер.ПредставлениеЯзыка(Язык);
Элементы.ОтборПоЯзыку.СписокВыбора.Добавить(ПредставлениеЯзыка);
КонецЦикла;
ЕстьДополнительныеЯзыки = ДополнительныеЯзыкиПечатныхФорм.Количество() > 0;
КонецЕсли;
КонецЕсли;
Элементы.ГруппаДополнительнаяИнформация.Видимость = ЕстьДополнительныеЯзыки;
Элементы.ОтборПоЯзыку.Видимость = ЕстьДополнительныеЯзыки;
Элементы.МакетыДоступныеЯзыки.Видимость = ЕстьДополнительныеЯзыки;
Элементы.МакетыДоступенПеревод.Видимость = ЕстьДополнительныеЯзыки;
Элементы.МакетыФорматСохраненияВыгрузки.Видимость = МакетыВыгрузки;
Элементы.МакетыДобавитьМакет.Видимость = НЕ МакетыВыгрузки;
Элементы.МакетыДобавитьМакетOfficeOpenXML.Видимость = НЕ МакетыВыгрузки;
Элементы.МакетыДобавитьМакетВыгрузки.Видимость = МакетыВыгрузки;
Если МакетыВыгрузки Тогда
АвтоЗаголовок = Ложь;
Заголовок = НСтр("ru = 'Макеты файлов выгрузки'");
Элементы.МакетыУсловияДоступности.Заголовок = Нстр("ru = 'Видимость в подменю ""Выгрузить в файл""...'");
ТекстПодсказки = НСтр("ru = 'Показывать в подменю ""Выгрузить в файл""'");
Элементы.МакетыИспользуется.Подсказка = ТекстПодсказки;
КонецЕсли;
РежимОткрытияМакетаПросмотр = Ложь;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
РежимОткрытияМакетаПросмотр = Истина;
Элементы.ГруппаОтборы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
КонецЕсли;
АвтоНавигационнаяСсылка = Ложь;
НавигационнаяСсылка = "e1cib/list/РегистрСведений.ПользовательскиеМакетыПечати";
Если ЗначениеЗаполнено(Параметры.ПутьКМакету) Тогда
ПозицияВДереве = ПозицияМакетаВДереве(Параметры.ПутьКМакету);
Если ЗначениеЗаполнено(ПозицияВДереве) Тогда
ПерейтиКЭлементу(ПозицияВДереве);
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(Параметры.Владелец) Тогда
ПозицияВДереве = ПозицияВладельцаВДереве(Параметры.Владелец);
Если ЗначениеЗаполнено(ПозицияВДереве) Тогда
ПерейтиКЭлементу(ПозицияВДереве);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
Если Не ЗначениеЗаполнено(Параметры.ПутьКМакету)
И Не ЗначениеЗаполнено(Параметры.Владелец) Тогда
ПерейтиКЭлементу(ПозицияВДереве);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если (ИмяСобытия = "Запись_ТабличныйДокумент" Или ИмяСобытия = "Запись_ОфисныйДокумент"
Или ИмяСобытия = "Запись_ПользовательскиеМакетыПечати") Тогда
ИсточникСоответствуетПриемнику = (МакетыВыгрузки = Параметр.МакетДляВыгрузкиОбъекта);
Если Не ТолькоПросмотр
И ИсточникСоответствуетПриемнику Тогда
ИдентификаторыИзмененныхСтрок = ОбновитьОтображениеМакета(Параметр);
Если Элементы.Макеты.ТекущиеДанные <> Неопределено И Элементы.Макеты.ТекущиеДанные.ЭтоГруппа Тогда
Элементы.Макеты.ТекущаяСтрока = ИдентификаторыИзмененныхСтрок[Элементы.Макеты.ТекущиеДанные.ПолучитьИдентификатор()];
Иначе
Для Каждого Элемент Из ИдентификаторыИзмененныхСтрок Цикл
Элементы.Макеты.ТекущаяСтрока = Элемент.Значение;
Прервать;
КонецЦикла;
КонецЕсли;
Если Элементы.Макеты.ТекущиеДанные <> Неопределено Тогда
Элементы.Макеты.ТекущиеДанные.СоответствуетОтбору = Истина;
КонецЕсли;
КонецЕсли;
УстановитьДоступностьКнопокКоманднойПанели();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОбновитьОтображениеМакета(Знач Параметр)
ИдентификаторыИзмененныхСтрок = Новый Соответствие;
ИдентификаторМакета = Параметр.ИмяОбъектаМетаданныхМакета;
ИсточникиДанных = ?(Параметр.Свойство("ИсточникиДанных"),
Параметр.ИсточникиДанных, Новый Массив);
НайденныеМакеты = НайтиМакеты(ИдентификаторМакета, Макеты);
Для Каждого Макет Из НайденныеМакеты Цикл
ИсточникДанных = Макет.ПолучитьРодителя();
Если СтрНачинаетсяС(ИсточникДанных.Идентификатор, "Обработка")
Или СтрНачинаетсяС(ИсточникДанных.Идентификатор, "Отчет") Тогда
ИсточникиДанных.Добавить(ИсточникДанных.Владелец);
КонецЕсли;
Если ИсточникиДанных.Найти(ИсточникДанных.Владелец) = Неопределено Тогда
ИсточникДанных.ПолучитьЭлементы().Удалить(Макет);
ОчиститьКэш(ИсточникДанных.Идентификатор, ОбъектыСКомандамиПечати);
КонецЕсли;
КонецЦикла;
СоответствиеФорматаВыгрузкиРасширению = Новый Соответствие;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВыгрузкаОбъектовВФайлы") Тогда
МодульВыгрузкаОбъектовВФайлы = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаОбъектовВФайлы");
СоответствиеФорматаВыгрузкиРасширению =
МодульВыгрузкаОбъектовВФайлы.СоответствиеФорматаВыгрузкиФорматуСохранения();
КонецЕсли;
Для Каждого ИсточникДанных Из ИсточникиДанных Цикл
ВеткиВладельцаМакетов = НайтиВеткиВладельцаМакетов(ИсточникДанных, Макеты);
Для Каждого Ветка Из ВеткиВладельцаМакетов Цикл
Если Ветка.ПолучитьЭлементы().Количество() > 0 И Не ЗначениеЗаполнено(Ветка.ПолучитьЭлементы()[0].Идентификатор) Тогда
Продолжить;
КонецЕсли;
ОчиститьКэш(Ветка.Идентификатор, ОбъектыСКомандамиПечати);
Макет = НайтиМакет(ИдентификаторМакета, Ветка);
Если Макет = Неопределено Тогда
РегистрыСведений.ПользовательскиеМакетыПечати.ДобавитьПользовательскиеМакеты(Ветка.ПолучитьЭлементы(), ИдентификаторМакета);
Макет = НайтиМакет(ИдентификаторМакета, Ветка);
Макет.СоответствуетОтбору = Истина;
ИдентификаторыИзмененныхСтрок.Вставить(Ветка.ПолучитьИдентификатор(), Макет.ПолучитьИдентификатор());
Продолжить;
КонецЕсли;
ИдентификаторыИзмененныхСтрок.Вставить(Ветка.ПолучитьИдентификатор(), Макет.ПолучитьИдентификатор());
Макет.Изменен = Не Макет.Поставляемый Или УправлениеПечатью.ИспользуетсяПользовательскийМакет(ИдентификаторМакета);
Макет.ИспользуетсяИзмененный = Макет.Изменен;
Макет.ДоступныеЯзыки = РегистрыСведений.ПользовательскиеМакетыПечати.ДоступныеЯзыкиМакета(Параметр.ИмяОбъектаМетаданныхМакета);
Макет.КартинкаИспользования = -1;
Если Макет.Изменен Тогда
Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный);
КонецЕсли;
Макет.Представление = Параметр.Представление;
Если МакетыВыгрузки Тогда
ФорматСохраненияВыгрузки = Параметр.ФорматСохраненияВыгрузки;
Расширение = СоответствиеФорматаВыгрузкиРасширению[ФорматСохраненияВыгрузки];
Макет.ИндексКартинкиФорматаСохранения =
РегистрыСведений.ПользовательскиеМакетыПечати.ИндексПиктограммыФайла(Расширение);
Макет.ФорматСохраненияВыгрузки = ФорматСохраненияВыгрузки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат ИдентификаторыИзмененныхСтрок;
КонецФункции
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Параметр = Новый Структура("Отказ", Ложь);
Оповестить("ЗакрытиеФормыВладельца", Параметр, ЭтотОбъект);
Если Параметр.Отказ Тогда
Отказ = Истина;
КонецЕсли;
Если НЕ Отказ Тогда
СохранитьНастройкиСпособГруппировкиОбъектов(ГруппировкаПоРазделам);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УстановитьОтборМакетов();
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаПолученияНавигационнойСсылки(Ключ, Представление, НавигационнаяСсылка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрМакетыВыгрузки = Новый Структура("МакетыВыгрузки", МакетыВыгрузки);
НавигационнаяСсылка = НавигационнаяСсылкаПоПараметру(Представление, ПараметрМакетыВыгрузки);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ОтборПоЯзыкуПриИзменении(Элемент)
ОбновитьВидимостьМакетов();
КонецПроцедуры
&НаКлиенте
Процедура СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
ОбновитьВидимостьМакетов();
КонецПроцедуры
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтрокаПоиска = Текст;
ОбновитьВидимостьМакетов();
КонецПроцедуры
&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
Если ЗначениеЗаполнено(СтрокаПоиска) И Элементы.СтрокаПоиска.СписокВыбора.НайтиПоЗначению(СтрокаПоиска) = Неопределено Тогда
Элементы.СтрокаПоиска.СписокВыбора.Добавить(СтрокаПоиска);
КонецЕсли;
ОбновитьВидимостьМакетов();
КонецПроцедуры
&НаКлиенте
Процедура ОтборПоВидуИспользуемогоМакетаПриИзменении(Элемент)
УстановитьОтборМакетов();
КонецПроцедуры
&НаКлиенте
Процедура ОтборПоИспользованиюМакетаОчистка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОтборПоИспользованиюМакета = Элементы.ОтборПоИспользованиюМакета.СписокВыбора[0].Значение;
УстановитьОтборМакетов();
КонецПроцедуры
&НаКлиенте
Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
МодульУправлениеПечатьюМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюМультиязычностьКлиент");
МодульУправлениеПечатьюМультиязычностьКлиент.ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ГруппировкаПоРазделамПриИзменении(Элемент)
Если ГруппировкаПоРазделам Тогда
ЗаполнитьСписокМакетовПоРазделам();
Иначе
ЗаполнитьСписокМакетовПоОбъектам();
КонецЕсли;
ИзмененСпособГруппировки = Истина;
УстановитьОтборМакетов();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыМакеты
&НаКлиенте
Процедура МакетыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТекущиеДанные.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
Если Поле.Имя = "МакетыКнопкаНастройкиДоступности" Тогда
УсловияДоступности(Неопределено);
Иначе
ОткрытьМакетПечатнойФормы();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура МакетыПриАктивизацииСтроки(Элемент)
ПозицияВДереве = ПутьКЭлементуВДереве(Элементы.Макеты.ТекущиеДанные);
ОтключитьОбработчикОжидания("УстановитьДоступностьКнопокКоманднойПанели");
ПодключитьОбработчикОжидания("УстановитьДоступностьКнопокКоманднойПанели", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура МакетыПриИзменении(Элемент)
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
УстановитьИспользованиеМакета(ТекущиеДанные.Ссылка, ТекущиеДанные.Используется);
НайденныеМакеты = НайтиМакеты(ТекущиеДанные.Идентификатор, Макеты);
Для Каждого Макет Из НайденныеМакеты Цикл
Макет.Используется = ТекущиеДанные.Используется;
КонецЦикла;
ОчиститьКэш(ТекущиеДанные.ПолучитьРодителя().Идентификатор, ОбъектыСКомандамиПечати);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьИспользованиеМакета(Макет, Используется)
Справочники.МакетыПечатныхФорм.УстановитьИспользованиеМакета(Макет, Используется);
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
&НаКлиенте
Процедура МакетыПередРазворачиванием(Элемент, Строка, Отказ)
КоллекцияЭлементов = Макеты.НайтиПоИдентификатору(Строка).ПолучитьЭлементы();
Если КоллекцияЭлементов.Количество() > 0 И Не ЗначениеЗаполнено(КоллекцияЭлементов[0].Идентификатор) Тогда
Отказ = Истина;
РазворачиваемыеВетки = РазворачиваемыеВетки + Формат(Строка, "ЧГ=0;") + ";";
ПодключитьОбработчикОжидания("Подключаемый_РазвернутьВетки", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_РазвернутьВетки()
ЗагрузитьПодчиненныеЭлементы(РазворачиваемыеВетки);
Для Каждого ИдентификаторСтроки Из СтрРазделить(РазворачиваемыеВетки, ";", Ложь) Цикл
Ветка = Макеты.НайтиПоИдентификатору(ИдентификаторСтроки);
ОтметитьЭлементыСоответствующиеОтбору(Ветка);
Элементы.Макеты.Развернуть(ИдентификаторСтроки);
КонецЦикла;
РазворачиваемыеВетки = "";
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьПодчиненныеЭлементы(ИдентификаторыСтрок)
Для Каждого ИдентификаторСтроки Из СтрРазделить(ИдентификаторыСтрок, ";", Ложь) Цикл
ТекущиеДанные = Макеты.НайтиПоИдентификатору(ИдентификаторСтроки);
КоллекцияЭлементов = ТекущиеДанные.ПолучитьЭлементы();
Если КоллекцияЭлементов.Количество() = 0 Или ЗначениеЗаполнено(КоллекцияЭлементов[0].Идентификатор) Тогда
Продолжить;
КонецЕсли;
КоллекцияЭлементов.Очистить();
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ТекущиеДанные.Идентификатор);
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
ВывестиМакеты(ТекущиеДанные);
Если ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных) Тогда
ВывестиКоллекцию(ТекущиеДанные, ОбъектМетаданных.РегистрируемыеДокументы);
ИначеЕсли ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда
ВывестиКоллекцию(ТекущиеДанные, ПодчиненныеСправочники(ОбъектМетаданных));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ИзменитьМакет(Команда)
ОткрытьМакетПечатнойФормыДляРедактирования();
КонецПроцедуры
&НаКлиенте
Процедура ИспользоватьИзмененныйМакет(Команда)
ПереключитьИспользованиеВыбранныхМакетов(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ИспользоватьСтандартныйМакет(Команда)
ПереключитьИспользованиеВыбранныхМакетов(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьМакет(Команда)
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Копирование", Ложь);
ПараметрыОповещения.Вставить("ТипМакета", "MXL");
ПараметрыОповещения.Вставить("МакетДляВыгрузкиОбъекта", Ложь);
ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая печатная форма'"), Ложь);
ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, НСтр("ru = 'Введите наименование макета'"), 100, Ложь)
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиВСписок(Команда)
ПерейтиКСписку();
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьМакетOfficeOpenXML(Команда)
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Копирование", Ложь);
ПараметрыОповещения.Вставить("ТипМакета", "DOCX");
ПараметрыОповещения.Вставить("МакетДляВыгрузкиОбъекта", Ложь);
ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая печатная форма'"), Ложь);
ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, НСтр("ru = 'Введите наименование макета'"), 100, Ложь)
КонецПроцедуры
&НаКлиенте
Процедура УсловияДоступности(Команда)
ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
Возврат;
КонецЕсли;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Ключ", ТекущиеДанные.Ссылка);
ПараметрыОткрытия.Вставить("ЭтоМакетВыгрузки", МакетыВыгрузки);
ПараметрыОткрытия.Вставить("ПредставлениеМакетаВыгрузки", ТекущиеДанные.Представление);
ОткрытьФорму("Справочник.МакетыПечатныхФорм.Форма.УсловияВидимостиВПодменюПечать", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьМакетВыгрузки(Команда)
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Копирование", Ложь);
ПараметрыОповещения.Вставить("ТипМакета", "MXL");
ПараметрыОповещения.Вставить("МакетДляВыгрузкиОбъекта", Истина);
ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая форма выгрузки'"), Ложь);
Подсказка = НСтр("ru = 'Введите наименование макета'");
ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, Подсказка, 100, Ложь);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Отборы
&НаКлиенте
Процедура УстановитьОтборМакетов();
ПоказыватьИзмененные = Истина;
ПоказыватьНеизмененные = Истина;
ПоказыватьИспользуемые = Истина;
ПоказыватьНеиспользуемые = Истина;
Если ОтборПоИспользованиюМакета = "Измененные" Тогда
ПоказыватьНеизмененные = Ложь;
ИначеЕсли ОтборПоИспользованиюМакета = "НеИзмененные" Тогда
ПоказыватьИзмененные = Ложь;
ИначеЕсли ОтборПоИспользованиюМакета = "ИспользуемыеИзмененные" Тогда
ПоказыватьНеиспользуемые = Ложь;
ПоказыватьНеИзмененные = Ложь;
ИначеЕсли ОтборПоИспользованиюМакета = "НеИспользуемыеИзмененные" Тогда
ПоказыватьНеизмененные = Ложь;
ПоказыватьИспользуемые = Ложь;
КонецЕсли;
ОбновитьВидимостьМакетов();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьВидимостьМакетов(Интервал = 0.5);
ОтключитьОбработчикОжидания("ПрименитьОтбор");
ПодключитьОбработчикОжидания("ПрименитьОтбор", Интервал, Истина);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ОткрытьМакетПечатнойФормы()
Если РежимОткрытияМакетаПросмотр Тогда
ОткрытьМакетПечатнойФормыДляПросмотра();
Иначе
ОткрытьМакетПечатнойФормыДляРедактирования();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМакетПечатнойФормыДляПросмотра()
ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
ПараметрыФормы.Вставить("ТипМакета", ТекущиеДанные.ТипМакета);
ПараметрыФормы.Вставить("ТолькоОткрытие", Истина);
Если ТекущиеДанные.ТипМакета = "MXL" Тогда
ПараметрыРедактора = СтандартныеПодсистемыКлиент.ПараметрыРедактораТабличногоДокумента();
ПараметрыРедактора.ИмяДокумента = ТекущиеДанные.Представление;
ПараметрыРедактора.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
СтандартныеПодсистемыКлиент.ПоказатьРедакторТабличногоДокумента(Неопределено, ПараметрыРедактора,,
ЭтотОбъект);
Возврат;
ИначеЕсли ТекущиеДанные.ТипМакета = "DOCX" Тогда
Если ВерсияМакета(ТекущиеДанные.Идентификатор, ТекущиеДанные.ТипМакета) = "Области" Тогда
ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыФормы,
ЭтотОбъект);
Возврат;
КонецЕсли;
ПараметрыФормы.Вставить("ИмяДокумента", ТекущиеДанные.Представление);
ПараметрыФормы.Вставить("Редактирование", Ложь);
ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыФормы, ЭтотОбъект);
Возврат;
КонецЕсли;
ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМакетПечатнойФормыДляРедактирования()
ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
Если ТекущиеДанные.Изменен И Не ТекущиеДанные.ИспользуетсяИзмененный Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьМакетПечатнойФормыДляРедактированияПродолжение", ЭтотОбъект, ТекущиеДанные);
ТекстВопроса = НСтр("ru = 'Имеется измененный макет, но он не используется.
|Можно переключиться на него и продолжить редактирование,
|либо начать редактирование стандартного макета.'");
Кнопки = Новый СписокЗначений();
Кнопки.Добавить(Истина, НСтр("ru = 'Измененный ранее'"));
Кнопки.Добавить(Ложь, НСтр("ru = 'Стандартный (текущий)'"));
Кнопки.Добавить(Неопределено, НСтр("ru = 'Отмена'"));
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , , НСтр("ru = 'Какой макет редактировать?'"));
Возврат;
КонецЕсли;
ОткрытьМакетПечатнойФормыДляРедактированияПродолжение(Ложь, ТекущиеДанные);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМакетПечатнойФормыДляРедактированияПродолжение(ПереключитьИспользование, ТекущиеДанные) Экспорт
Если ПереключитьИспользование = Неопределено Тогда
Возврат;
ИначеЕсли ПереключитьИспользование Тогда
ПереключитьИспользованиеВыбранныхМакетов(Истина);
КонецЕсли;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
ПараметрыОткрытия.Вставить("ТипМакета", ТекущиеДанные.ТипМакета);
ПараметрыОткрытия.Вставить("Ссылка", ТекущиеДанные.Ссылка);
ПараметрыОткрытия.Вставить("ИсточникДанных", ТекущиеДанные.Владелец);
ПараметрыОткрытия.Вставить("ИсточникиДанных", ТекущиеДанные.ИсточникиДанных);
ПараметрыОткрытия.Вставить("ЭтоПечатнаяФорма", ТекущиеДанные.ЭтоПечатнаяФорма);
ПараметрыОткрытия.Вставить("ОсновнаяПечатнаяФорма", ТекущиеДанные.ОсновнаяПечатнаяФорма);
ПараметрыОткрытия.Вставить("НаименованиеПечатнойФормы", ТекущиеДанные.НаименованиеПечатнойФормы);
ПараметрыОткрытия.Вставить("ДоступноНазначение", Не ТекущиеДанные.Поставляемый);
ПараметрыОткрытия.Вставить("МакетДляВыгрузкиОбъекта", ТекущиеДанные.МакетДляВыгрузкиОбъекта);
ПараметрыОткрытия.Вставить("ФорматСохраненияВыгрузки", ТекущиеДанные.ФорматСохраненияВыгрузки);
Если ТекущиеДанные.ТипМакета = "MXL" Тогда
ПараметрыФормы = СтандартныеПодсистемыКлиент.ПараметрыРедактораТабличногоДокумента();
ПараметрыФормы.ИмяДокумента = ТекущиеДанные.Представление;
ПараметрыФормы.Редактирование = Не ТолькоПросмотр;
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ПараметрыОткрытия, Истина);
СтандартныеПодсистемыКлиент.ПоказатьРедакторТабличногоДокумента(Неопределено, ПараметрыФормы,, ЭтотОбъект);
Возврат;
ИначеЕсли ТекущиеДанные.ТипМакета = "DOCX" Тогда
Если ВерсияМакета(ТекущиеДанные.Идентификатор, ТекущиеДанные.ТипМакета) = "Области" Тогда
ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
Возврат;
КонецЕсли;
ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление);
ПараметрыОткрытия.Вставить("Редактирование", Истина);
ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект);
Возврат;
КонецЕсли;
ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВерсияМакета(Идентификатор, ТипМакета)
Макет = УправлениеПечатью.МакетПечатнойФормы(Идентификатор);
ДанныеМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(Макет, ТипМакета);
Если ДанныеМакета.СтруктураДокумента.ОбластиДокумента.Количество() > 1
ИЛИ ДанныеМакета.СтруктураДокумента.ОбластиДокумента["Абзац"] = Неопределено Тогда
ВерсияМакета = "Области";
Иначе
ВерсияМакета = "Параметры";
КонецЕсли;
ДанныеМакета.Вставить("ВерсияМакета", ВерсияМакета);
Возврат ДанныеМакета.ВерсияМакета;
КонецФункции
&НаКлиенте
Процедура ПереключитьИспользованиеВыбранныхМакетов(ИспользуетсяИзмененный)
ПереключаемыеМакеты = Новый Массив;
Для Каждого ВыделеннаяСтрока Из Элементы.Макеты.ВыделенныеСтроки Цикл
ТекущиеДанные = Элементы.Макеты.ДанныеСтроки(ВыделеннаяСтрока);
Если ТекущиеДанные.Изменен Тогда
ТекущиеДанные.ИспользуетсяИзмененный = ИспользуетсяИзмененный;
УстановитьКартинкуИспользования(ТекущиеДанные);
ПереключаемыеМакеты.Добавить(ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
КонецЕсли;
КонецЦикла;
УстановитьИспользованиеИзмененныхМакетов(ПереключаемыеМакеты, ИспользуетсяИзмененный);
УстановитьДоступностьКнопокКоманднойПанели();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьИспользованиеИзмененныхМакетов(Макеты, ИспользуетсяИзмененный)
РегистрыСведений.ПользовательскиеМакетыПечати.УстановитьИспользованиеИзмененныхМакетов(Макеты, ИспользуетсяИзмененный);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьВыбранныеИзмененныеМакеты(Команда)
УдаляемыеМакеты = Новый Массив;
Для Каждого ВыделеннаяСтрока Из Элементы.Макеты.ВыделенныеСтроки Цикл
ТекущиеДанные = Элементы.Макеты.ДанныеСтроки(ВыделеннаяСтрока);
ТекущиеДанные.ИспользуетсяИзмененный = Ложь;
ТекущиеДанные.Изменен = Ложь;
ТекущиеДанные.ДоступныеЯзыки = "";
УстановитьКартинкуИспользования(ТекущиеДанные);
УдаляемыеМакеты.Добавить(ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
КонецЦикла;
УдалитьИзмененныеМакеты(УдаляемыеМакеты);
УстановитьДоступностьКнопокКоманднойПанели();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УдалитьИзмененныеМакеты(УдаляемыеМакеты)
Для Каждого ИмяОбъектаМетаданныхМакета Из УдаляемыеМакеты Цикл
УправлениеПечатью.УдалитьМакет(ИмяОбъектаМетаданныхМакета);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьКартинкуИспользования(ОписаниеМакета)
ОписаниеМакета.КартинкаИспользования = -1;
Если ОписаниеМакета.Изменен Тогда
ОписаниеМакета.КартинкаИспользования = Число(ОписаниеМакета.Изменен) + Число(ОписаниеМакета.ИспользуетсяИзмененный);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКнопокКоманднойПанели()
ТекущийМакет = Элементы.Макеты.ТекущиеДанные;
ТекущийМакетВыбран = ТекущийМакет <> Неопределено;
ВыбраноНесколькоМакетов = Элементы.Макеты.ВыделенныеСтроки.Количество() > 1;
ИспользоватьИзмененныйМакетДоступность = Ложь;
ИспользоватьСтандартныйМакетДоступность = Ложь;
УдалитьИзмененныйМакетДоступность = Ложь;
УдалитьМакетВидимость = Ложь;
ДоступноОтображениеВСписке = Ложь;
Для Каждого ВыделеннаяСтрока Из Элементы.Макеты.ВыделенныеСтроки Цикл
ТекущийМакет = Элементы.Макеты.ДанныеСтроки(ВыделеннаяСтрока);
ИспользоватьИзмененныйМакетДоступность = ТекущийМакетВыбран И ТекущийМакет.Изменен И Не ТекущийМакет.ИспользуетсяИзмененный И Не ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И ИспользоватьИзмененныйМакетДоступность;
ИспользоватьСтандартныйМакетДоступность = ТекущийМакетВыбран И ТекущийМакет.Изменен И ТекущийМакет.ИспользуетсяИзмененный И Не ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И ИспользоватьСтандартныйМакетДоступность;
УдалитьИзмененныйМакетДоступность = ТекущийМакетВыбран И ТекущийМакет.Изменен И Не ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И УдалитьИзмененныйМакетДоступность;
УдалитьМакетВидимость = ТекущийМакетВыбран И ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И УдалитьМакетВидимость;
ИсточникиДанных = СтрРазделить(ТекущийМакет.ИсточникиДанных, ",", Ложь);
Для Каждого ИсточникДанных Из ИсточникиДанных Цикл
Если СтрНачинаетсяС(ИсточникДанных, "Обработка")
Или СтрНачинаетсяС(ИсточникДанных, "Отчет")
Или ИсточникДанных = "ОбщийМакет" Тогда
Продолжить;
КонецЕсли;
ДоступноОтображениеВСписке = Истина;
КонецЦикла;
КонецЦикла;
Элементы.МакетыПечатныхФормИспользоватьИзмененныйМакет.Доступность = ИспользоватьИзмененныйМакетДоступность;
Элементы.МакетыПечатныхФормИспользоватьСтандартныйМакет.Доступность = ИспользоватьСтандартныйМакетДоступность;
Элементы.МакетыПечатныхФормУдалитьИзмененныйМакет.Доступность = УдалитьИзмененныйМакетДоступность;
Элементы.МакетыКонтекстноеМенюУдалитьИзмененныйМакет.Видимость = УдалитьИзмененныйМакетДоступность И Не ТолькоПросмотр;
Элементы.МакетыКонтекстноеМенюУдалитьМакет.Видимость = УдалитьМакетВидимость И Не ТолькоПросмотр;
Элементы.МакетыУсловияДоступности.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступнаНастройкаВидимости;
Элементы.МакетыСкопировать.Доступность = ТекущийМакетВыбран И ТекущийМакет.ЭтоПечатнаяФорма И Не ВыбраноНесколькоМакетов И ТекущийМакет.ДоступноСоздание И Не ТолькоПросмотр;
Элементы.МакетыДобавитьМакет.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание;
Элементы.МакетыДобавитьМакетOfficeOpenXML.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание;
Элементы.МакетыИзменитьМакет.Доступность = ТекущийМакетВыбран И Не ТекущийМакет.ЭтоГруппа;
Элементы.ФормаПоказатьВСписке.Доступность = ДоступноОтображениеВСписке;
Элементы.МакетыДобавитьМакетВыгрузки.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание;
КонецПроцедуры
&НаКлиенте
Процедура Скопировать(Команда)
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Копирование", Истина);
ПараметрыОповещения.Вставить("ТипМакета");
ТекущийМакет = Элементы.Макеты.ТекущиеДанные;
Если ТекущийМакет.МакетДляВыгрузкиОбъекта Тогда
ПараметрыОповещения.Вставить("МакетДляВыгрузкиОбъекта", Истина);
ПараметрыОповещения.Вставить("ФорматСохраненияВыгрузки", ТекущийМакет.ФорматСохраненияВыгрузки);
Иначе
ПараметрыОповещения.Вставить("МакетДляВыгрузкиОбъекта", Ложь);
ПараметрыОповещения.Вставить("ФорматСохраненияВыгрузки");
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
ТекущийМакет = Элементы.Макеты.ТекущиеДанные;
НаименованиеКопии = ПолучитьУникальноеНаименование(ТекущийМакет.Представление);
ПоказатьВводСтроки(ОписаниеОповещения, НаименованиеКопии, НСтр("ru = 'Введите наименование макета'"), 100, Ложь)
КонецПроцедуры
&НаСервере
Функция ПолучитьУникальноеНаименование(НаименованиеМакета, ЭтоКопирование = Истина)
НовоеНаименование = НаименованиеМакета;
ОкончаниеКопии = "";
Счетчик = 1;
ДеревоМакетов = РеквизитФормыВЗначение("Макеты");
Пока ДеревоМакетов.Строки.Найти(НовоеНаименование + ОкончаниеКопии, "Представление", Истина) <> Неопределено Цикл
Если ЭтоКопирование Тогда
ОкончаниеКопии = " - " + НСтр("ru = 'копия'");
Иначе
ОкончаниеКопии = "";
КонецЕсли;
Если Счетчик > 1 Тогда
ОкончаниеКопии = ОкончаниеКопии + " ("+Формат(Счетчик, "ЧДЦ=0; ЧГ=;")+")";
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Возврат НовоеНаименование + ОкончаниеКопии;
КонецФункции
&НаКлиенте
Процедура ПриВыбореИмениМакета(ИмяМакета, ПараметрыОповещения) Экспорт
Копирование = ПараметрыОповещения.Копирование;
Если Не ЗначениеЗаполнено(ИмяМакета) Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
ТипМакета = ?(ПараметрыОповещения.ТипМакета = Неопределено, ТекущиеДанные.ТипМакета, ПараметрыОповещения.ТипМакета);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ТипМакета", ТипМакета);
ПараметрыОткрытия.Вставить("Владелец", ?(ЗначениеЗаполнено(ТекущиеДанные.Владелец), ТекущиеДанные.Владелец, ТекущиеДанные.Идентификатор));
ПараметрыОткрытия.Вставить("ИмяДокумента", ИмяМакета);
Если Копирование Тогда
ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
ПараметрыОткрытия.Вставить("Копирование", Копирование);
КонецЕсли;
ПараметрыОткрытия.Вставить("ИсточникДанных", ТекущиеДанные.Владелец);
ПараметрыОткрытия.Вставить("ЭтоПечатнаяФорма", Истина);
ПараметрыОткрытия.Вставить("ДоступноНазначение", Истина);
ПараметрыОткрытия.Вставить("МакетДляВыгрузкиОбъекта", Ложь);
Если ПараметрыОповещения.МакетДляВыгрузкиОбъекта Тогда
ПараметрыОткрытия.МакетДляВыгрузкиОбъекта = Истина;
Если Копирование Тогда
ПараметрыОткрытия.Вставить("ФорматСохраненияВыгрузки", ТекущиеДанные.ФорматСохраненияВыгрузки);
КонецЕсли;
КонецЕсли;
Если ТипМакета = "MXL" Тогда
ПараметрыФормы = СтандартныеПодсистемыКлиент.ПараметрыРедактораТабличногоДокумента();
ПараметрыФормы.Редактирование = Истина;
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ПараметрыОткрытия, Истина);
СтандартныеПодсистемыКлиент.ПоказатьРедакторТабличногоДокумента(Неопределено, ПараметрыФормы,, ЭтотОбъект);
Возврат;
КонецЕсли;
Если ТипМакета = "DOCX" Тогда
ПараметрыОткрытия.Вставить("Редактирование", Истина);
ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект);
Возврат;
КонецЕсли;
ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиКСписку()
ВладелецКоманд = Элементы.Макеты.ТекущиеДанные;
Если ВладелецКоманд = Неопределено Или СтрНачинаетсяС(ВладелецКоманд.Идентификатор, "Подсистема") Тогда
Возврат;
КонецЕсли;
Родитель = ВладелецКоманд.ПолучитьРодителя();
Если Родитель <> Неопределено И Не СтрНачинаетсяС(Родитель.Идентификатор, "Подсистема") Тогда
ВладелецКоманд = Родитель;
КонецЕсли;
НавигационнаяСсылкаСписка = ПолучитьНавигационнуюСсылкуНаФормуСписка(ВладелецКоманд.Владелец);
Для Каждого ОкноКлиентскогоПриложения Из ПолучитьОкна() Цикл
Если ОкноКлиентскогоПриложения.ПолучитьНавигационнуюСсылку() = НавигационнаяСсылкаСписка Тогда
Форма = ОкноКлиентскогоПриложения.Содержимое[0];
ОписаниеОповещения = Новый ОписаниеОповещения("ПерейтиКСпискуЗавершение", ЭтотОбъект,
Новый Структура("Форма, НавигационнаяСсылка", Форма, НавигационнаяСсылкаСписка));
Кнопки = Новый СписокЗначений;
Кнопки.Добавить("Переоткрыть", НСтр("ru = 'Переоткрыть'"));
Кнопки.Добавить("Отмена", НСтр("ru = 'Не переоткрывать'"));
ТекстВопроса =
НСтр("ru = 'Список уже открыт. Переоткрыть список,
|чтобы увидеть изменения меню печать?'");
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , "Переоткрыть");
Возврат;
КонецЕсли;
КонецЦикла;
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылкаСписка);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьНавигационнуюСсылкуНаФормуСписка(ИдентификаторОбъектаМетаданных)
Возврат "e1cib/list/"
+ ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИдентификаторОбъектаМетаданных).ПолноеИмя();
КонецФункции
&НаКлиенте
Процедура ПерейтиКСпискуЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = "Отмена" Тогда
Возврат;
КонецЕсли;
ДополнительныеПараметры.Форма.Закрыть();
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(ДополнительныеПараметры.НавигационнаяСсылка);
КонецПроцедуры
&НаСервере
Функция НайтиМакет(Идентификатор, Знач Ветка = Неопределено)
Если Ветка = Неопределено Тогда
Ветка = Макеты;
КонецЕсли;
Для Каждого Макет Из Ветка.ПолучитьЭлементы() Цикл
Если Макет.Идентификатор = Идентификатор Тогда
Возврат Макет;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаКлиенте
Процедура УдалитьМакет(Команда)
ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Родитель = ТекущиеДанные.ПолучитьРодителя();
ИмяОбъектаМетаданных = Родитель.Идентификатор;
ОчиститьКэш(ИмяОбъектаМетаданных, ОбъектыСКомандамиПечати);
ИдентификаторМакета = ТекущиеДанные.Идентификатор;
УдалитьМакетНаСервере(ИдентификаторМакета);
НайденныеМакеты = НайтиМакеты(ИдентификаторМакета, Макеты);
Для Каждого Макет Из НайденныеМакеты Цикл
Макет.ПолучитьРодителя().ПолучитьЭлементы().Удалить(Макет);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура УдалитьМакетНаСервере(ИдентификаторМакета)
УправлениеПечатью.УдалитьМакет(ИдентификаторМакета);
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Макеты");
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоПодраздел");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветРазделаПанелиФункций);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Используется");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Ложь;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("МакетыИспользуется");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("МакетыИспользуется");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Поставляемый");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СоответствуетОтбору");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Ложь;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЕстьЭлементыСоответствующиеОтбору");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Ложь;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СоответствуетОтбору");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Ложь;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЕстьЭлементыСоответствующиеОтбору");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СтрокаПоиска");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеСодержит;
ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("СтрокаПоиска");
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Элементы.МакетыИндексКартинкиФорматаСохранения.Имя);
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ФорматСохраненияВыгрузки");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСписокМакетовПоРазделам()
Макеты.ПолучитьЭлементы().Очистить();
ВывестиКоллекцию(Макеты, Метаданные.Подсистемы);
ЗаполнитьТаблицуМакетовПечатныхФорм(Макеты);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСписокМакетовПоОбъектам()
Макеты.ПолучитьЭлементы().Очистить();
ДеревоОбъектовМетаданныхЗаполнить();
ЗаполнитьТаблицуМакетовПечатныхФорм(Макеты);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТаблицуМакетовПечатныхФорм(Ветка)
Если МакетыВыгрузки Тогда
Возврат;
КонецЕсли;
ОбъектыСМакетами = Новый Соответствие;
Для Каждого ОписаниеМакета Из УправлениеПечатью.МакетыПечатныхФорм(Истина) Цикл
ОбъектыСМакетами.Вставить(ОписаниеМакета.Значение, Истина);
КонецЦикла;
ОбъектыМетаданных = Новый Массив;
Для Каждого Объект Из ОбъектыСМакетами Цикл
ОбъектыМетаданных.Добавить(Объект.Ключ);
КонецЦикла;
СоответствиеВладельцевМакетов = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ОбъектыМетаданных, Ложь);
ВладельцыМакетов = Новый СписокЗначений();
Для Каждого Источник Из СоответствиеВладельцевМакетов Цикл
Если Не ЗначениеЗаполнено(Источник.Значение) Тогда
Продолжить;
КонецЕсли;
ВладельцыМакетов.Добавить(Источник.Значение, Источник.Значение);
КонецЦикла;
ИдентификаторыОбъектовМетаданных = ВладельцыМакетов.ВыгрузитьЗначения();
ЗначенияПустойСсылки = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(ИдентификаторыОбъектовМетаданных, "ЗначениеПустойСсылки");
ВладельцыМакетов.СортироватьПоПредставлению();
ГруппыМакетов = Новый Соответствие();
ГруппаПрочие = Ветка.ПолучитьЭлементы().Добавить();
ГруппаПрочие.Представление = НСтр("ru = 'Прочие'");
ГруппаПрочие.КартинкаГруппы = БиблиотекаКартинок.Перечисление;
ГруппаПрочие.Идентификатор = "ОбщиеМакеты";
ГруппаПрочие.КартинкаИспользования = -1;
ГруппаПрочие.ЭтоГруппа = Истина;
ГруппаПрочие.Используется = Истина;
ГруппаПрочие.Владелец = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
ГруппаПрочие.СтрокаПоиска = НРег(ГруппаПрочие.Представление);
ГруппаПрочие.ДоступноСоздание = Ложь;
ГруппыМакетов.Вставить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(), ГруппаПрочие);
ДоступноДобавлениеМакетов = ПравоДоступа("Добавление", Метаданные.Справочники.МакетыПечатныхФорм);
Для Каждого Владелец Из ВладельцыМакетов Цикл
ГруппаМакетов = ГруппаПрочие.ПолучитьЭлементы().Добавить();
ГруппаМакетов.Представление = Владелец.Представление;
ГруппаМакетов.КартинкаГруппы = Новый Картинка;
ГруппаМакетов.Идентификатор = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец.Значение, "ПолноеИмя");
ГруппаМакетов.КартинкаИспользования = -1;
ГруппаМакетов.ЭтоГруппа = Истина;
ГруппаМакетов.Используется = Истина;
ГруппаМакетов.Владелец = Владелец.Значение;
ГруппаМакетов.СтрокаПоиска = НРег(ГруппаМакетов.Представление);
ГруппаМакетов.ДоступноСоздание = Ложь;
ГруппаМакетов.ПолучитьЭлементы().Добавить();
ГруппыМакетов.Вставить(Владелец.Значение, ГруппаМакетов);
КонецЦикла;
ВывестиМакеты(ГруппаПрочие);
КонецПроцедуры
&НаСервере
Процедура ВывестиКоллекцию(Знач Ветка, Знач КоллекцияОбъектовМетаданных)
Для Каждого ОбъектМетаданных Из КоллекцияОбъектовМетаданных Цикл
Если ТипЗнч(Ветка) = Тип("ДанныеФормыЭлементДерева") И ОбъектМетаданных.ПолноеИмя() = Ветка.Идентификатор Тогда
Продолжить;
КонецЕсли;
Если Не ЭтоПодсистема(ОбъектМетаданных) И Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных)
И ОбъектыСКомандамиПечати.НайтиПоЗначению(ОбъектМетаданных.ПолноеИмя()) = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Не ОбъектМетаданныхДоступен(ОбъектМетаданных) Тогда
Продолжить;
КонецЕсли;
НоваяВетка = Ветка.ПолучитьЭлементы().Добавить();
НоваяВетка.Представление = ОбъектМетаданных.Представление();
НоваяВетка.КартинкаГруппы = КартинкаВИнтерфейсе(ОбъектМетаданных);
НоваяВетка.Идентификатор = ОбъектМетаданных.ПолноеИмя();
НоваяВетка.КартинкаИспользования = -1;
НоваяВетка.ЭтоГруппа = Истина;
НоваяВетка.Используется = Истина;
НоваяВетка.СтрокаПоиска = НРег(НоваяВетка.Представление);
Если ЭтоПодсистема(ОбъектМетаданных) Тогда
ВывестиКоллекцию(НоваяВетка, ОбъектМетаданных.Состав);
ВывестиКоллекцию(НоваяВетка, ОбъектМетаданных.Подсистемы);
НоваяВетка.ЭтоПодраздел = КоллекцияОбъектовМетаданных <> Метаданные.Подсистемы;
Иначе
НоваяВетка.Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(НоваяВетка.Идентификатор, Ложь);
НоваяВетка.ДоступноСоздание = ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданных);
НоваяВетка.ПолучитьЭлементы().Добавить();
КонецЕсли;
Если ЭтоПодсистема(ОбъектМетаданных) И НоваяВетка.ПолучитьЭлементы().Количество() = 0 Тогда
Индекс = Ветка.ПолучитьЭлементы().Индекс(НоваяВетка);
Ветка.ПолучитьЭлементы().Удалить(Индекс);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция КартинкаВИнтерфейсе(ОбъектМетаданных)
СвойстваОбъекта = Новый Структура("Картинка");
ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);
Если ЗначениеЗаполнено(СвойстваОбъекта.Картинка) Тогда
Возврат СвойстваОбъекта.Картинка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
&НаСервереБезКонтекста
Функция ЭтоПодсистема(ОбъектМетаданных)
Возврат СтрНачинаетсяС(ОбъектМетаданных.ПолноеИмя(), "Подсистема");
КонецФункции
&НаСервере
Функция ОбъектМетаданныхДоступен(ОбъектМетаданных)
Если Не ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектМетаданных)
И Не ОбщегоНазначения.ЭтоЗадача(ОбъектМетаданных)
И Не Метаданные.Обработки.Содержит(ОбъектМетаданных)
И Не Метаданные.Отчеты.Содержит(ОбъектМетаданных)
И Не ЭтоПодсистема(ОбъектМетаданных) Тогда
Возврат Ложь;
КонецЕсли;
ДоступенПоПравам = ПравоДоступа("Просмотр", ОбъектМетаданных);
ДоступенПоФункциональнымОпциям = ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОбъектМетаданных);
СвойстваМетаданного = Новый Структура("ПолнотекстовыйПоиск, ВключатьВКомандныйИнтерфейс");
ЗаполнитьЗначенияСвойств(СвойстваМетаданного, ОбъектМетаданных);
Если СвойстваМетаданного.ПолнотекстовыйПоиск = Неопределено Тогда
ИспользованиеПолнотекстовогоПоиска = Истина;
Иначе
ИспользованиеПолнотекстовогоПоиска = (СвойстваМетаданного.ПолнотекстовыйПоиск =
Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать);
КонецЕсли;
Если СвойстваМетаданного.ВключатьВКомандныйИнтерфейс = Неопределено Тогда
ВключатьВКомандныйИнтерфейс = Истина;
Иначе
ВключатьВКомандныйИнтерфейс = СвойстваМетаданного.ВключатьВКомандныйИнтерфейс;
КонецЕсли;
Возврат ДоступенПоПравам И ДоступенПоФункциональнымОпциям
И ИспользованиеПолнотекстовогоПоиска И ВключатьВКомандныйИнтерфейс;
КонецФункции
&НаСервере
Функция ПодчиненныеСправочники(ОбъектМетаданных)
Если ПодчиненныеСправочники = Неопределено Тогда
ПодчиненныеСправочники = Новый Соответствие;
Для Каждого Справочник Из Метаданные.Справочники Цикл
Если ПодчиненныеСправочники[Справочник] = Неопределено Тогда
ПодчиненныеСправочники[Справочник] = Новый Массив;
КонецЕсли;
Для Каждого ВладелецСправочника Из Справочник.Владельцы Цикл
Если ПодчиненныеСправочники[ВладелецСправочника] = Неопределено Тогда
ПодчиненныеСправочники[ВладелецСправочника] = Новый Массив;
КонецЕсли;
СписокСправочников = ПодчиненныеСправочники[ВладелецСправочника];
СписокСправочников.Добавить(Справочник);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат ПодчиненныеСправочники[ОбъектМетаданных];
КонецФункции
&НаСервере
Процедура ВывестиМакеты(ОписаниеОбъекта)
Если Не ЗначениеЗаполнено(ОписаниеОбъекта.Идентификатор) Тогда
Возврат;
КонецЕсли;
МакетыОбъекта = МакетыОбъекта(ОписаниеОбъекта.Идентификатор);
Ветка = ОписаниеОбъекта;
КоллекцияЭлементов = Ветка.ПолучитьЭлементы();
Для Индекс = 0 По МакетыОбъекта.Количество() -1 Цикл
ОписаниеМакета = МакетыОбъекта[Индекс];
Макет = КоллекцияЭлементов.Вставить(Индекс);
ЗаполнитьЗначенияСвойств(Макет, ОписаниеМакета);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция МакетыОбъекта(ИмяОбъектаМетаданных)
НайденныйЭлемент = ОбъектыСКомандамиПечати.НайтиПоЗначению(ИмяОбъектаМетаданных);
Если НайденныйЭлемент = Неопределено Тогда
НайденныйЭлемент = ОбъектыСКомандамиПечати.Добавить(ИмяОбъектаМетаданных);
КонецЕсли;
Если ЗначениеЗаполнено(НайденныйЭлемент.Представление) Тогда
МакетыОбъекта = ОбщегоНазначения.ЗначениеИзСтрокиXML(НайденныйЭлемент.Представление);
Иначе
МакетыОбъекта = РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъекта(ИмяОбъектаМетаданных);
НайденныйЭлемент.Представление = ОбщегоНазначения.ЗначениеВСтрокуXML(МакетыОбъекта);
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("МакетДляВыгрузкиОбъекта", МакетыВыгрузки);
Возврат МакетыОбъекта.НайтиСтроки(Отбор);
КонецФункции
&НаСервере
Функция НайтиВеткиВладельцаМакетов(Владелец, ТекущаяВетка, НайденныеВетки = Неопределено)
Если НайденныеВетки = Неопределено Тогда
НайденныеВетки = Новый Массив;
КонецЕсли;
Для Каждого Ветка Из ТекущаяВетка.ПолучитьЭлементы() Цикл
Если Ветка.ЭтоГруппа И Ветка.Владелец = Владелец Тогда
НайденныеВетки.Добавить(Ветка);
Иначе
НайтиВеткиВладельцаМакетов(Владелец, Ветка, НайденныеВетки)
КонецЕсли;
КонецЦикла;
Возврат НайденныеВетки;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция НайтиМакеты(Знач Идентификатор, Знач Ветка)
Результат = Новый Массив;
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
Если Элемент.Идентификатор = Идентификатор Тогда
Результат.Добавить(Элемент);
Иначе
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, НайтиМакеты(Идентификатор, Элемент));
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Функция НайтиЭлементВДеревеМакетов(Знач Идентификатор, Знач Ветка = Неопределено)
Если Ветка = Неопределено Тогда
Ветка = Макеты;
КонецЕсли;
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
Если Элемент.Идентификатор = Идентификатор Тогда
НайденныйЭлемент = Элемент;
Иначе
НайденныйЭлемент = НайтиЭлементВДеревеМакетов(Идентификатор, Элемент);
КонецЕсли;
Если НайденныйЭлемент <> Неопределено Тогда
Возврат НайденныйЭлемент;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаКлиенте
Процедура ПрименитьОтбор()
Если ОтборУстановлен() Тогда
ЗагрузитьСписокМакетов();
КонецЕсли;
ОтметитьЭлементыСоответствующиеОтбору();
Если Не ОтборУстановлен() Тогда
Возврат;
КонецЕсли;
РазвернутьЭлементыСоответствующиеОтбору();
Если Элементы.Макеты.ТекущиеДанные <> Неопределено Тогда
Если СоответствуетОтбору(Элементы.Макеты.ТекущиеДанные) Тогда
ТекущаяСтрока = Элементы.Макеты.ТекущаяСтрока;
Элементы.Макеты.ТекущаяСтрока = 0;
Элементы.Макеты.ТекущаяСтрока = ТекущаяСтрока;
Иначе
ПерейтиКПервомуНайденномуМакету();
КонецЕсли;
КонецЕсли;
УстановитьДоступностьКнопокКоманднойПанели();
КонецПроцедуры
&НаКлиенте
Процедура РазвернутьЭлементыСоответствующиеОтбору(Ветка = Неопределено)
Если Не ЗначениеЗаполнено(СтрокаПоиска) Тогда
Возврат;
КонецЕсли;
Если Ветка = Неопределено Тогда
Ветка = Макеты;
КонецЕсли;
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
КоллекцияПодчиненныхЭлементов = Элемент.ПолучитьЭлементы();
Если Элемент.ЕстьЭлементыСоответствующиеОтбору И КоллекцияПодчиненныхЭлементов.Количество() > 0
И ЗначениеЗаполнено(КоллекцияПодчиненныхЭлементов[0].Идентификатор) Тогда
Элементы.Макеты.Развернуть(Элемент.ПолучитьИдентификатор(), Ложь);
РазвернутьЭлементыСоответствующиеОтбору(Элемент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция ОтметитьЭлементыСоответствующиеОтбору(Знач Ветка = Неопределено)
Если Ветка = Неопределено Тогда
Ветка = Макеты;
КонецЕсли;
ЕстьЭлементыСоответствующиеОтбору = Не ОтборУстановлен();
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
Элемент.СоответствуетОтбору = СоответствуетОтбору(Элемент);
Элемент.ЕстьЭлементыСоответствующиеОтбору = ОтметитьЭлементыСоответствующиеОтбору(Элемент);
ЕстьЭлементыСоответствующиеОтбору = ЕстьЭлементыСоответствующиеОтбору
Или Элемент.СоответствуетОтбору Или Элемент.ЕстьЭлементыСоответствующиеОтбору;
КонецЦикла;
Возврат ЕстьЭлементыСоответствующиеОтбору;
КонецФункции
&НаКлиенте
Функция СоответствуетОтбору(Элемент)
СтрокаСоответствуетШаблону = Не ЗначениеЗаполнено(СтрокаПоиска);
Если СтрНайти(СтрокаПоиска, "*") Тогда
ШаблонПоиска = НРег(СокрЛП(СтрокаПоиска));
Иначе
ШаблонПоиска = СтрЗаменить(НРег(СокрЛП(СтрокаПоиска)), " ", "*");
КонецЕсли;
СтрокаСоответствуетШаблону = СтрокаСоответствуетШаблону Или СтрокаСоответствуетШаблону(Элемент.СтрокаПоиска, ШаблонПоиска);
Возврат СтрокаСоответствуетШаблону
И (Не Элемент.ЭтоГруппа И ПоказыватьИзмененные И Элемент.Изменен
И (ПоказыватьИспользуемые И Элемент.Используется Или ПоказыватьНеиспользуемые И Не Элемент.Используется)
Или ПоказыватьНеизмененные И Не Элемент.Изменен)
И (Не ЗначениеЗаполнено(ОтборПоЯзыку) Или СтрНайти(Элемент.ДоступныеЯзыки, ОтборПоЯзыку));
КонецФункции
&НаКлиенте
Функция ОтборУстановлен()
Возврат ЗначениеЗаполнено(СтрокаПоиска)
Или ОтборПоИспользованиюМакета <> "ВсеМакеты"
Или ЗначениеЗаполнено(ОтборПоЯзыку);
КонецФункции
&НаСервере
Процедура ЗаполнитьОбъектыСКомандамиПечати()
МетаданныеДляВыгрузки = Новый Массив;
МетаданныеДляВыгрузки.Добавить("Справочники");
МетаданныеДляВыгрузки.Добавить("Документы");
Для Каждого ОбъектМетаданных Из УправлениеПечатью.ИсточникиКомандПечати() Цикл
ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных);
Если МакетыВыгрузки
И МетаданныеДляВыгрузки.Найти(ИмяБазовогоТипа) = Неопределено Тогда
Продолжить;
КонецЕсли;
ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя());
КонецЦикла;
ОбъектыСМакетами = Новый Соответствие;
Для Каждого ОписаниеМакета Из УправлениеПечатью.МакетыПечатныхФорм(Истина) Цикл
ОбъектыСМакетами.Вставить(ОписаниеМакета.Значение, Истина);
КонецЦикла;
Для Каждого Объект Из ОбъектыСМакетами Цикл
Если Объект.Ключ <> Метаданные.ОбщиеМакеты Тогда
ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Объект.Ключ);
Если МакетыВыгрузки
И МетаданныеДляВыгрузки.Найти(ИмяБазовогоТипа) = Неопределено Тогда
Продолжить;
КонецЕсли;
ОбъектыСКомандамиПечати.Добавить(Объект.Ключ.ПолноеИмя());
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция ПерейтиКПервомуНайденномуМакету(Знач Ветка = Неопределено)
Если Ветка = Неопределено Тогда
Ветка = Макеты;
КонецЕсли;
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
Если Элемент.СоответствуетОтбору Тогда
Элементы.Макеты.ТекущаяСтрока = Элемент.ПолучитьИдентификатор();
Возврат Истина;
КонецЕсли;
Если ПерейтиКПервомуНайденномуМакету(Элемент) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
&НаСервере
Процедура ПерейтиКЭлементу(Знач ПутьКЭлементу, Знач Ветка = Неопределено)
Если Ветка = Неопределено Тогда
Ветка = Макеты;
КонецЕсли;
ЧастиПути = СтрРазделить(ПутьКЭлементу, "/", Ложь);
Если ЧастиПути.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ИдентификаторТекущейВетки = ЧастиПути[0];
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
Если Элемент.Идентификатор = ИдентификаторТекущейВетки Тогда
Если ЧастиПути.Количество() = 1 Тогда
Элементы.Макеты.ТекущаяСтрока = Элемент.ПолучитьИдентификатор();
Возврат;
КонецЕсли;
ЗагрузитьПодчиненныеЭлементы(Элемент.ПолучитьИдентификатор());
ЧастиПути.Удалить(0);
ПутьКЭлементу = СтрСоединить(ЧастиПути, "/");
ПерейтиКЭлементу(ПутьКЭлементу, Элемент);
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПутьКЭлементуВДереве(Элемент)
Если Элемент = Неопределено Тогда
Возврат "";
КонецЕсли;
Возврат ПутьКЭлементуВДереве(Элемент.ПолучитьРодителя()) + "/" + Элемент.Идентификатор;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ОчиститьКэш(ИмяОбъектаМетаданных, ОбъектыСКомандамиПечати)
НайденныйЭлемент = ОбъектыСКомандамиПечати.НайтиПоЗначению(ИмяОбъектаМетаданных);
Если НайденныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
НайденныйЭлемент.Представление = "";
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьСписокМакетов()
Если (ВыполняетсяЗагрузкаДанных
Или Не ЕстьОбъектыБезКэша())
И НЕ ИзмененСпособГруппировки Тогда
Возврат;
КонецЕсли;
ИзмененСпособГруппировки = Ложь;
ВыполняетсяЗагрузкаДанных = Истина;
Элементы.ВыполняетсяПоиск.Видимость = Истина;
ДлительнаяОперация = НачатьВыполнениеНаСервере();
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеНаСервере()
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения,
"РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъектов", ОбъектыБезКэша());
КонецФункции
&НаКлиенте
Процедура ОбработатьРезультат(Результат, ДополнительныеПараметры) Экспорт
ВыполняетсяЗагрузкаДанных = Ложь;
Элементы.ВыполняетсяПоиск.Видимость = Ложь;
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(
Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
ОбработатьРезультатНаСервере(Результат.АдресРезультата);
ОбновитьВидимостьМакетов();
КонецПроцедуры
&НаСервере
Процедура ОбработатьРезультатНаСервере(АдресРезультата)
МакетыОбъектов = ПолучитьИзВременногоХранилища(АдресРезультата);
ЗаписатьКэшМакетов(МакетыОбъектов);
ЗагрузитьВетку(Макеты);
КонецПроцедуры
&НаКлиенте
Функция ЕстьОбъектыБезКэша()
Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл
Если Не ЗначениеЗаполнено(Элемент.Представление) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ОбъектыБезКэша()
Результат = Новый Массив;
Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл
Если Не ЗначениеЗаполнено(Элемент.Представление) Тогда
Если Элемент.Значение = "ОбщиеМакеты" Тогда
Результат.Добавить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка());
Иначе
Результат.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Элемент.Значение));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ЗаписатьКэшМакетов(МакетыОбъектов)
ИдентификаторыОбъектовМетаданных = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ОбъектыСКомандамиПечати.ВыгрузитьЗначения(), Ложь);
Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл
Если ЗначениеЗаполнено(Элемент.Представление) Тогда
Продолжить;
КонецЕсли;
Если Элемент.Значение = "ОбщиеМакеты" Тогда
Владелец = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
Иначе
Владелец = ИдентификаторыОбъектовМетаданных[Элемент.Значение];
КонецЕсли;
НайденныеМакеты = МакетыОбъектов.НайтиСтроки(Новый Структура("Владелец", Владелец));
МакетыОбъекта = МакетыОбъектов.Скопировать(НайденныеМакеты);
Элемент.Представление = ОбщегоНазначения.ЗначениеВСтрокуXML(МакетыОбъекта);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьВетку(Ветка)
Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
ЗагрузитьПодчиненныеЭлементы(Элемент.ПолучитьИдентификатор());
ЗагрузитьВетку(Элемент);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция СтрокаСоответствуетШаблону(Знач Строка, Знач Шаблон)
Строка = СтрСоединить(СтрРазделить(Строка, " " + Символы.ПС + Символы.ВК + Символы.Таб, Ложь), " ");
СтрокаСоответствуетШаблону = Истина;
Для Каждого ЧастиШаблона Из СтрРазделить(Шаблон, "*", Ложь) Цикл
ФрагментДляПоиска = СтрСоединить(СтрРазделить(ЧастиШаблона, " " + Символы.ПС + Символы.ВК + Символы.Таб, Ложь), " ");
Позиция = СтрНайти(Строка, ФрагментДляПоиска);
Если Позиция = 0 Тогда
СтрокаСоответствуетШаблону = Ложь;
Прервать;
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(ФрагментДляПоиска));
КонецЦикла;
Возврат СтрокаСоответствуетШаблону;
КонецФункции
&НаСервереБезКонтекста
Функция ИдентификаторВладельцаМакета(ПутьКМакету)
ИсточникиДанныхМакета = УправлениеПечатью.ИсточникиДанныхМакета(ПутьКМакету);
Если Не ЗначениеЗаполнено(ИсточникиДанныхМакета) Тогда
Возврат Неопределено;
КонецЕсли;
ОбъектыМетаданных = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИсточникиДанныхМакета, Ложь);
Для Каждого ИсточникДанных Из ИсточникиДанныхМакета Цикл
Если ОбъектыМетаданных[ИсточникДанных] <> Неопределено Тогда
Если ИсточникДанных = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда
Возврат "ОбщиеМакеты";
ИначеЕсли ОбъектыМетаданных[ИсточникДанных] <> Null Тогда
Возврат ОбъектыМетаданных[ИсточникДанных].ПолноеИмя();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаСервере
Функция ПозицияМакетаВДереве(Знач ПутьКМакету)
Результат = "";
ИдентификаторВладельцаМакета = ИдентификаторВладельцаМакета(ПутьКМакету);
ВладелецМакета = НайтиЭлементВДеревеМакетов(ИдентификаторВладельцаМакета);
Если ВладелецМакета <> Неопределено Тогда
Результат = ПутьКЭлементуВДереве(ВладелецМакета) + "/" + ПутьКМакету;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ПозицияВладельцаВДереве(Знач ИдентификаторВладельца)
ВладелецМакета = НайтиЭлементВДеревеМакетов(ИдентификаторВладельца);
Если ВладелецМакета <> Неопределено Тогда
Результат = ПутьКЭлементуВДереве(ВладелецМакета);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ЗагрузитьНастройкиСпособГруппировкиОбъектов()
ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"НастройкаОткрытияМакетовСпособГруппировкиОбъектов",
"ГруппировкаПоРазделам");
Если ЗначениеНастроек <> Неопределено Тогда
ГруппировкаПоРазделам = ЗначениеНастроек;
Иначе
ГруппировкаПоРазделам = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция НавигационнаяСсылкаПоПараметру(Знач Представление, Знач ПараметрМакетыВыгрузки)
Возврат ПолучитьНавигационнуюСсылку(
Метаданные.РегистрыСведений.ПользовательскиеМакетыПечати,
Представление,
ПараметрМакетыВыгрузки);
КонецФункции
&НаСервере
Процедура ДеревоОбъектовМетаданныхЗаполнить()
ОбъектыМетаданных = Новый ТаблицаЗначений;
ОбъектыМетаданных.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
ОбъектыМетаданных.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
ОбъектыМетаданных.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка"));
ОбъектыМетаданных.Колонки.Добавить("Выводить", Новый ОписаниеТипов("Булево"));
ВыводитьКоллекцию = НЕ МакетыВыгрузки;
ИмяМетаданных = НСтр("ru = 'Справочники'");
НоваяСтрокаКоллекции(
"Справочники",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеСправочники,
Истина,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Документы'");
НоваяСтрокаКоллекции(
"Документы",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеДокументы,
Истина,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Журналы документов'");
НоваяСтрокаКоллекции(
"ЖурналыДокументов",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеЖурналыДокументов,
ВыводитьКоллекцию,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Планы видов характеристик'");
НоваяСтрокаКоллекции(
"ПланыВидовХарактеристик",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеПланыВидовХарактеристик,
ВыводитьКоллекцию,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Планы счетов'");
НоваяСтрокаКоллекции(
"ПланыСчетов",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеПланыСчетов,
ВыводитьКоллекцию,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Планы видов расчета'");
НоваяСтрокаКоллекции(
"ПланыВидовРасчета",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеПланыВидовРасчета,
ВыводитьКоллекцию,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Бизнес-процессы'");
НоваяСтрокаКоллекции(
"БизнесПроцессы",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеБизнесПроцессы,
ВыводитьКоллекцию,
ОбъектыМетаданных);
ИмяМетаданных = НСтр("ru = 'Задачи'");
НоваяСтрокаКоллекции(
"Задачи",
ИмяМетаданных,
БиблиотекаКартинок.МетаданныеЗадачи,
ВыводитьКоллекцию,
ОбъектыМетаданных);
КоллекцииВыбираемыхОбъектовМетаданных = Новый СписокЗначений;
Если ОбъектыСКомандамиПечати.Количество() > 0 Тогда
Для Каждого ОбъектМетаданныхПолноеИмя Из ОбъектыСКомандамиПечати Цикл
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданныхПолноеИмя.Значение);
Если ОбъектМетаданных <> Неопределено Тогда
ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных);
Если КоллекцииВыбираемыхОбъектовМетаданных.НайтиПоЗначению(ИмяБазовогоТипа) = Неопределено Тогда
КоллекцииВыбираемыхОбъектовМетаданных.Добавить(ИмяБазовогоТипа);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если НЕ ОбъектМетаданных.Выводить Тогда
Продолжить;
КонецЕсли;
Если КоллекцииВыбираемыхОбъектовМетаданных.НайтиПоЗначению(ОбъектМетаданных.Имя) <> Неопределено Тогда
ДобавитьЭлементДереваОбъектовМетаданных(ОбъектМетаданных);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьЭлементДереваОбъектовМетаданных(ПараметрыЭлемента)
НоваяВетка = Макеты.ПолучитьЭлементы().Добавить();
НоваяВетка.Представление = ПараметрыЭлемента.Синоним;
НоваяВетка.КартинкаГруппы = ПараметрыЭлемента.Картинка;
НоваяВетка.Идентификатор = ПараметрыЭлемента.Имя;
НоваяВетка.КартинкаИспользования = -1;
НоваяВетка.ЭтоГруппа = Истина;
НоваяВетка.Используется = Истина;
НоваяВетка.СтрокаПоиска = НРег(НоваяВетка.Представление);
НоваяВетка.Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(НоваяВетка.Идентификатор, Ложь);
НоваяВетка.ДоступноСоздание = Ложь;
МассивКоллекции = Новый Массив;
Для Каждого ОбъектМетаданныхПолноеИмя Из ОбъектыСКомандамиПечати Цикл
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданныхПолноеИмя.Значение);
Если ОбъектМетаданных <> Неопределено Тогда
ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных);
Если ПараметрыЭлемента.Имя = ИмяБазовогоТипа Тогда
МассивКоллекции.Добавить(ОбъектМетаданных);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВывестиКоллекцию(НоваяВетка, МассивКоллекции);
КонецПроцедуры
&НаСервере
Процедура НоваяСтрокаКоллекции(Знач Имя, Знач Синоним, Знач Картинка, Знач ВыводитьКоллекцию, Таблица)
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Имя = Имя;
НоваяСтрока.Синоним = Синоним;
НоваяСтрока.Картинка = Картинка;
НоваяСтрока.Выводить = ВыводитьКоллекцию;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СохранитьНастройкиСпособГруппировкиОбъектов(Знач ГруппировкаПоРазделам)
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
"НастройкаОткрытияМакетовСпособГруппировкиОбъектов",
"ГруппировкаПоРазделам",
ГруппировкаПоРазделам);
КонецПроцедуры
#КонецОбласти