///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПовторноеЗакрытие;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
			
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		ВызватьИсключение НСтр("ru = 'Редактирование офисного документа недоступно в мобильном клиенте.
		|Используйте тонкий клиент или веб-клиент.'");
	КонецЕсли;
	
	ЭтоLinuxКлиент = ОбщегоНазначения.ЭтоLinuxКлиент();
	
	Если ЭтоLinuxКлиент Тогда
		Команды.ПоместитьВБуферОбмена.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.Нет, Ложь, Ложь, Ложь);
		Элементы.ПоместитьВБуферОбмена.Видимость = Ложь;
	КонецЕсли;
	
	ОтобразитьИнструкцию();
	Элементы.ПолеДокументаИнструкции.Видимость = Истина;
	Элементы.ОтобразитьИнструкцию.Пометка = Элементы.ПолеДокументаИнструкции.Видимость;
	
	Если Параметры.РежимОткрытияОкна <> Неопределено Тогда
		РежимОткрытияОкна = Параметры.РежимОткрытияОкна;
	КонецЕсли;
	
	КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
	ИдентификаторМакета = Параметры.ИмяОбъектаМетаданныхМакета;
	СсылкаМакета = Параметры.Ссылка;
	
	Если ЗначениеЗаполнено(СсылкаМакета) Тогда
		КлючОбъектаРедактирования  = СсылкаМакета;
		ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор);
	ИначеЕсли ЗначениеЗаполнено(ИдентификаторМакета) Тогда
		КлючОбъектаРедактирования = РегистрыСведений.ПользовательскиеМакетыПечати.ПолучитьКлючЗаписиМакета(ИдентификаторМакета);
		Если КлючОбъектаРедактирования <> Неопределено Тогда
			ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор);
		КонецЕсли;
	КонецЕсли;

	ЭтоПечатнаяФорма = Параметры.ЭтоПечатнаяФорма;
	РедактированиеЗапрещено = Не Параметры.Редактирование;
	ЭтоМакет = Не ПустаяСтрока(ИдентификаторМакета) Или ЭтоПечатнаяФорма;
	
	Если ЭтоМакет Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
			МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
			ИсточникиДанныхМакета = МодульУправлениеПечатью.ИсточникиДанныхМакета(ИдентификаторМакета);
			Для Каждого ИсточникДанных Из ИсточникиДанныхМакета Цикл
				ИсточникиДанных.Добавить(ИсточникДанных);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
		Если Не ЗначениеЗаполнено(ИсточникиДанных) Тогда
			ИсточникиДанных.Добавить(Параметры.ИсточникДанных);
		КонецЕсли;
	КонецЕсли;
	Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных);
	
	ТипМакета = Параметры.ТипМакета;
	ПредставлениеМакета = Параметры.ИмяДокумента;
	ИмяФайлаМакета = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ПредставлениеМакета) + "." + НРег(ТипМакета);
	
	ИмяДокумента = Параметры.ИмяДокумента;
	Элементы.Переименовать.Видимость = ЗначениеЗаполнено(Параметры.Ссылка) 
		Или ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу);
	
	ЗагрузитьОфисныйДокументИзМетаданных(Параметры.КодЯзыка);
	Если Параметры.Копирование Тогда
		ИдентификаторКопируемогоМакета = ИдентификаторМакета;
		ИдентификаторМакета = "";
	КонецЕсли;
	
	ПодготовленныйМакет = ПолучитьИзВременногоХранилища(АдресФайлаМакета);
		
	ДоступенПереводМакета = Ложь;
	Если ЭтоМакет Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
			МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
			ДоступенПереводМакета = МодульУправлениеПечатьюМультиязычность.ДоступенПереводМакета(ИдентификаторМакета);
			Если ЭтоПечатнаяФорма Или ДоступенПереводМакета Тогда
				МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, Параметры.КодЯзыка);
				ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.Язык.Доступность = (ЭтоПечатнаяФорма Или ДоступенПереводМакета) И ЗначениеЗаполнено(ИдентификаторМакета);
	
	Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод;
	Элементы.КнопкаПоказатьОригинал.Видимость = Элементы.Перевести.Видимость;
	Элементы.КнопкаПоказатьОригинал.Доступность = ТекущийЯзык <> ОбщегоНазначения.КодОсновногоЯзыка();
	
	Элементы.ЯзыкВсеДействия.Доступность = Элементы.Язык.Доступность;
	Элементы.ПеревестиВсеДействия.Видимость = Элементы.Перевести.Видимость;
	Элементы.КнопкаПоказатьОригиналВсеДействия.Видимость = Элементы.КнопкаПоказатьОригинал.Видимость;
	Элементы.КнопкаПоказатьОригиналВсеДействия.Доступность = Элементы.КнопкаПоказатьОригинал.Доступность;
	
	ИсточникДанных = Параметры.ИсточникДанных;
	Если Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
		ИсточникДанных = ИсточникиДанных[0].Значение;
	КонецЕсли;

	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных);
	ПодобратьОбразец(ОбъектМетаданных);

	ПараметрыДобавления = КонструкторФормул.ПараметрыДобавленияСпискаПолей();
	ПараметрыДобавления.ИмяСписка = ИмяСпискаПолей();
	ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаДоступныеПоля;
	ПараметрыДобавления.КоллекцииПолей = КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения(), ПараметрыРедактирования());
	ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = ПодсказкаВводаСтрокиПоискаСпискаПолей();
	ПараметрыДобавления.ПриОпределенииИсточниковДоступныхПолей = "УправлениеПечатью";
	ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор");
	ПараметрыДобавления.ОбработчикиСписка.Вставить("ПередНачаломИзменения", "Подключаемый_ДоступныеПоляПередНачаломИзменения");
	ПараметрыДобавления.ОбработчикиСписка.Вставить("ПриОкончанииРедактирования", "Подключаемый_ДоступныеПоляПриОкончанииРедактирования");
	ПараметрыДобавления.ИспользоватьФоновыйПоиск = Истина;
	
	Если Не ЭтоLinuxКлиент Тогда
		ПараметрыДобавления.КонтекстноеМеню.Вставить("Копировать", "ПоместитьВБуферОбмена");
	КонецЕсли;
	
	КонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления);
	
	ПараметрыДобавления = КонструкторФормул.ПараметрыДобавленияСпискаПолей();
	ПараметрыДобавления.ИмяСписка = ИмяСпискаОператоров();
	ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаОператорыИФункции;
	ПараметрыДобавления.КоллекцииПолей.Добавить(СписокОператоров());
	ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = НСтр("ru = 'Найти оператор или функцию...'");
	ПараметрыДобавления.СкобкиПредставлений = Ложь;
	ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор");
	ПараметрыДобавления.ОбработчикиСписка.Вставить("ПриАктивизацииСтроки", "Подключаемый_СписокПолейАктивизацияСтроки");
	ПараметрыДобавления.ОбработчикиСписка.Вставить("НачалоПеретаскивания", "Подключаемый_ОператорыНачалоПеретаскивания");
			
	Если Не ЭтоLinuxКлиент Тогда
		ПараметрыДобавления.КонтекстноеМеню.Вставить("Копировать", "ПоместитьВБуферОбмена");
	КонецЕсли;
	
	КонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления);
	ПодготовитьМакетКОткрытию(ПодготовленныйМакет);
	РасширитьСписокПолей();
	
	ПоместитьВоВременноеХранилище(ПодготовленныйМакет, АдресФайлаМакета);
	ХешРедактируемогоМакета = ПолучитьХешМакета(АдресФайлаМакета);
	ВремяПроверкиМодифицированностиМакета =	ТекущаяУниверсальнаяДатаВМиллисекундах();
	Элементы.ГруппаНазначениеМакета.Доступность = Параметры.ДоступноНазначение;

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

#Если ВебКлиент Тогда
		СпрятатьЗонуПеретаскивания = Ложь;
#Иначе
		СпрятатьЗонуПеретаскивания = Истина;
#КонецЕсли

	Если ЭтоLinuxКлиент Тогда
		СпрятатьЗонуПеретаскивания = Ложь;
	КонецЕсли;

	Если Не СпрятатьЗонуПеретаскивания Тогда
		Элементы.ГруппаСтраницыHTML.ТекущаяСтраница = Элементы.СтраницаWebКлиент;
	Иначе
		Элементы.ГруппаСтраницыHTML.ТекущаяСтраница = Элементы.СтраницаТонкийКлиент;
		ПереместитьГруппуОператоровИФункций();
	КонецЕсли;

	ПодготовитьИнструкцию();
	МинимизироватьИнтерфейс();
	УстановитьНачальныеНастройкиФормы();
	
КонецПроцедуры


&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	Если Не ЗавершениеРаботы Тогда
		ВернутьИнтерфейс();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "ЗапросИменРедактируемыхТабличныхДокументов" И Источник <> ЭтотОбъект Тогда
		ИменаДокументов = Параметр; // Массив -
		ИменаДокументов.Добавить(ИмяДокумента);
	ИначеЕсли ИмяСобытия = "ЗакрытиеФормыВладельца" И Источник = ВладелецФормы Тогда
		Если Открыта() Тогда
			Закрыть();
			Параметр.Отказ = Истина;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

	Если ЗавершениеРаботы Тогда
		Если Модифицированность И Не ОтказСохраненияИзменений Тогда
			ТекстПредупреждения = НСтр("ru = 'Макет печатной формы отредактирован в другом приложении. 
				|Нажмите Записать, чтобы не потерять изменения.'");
			Отказ = Истина;
		КонецЕсли;
		Возврат;
	КонецЕсли;

	Если Не ОтказСохраненияИзменений Тогда
		
		Если Не ЗаписьВыполнена Тогда
			ДополнительныеПараметры = Новый Структура;
			ДополнительныеПараметры.Вставить("Отказ", Отказ);
			Оповещение = Новый ОписаниеОповещения("ПередЗакрытиемОкончание", ЭтотОбъект, ДополнительныеПараметры);
			ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект);

			ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
			Отказ = Истина;
		Иначе
			ПередЗакрытиемЗавершение(Ложь, Неопределено);
		КонецЕсли;
	КонецЕсли;
	
	Если Не Отказ И ЗначениеЗаполнено(КлючОбъектаРедактирования) Тогда
		РазблокироватьНаСервере(); 
	КонецЕсли;
		
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПолеДокументаИнструкцииПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	Если ДанныеСобытия.Event.type = "click" И СтрНайти(ДанныеСобытия.Element.href, "ВызватьСправку")<> 0 Тогда
		ОткрытьСправку("ОбщаяФорма.РедактированиеДокументаOfficeOpen");
		СтандартнаяОбработка = ложь;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти


#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ПоказатьИнструкцию(Команда)
	Элементы.ПолеДокументаИнструкции.Видимость = Не Элементы.ПолеДокументаИнструкции.Видимость;
	Элементы.ОтобразитьИнструкцию.Пометка = Элементы.ПолеДокументаИнструкции.Видимость; 
КонецПроцедуры

&НаКлиенте
Процедура Записать(Команда)
	Оповещение = Новый ОписаниеОповещения("ЗаписатьПродолжение", ЭтотОбъект);
	ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект);
	ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
КонецПроцедуры

&НаКлиенте
Процедура Переименовать(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект);
	ПоказатьВводСтроки(ОписаниеОповещения, ИмяДокумента, НСтр("ru = 'Введите наименование макета'"), 100, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура Перевести(Команда)
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Выполнить автоматический перевод на %1 язык?'"), Элементы.Язык.Заголовок);
	Кнопки = Новый СписокЗначений;
	Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'"));
	Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'"));
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьОригинал(Команда)
	ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета);
	ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = "Оригинал.docx";
	ПараметрыОткрытияМакета.ТолькоПросмотр = Истина;
	
	ОткрытьМакет(ПараметрыОткрытияМакета);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьРедактор(Команда)
	Оповещение = Новый ОписаниеОповещения("ОткрытьРедакторПродолжение", ЭтотОбъект);
	ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриОткрытииФайла", ЭтотОбъект);
	ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
	
	Если Не ЭтоНовый() Тогда
		Модифицированность = Истина;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите офисный документ'");
	ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Офисный документ'") + " (*.docx)|*.docx";

	ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьЗагрузкуИзФайла", ЭтотОбъект);
	ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки,, АдресФайлаМакета);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВФайл(Команда)
	Оповещение = Новый ОписаниеОповещения("СохранитьВФайлПродолжение", ЭтотОбъект);
	ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект);
	ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьИзменение(Команда)
	Оповещение = Новый ОписаниеОповещения("ЗавершитьИзменениеЗавершение", ЭтотОбъект);
	ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект);
	ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьВБуферОбмена(Команда)
	
	ДокументHTML = Элементы.ПолеHTML.Документ;
	ДокументHTML.defaultView.value_to_copy = ПолучитьЗначениеТекущейСтроки();
	Кнопка = ДокументHTML.getElementById("myb");
	Если Кнопка = Неопределено Тогда
		ПоказатьПредупреждение(,НСтр("ru = 'Выберите поле объекта, оператор или функцию.'"));
	Иначе
		Кнопка.onclick();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПосмотретьПечатнуюФорму(Команда)
	Оповещение = Новый ОписаниеОповещения("ПосмотретьПечатнуюФормуПродолжение", ЭтотОбъект);
	ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект);
	ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
КонецПроцедуры

&НаКлиенте
Процедура ПосмотретьПечатнуюФормуПродолжение(Результат, Контекст) Экспорт
	ПечатнаяФорма = ПолучитьПечатнуюФорму();
	АдресОбразца = ПечатнаяФорма.Ключ;
	Если АдресОбразца <> Неопределено Тогда
		ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресОбразца);
		ПараметрыОткрытияМакета.ПроизводитьПодготовкуМакета = Ложь;
		ПараметрыОткрытияМакета.СчитыватьХеш = Ложь;
		ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса();
		ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = НСтр("ru = 'Образец'")+" "+ СтрЗаменить(ТекущаяДата, ":", "_")+".docx";
		ОткрытьМакет(ПараметрыОткрытияМакета);
	КонецЕсли;
КонецПроцедуры


#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ПереместитьГруппуОператоровИФункций()
	Элементы.Переместить(Элементы.ГруппаОператорыИФункции, Элементы.СтраницаТонкийКлиент);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьРедакторПродолжение(Результат, ДополнительныеПараметры) Экспорт
	ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета);
	ПараметрыОткрытияМакета.ПроизводитьПодготовкуМакета = Ложь;
	ПараметрыОткрытияМакета.СчитыватьХеш = Истина;
	ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = ИмяФайлаМакета;
	ОткрытьМакет(ПараметрыОткрытияМакета);
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьРедактируемыйФайлМакета(ОповещениеПродолжения, ОповещениеОшибки)
	Если ПутьКФайлуМакета = "" Тогда
		ВыполнитьОбработкуОповещения(ОповещениеПродолжения, Неопределено);
		Возврат;
	КонецЕсли;

	ПараметрыОповещения = Новый Структура("ОповещениеПродолжения, ОповещениеОшибки");
	ПараметрыОповещения.ОповещениеПродолжения = ОповещениеПродолжения;
	ПараметрыОповещения.ОповещениеОшибки = ОповещениеОшибки;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗагрузкеФайлаВХранилище", ЭтотОбъект, ПараметрыОповещения);
#Если ВебКлиент Тогда
	ЗапроситьРазрешенияДляПроверкиИЗагрузитьФайл(ОписаниеОповещения);
#Иначе
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ПараметрыЗагрузки.Интерактивно = Ложь;
	ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки, ПутьКФайлуМакета, АдресФайлаМакета);
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ЗапроситьРазрешенияДляПроверкиИЗагрузитьФайл(ОписаниеОповещенияПродолжения)
	
	ОбработчикПослеРазрешений = Новый ОписаниеОповещения("ПослеЗапросаРазрешенийДляПроверкиФайла", ЭтотОбъект, ОписаниеОповещенияПродолжения);
	
	МассивПомещаемыхФайлов = Новый Массив;
	МассивПомещаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлуМакета, АдресФайлаМакета));
	
	МассивВызовов = Новый Массив;
	Вызов = Новый Массив;
	Вызов.Добавить("НачатьПомещениеФайлов");
	Вызов.Добавить(МассивПомещаемыхФайлов);
	Вызов.Добавить(Неопределено);
	Вызов.Добавить(Ложь);
	Вызов.Добавить(УникальныйИдентификатор);
	МассивВызовов.Добавить(Вызов);
		
	Вызов = Новый Массив;
	Вызов.Добавить("НачатьУдалениеФайлов");
	Вызов.Добавить(ПутьКФайлуМакета);
	Вызов.Добавить("");
	Вызов.Добавить();
	МассивВызовов.Добавить(Вызов);

	НачатьЗапросРазрешенияПользователя(ОбработчикПослеРазрешений, МассивВызовов);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапросаРазрешенийДляПроверкиФайла(РазрешенияПолучены, ОписаниеОповещенияПродолжения) Экспорт
	Если Не РазрешенияПолучены Тогда
		Возврат;
	КонецЕсли;
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗагрузкеФайлаВХранилищеПроверкаЧтения", ЭтотОбъект, ОписаниеОповещенияПродолжения);
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ПараметрыЗагрузки.Интерактивно = Ложь;
	ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки, ПутьКФайлуМакета, АдресФайлаМакета);
КонецПроцедуры

//
// Параметры:
//  ПомещенныйФайл - Неопределено
//                 - Структура:   
//                                    * Хранение  - Строка
//                                    * Имя       - Строка
//
&НаКлиенте 
Процедура ПриЗагрузкеФайлаВХранилищеПроверкаЧтения(ПомещенныйФайл, ОписаниеОповещенияПродолжения) Экспорт
	Контекст = Новый Структура("ОписаниеОповещенияОкончания", ОписаниеОповещенияПродолжения);
	Контекст.Вставить("ЗагружаемыеФайлы", ПомещенныйФайл);
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПроверкиСуществования", ЭтотОбъект, Контекст);
	Файл = Новый Файл(ПомещенныйФайл.Имя);
	Файл.НачатьПроверкуСуществования(ОписаниеОповещения);
КонецПроцедуры


// Параметры:
//  Результат - Булево
//  Контекст - Структура: 
//               * ОписаниеОповещенияОкончания - ОписаниеОповещения
//               * ЗагружаемыеФайлы - см. ПриЗагрузкеФайлаВХранилищеПроверкаЧтения.ПомещенныйФайл
//
&НаКлиенте
Процедура ПослеПроверкиСуществования(Результат, Контекст) Экспорт
	ОписаниеНачатьПеремещениеФайла = Новый ОписаниеОповещения("ПослеПопыткиУдаления", ЭтотОбъект, Контекст, "ОшибкаУдаленияФайла", ЭтотОбъект);	
	Если Результат Тогда
		НачатьУдалениеФайлов(ОписаниеНачатьПеремещениеФайла, Контекст.ЗагружаемыеФайлы.Имя);  
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПопыткиУдаления(Контекст) Экспорт
	ПутьКФайлуМакета = "";
	СтруктураХраненияФайла = Новый Структура("Хранение", АдресФайлаМакета);
	ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияОкончания, СтруктураХраненияФайла);
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаУдаленияФайла(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	СтандартнаяОбработка = Ложь;
	ПредупредитьОБлокировкеИОткрытьПриложение();	
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаПриОткрытииФайла(Результат, Контекст) Экспорт
	ОткрытьФайлЗавершение(ПутьКФайлуМакета);	
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаПриЧтенииФайла(Результат, Контекст) Экспорт
	ОткрытьФайлЗавершение(ПутьКФайлуМакета);	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗагрузкеФайлаВХранилище(Файл, ПараметрыОповещения) Экспорт
	
	Если Файл <> Неопределено Тогда
		АдресФайлаМакета = Файл.Хранение;
		ВыполнитьОбработкуОповещения(ПараметрыОповещения.ОповещениеПродолжения, Неопределено);
	Иначе
		ВыполнитьОбработкуОповещения(ПараметрыОповещения.ОповещениеОшибки);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВФайлПродолжение(Результат, ДополнительныеПараметры) Экспорт
	
	Макет = МакетИзВременногоХранилища();
	ПодготовитьМакетКСохранению(Макет);
	АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет, УникальныйИдентификатор);
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Сохранение макета в файл'");
	ПараметрыСохранения.Диалог.Фильтр = НСтр("ru = 'Офисный документ'") + " (*.docx)|*.docx";
	ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, АдресМакетаВоВременномХранилище, ИмяДокумента, ПараметрыСохранения);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьИзменениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗагрузкеФайла", ЭтотОбъект);
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ПараметрыЗагрузки.Интерактивно = Не ЗначениеЗаполнено(ПутьКФайлуМакета);
	ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки, ПутьКФайлуМакета);
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьПродолжение(Результат, ДополнительныеПараметры) Экспорт
	
	Если ЭтоАдресВременногоХранилища(АдресФайлаМакета) Тогда
		Макет = МакетИзВременногоХранилища();
		ХешРедактируемогоМакета = ПолучитьХешМакета(Макет);
		ЗаписатьМакет(Макет);
		ОповеститьОЗаписиОфисногоДокумента();
	КонецЕсли;
	УстановитьЗаголовок();
	
КонецПроцедуры

// Параметры:
//  ПомещенныйФайл - см. ПриЗагрузкеФайлаВХранилищеПроверкаЧтения.ПомещенныйФайл
//
&НаКлиенте
Процедура ПродолжитьЗагрузкуИзФайла(ПомещенныйФайл, ДополнительныеПараметры) Экспорт
	
	Если ПомещенныйФайл = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	МассивИмени = СтрРазделить(ПомещенныйФайл.Имя, "\/");
	
	ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета);
	ПараметрыОткрытияМакета.ПроизводитьПодготовкуМакета = СодержитПараметры(АдресФайлаМакета);
	ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = МассивИмени[МассивИмени.ВГраница()];
	
	Модифицированность = МакетИзменен();
	ОткрытьМакет(ПараметрыОткрытияМакета);
	
КонецПроцедуры

&НаСервере
Функция СодержитПараметры(АдресМакета)
	Макет = ПолучитьИзВременногоХранилища(АдресМакета);
	ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(Макет);
	СтруктураДокумента = ДеревоМакета.СтруктураДокумента;
	ДеревоДокумента = СтруктураДокумента.ДеревоДокумента;
	УзелПараметра = УправлениеПечатьюСлужебный.НайтиУзелПоСодержимому(ДеревоДокумента, "w:textInput");
	Возврат УзелПараметра <> Неопределено;
КонецФункции

&НаСервере
Процедура ЗагрузитьОфисныйДокументИзМетаданных(Знач КодЯзыка = Неопределено)
	
	ТребуетсяПеревод = Ложь;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		
		Если ИдентификаторМакета = "" Тогда
			АдресФайлаМакета = ПоместитьВоВременноеХранилище(ПолучитьОбщийМакет("ПустойМакетDOCX"), УникальныйИдентификатор);
		Иначе
			АдресФайлаМакета = ПоместитьВоВременноеХранилище(МодульУправлениеПечатью.МакетПечатнойФормы(ИдентификаторМакета, КодЯзыка), УникальныйИдентификатор);
		КонецЕсли;
		
		Если ИдентификаторМакета <> "" И Не ЗначениеЗаполнено(СсылкаМакета) Тогда
			АдресПоставляемогоМакета = ПоместитьВоВременноеХранилище(МодульУправлениеПечатью.ПоставляемыйМакет(ИдентификаторМакета, КодЯзыка), УникальныйИдентификатор);
		КонецЕсли;
	КонецЕсли;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
		МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
		Если ЗначениеЗаполнено(КодЯзыка) Тогда
			ДоступныеЯзыкиТабличногоДокумента = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета);
			ТребуетсяПеревод = ДоступныеЯзыкиТабличногоДокумента.Найти(КодЯзыка) = Неопределено;
		КонецЕсли;
		
		Если КодЯзыка <> "" Тогда
			ЯзыкиМакета = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета);
			Модифицированность = Модифицированность Или (ЯзыкиМакета.Найти(КодЯзыка) = Неопределено);
		КонецЕсли;
		
		ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык);
		Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод;
		Элементы.КнопкаПоказатьОригинал.Видимость = Элементы.Перевести.Видимость;

		Элементы.ПеревестиВсеДействия.Видимость = Элементы.Перевести.Видимость;
		Элементы.КнопкаПоказатьОригиналВсеДействия.Видимость = Элементы.КнопкаПоказатьОригинал.Видимость;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОповеститьОЗаписиОфисногоДокумента()
	
	ПараметрыОповещения = СтандартныеПодсистемыКлиент.НовыйПараметрОповещенияЗаписиТабличногоДокумента();
	ПараметрыОповещения.ПутьКФайлу = ПутьКФайлуМакета;
	ПараметрыОповещения.ИмяОбъектаМетаданныхМакета = ИдентификаторМакета;
	ПараметрыОповещения.КодЯзыка = ТекущийЯзык;
	ПараметрыОповещения.Представление = ИмяДокумента;
	ПараметрыОповещения.ИсточникиДанных = ИсточникиДанных.ВыгрузитьЗначения();
	
	Если ЗаписьВыполнена Тогда
		ИмяСобытия = "Запись_ОфисныйДокумент";
	Иначе
		ИмяСобытия = "ОтменаРедактированияОфисногоДокумента";
	КонецЕсли;
	Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтотОбъект);
	
	ЗаписьВыполнена = Ложь;
	
КонецПроцедуры


&НаСервере
Процедура РазблокироватьНаСервере() 
	РазблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытиемОкончание(Результат, ДополнительныеПараметры) Экспорт
	
	Отказ = ДополнительныеПараметры.Отказ;
	
	Если ПовторноеЗакрытие <> Истина Тогда
		Модифицированность = Модифицированность Или МакетИзменен();
	КонецЕсли;
	ПовторноеЗакрытие = Истина;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
	ОписаниеЯзыка = ?(ЗначениеЗаполнено(ТекущийЯзык), " (" + ТекущийЯзык + ")", "");
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сохранить изменения в %1%2?'"), 
		ИмяДокумента, ОписаниеЯзыка);
	ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(ОписаниеОповещения, Отказ, Ложь, ТекстВопроса);
	
	Если Модифицированность Тогда
		Возврат;
	КонецЕсли;
	
	Если Не Отказ Тогда
		ОтказСохраненияИзменений = Истина;
		Закрыть();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция МакетИзменен()
	
	Макет = ПолучитьИзВременногоХранилища(АдресФайлаМакета);
	Если Макет <> Неопределено Тогда 	
		Хеширование = Новый ХешированиеДанных(ХешФункция.CRC32);
		Хеширование.Добавить(Макет);
		ХешТекущегоМакета =	Хеширование.ХешСумма;
		ВремяПроверкиМодифицированностиМакета = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Иначе
		ХешТекущегоМакета = ХешРедактируемогоМакета;
	КонецЕсли;
	
	Возврат ХешТекущегоМакета <> ХешРедактируемогоМакета;
КонецФункции 

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Не ОтказСохраненияИзменений И Не ЗаписьВыполнена Тогда
		МакетЗагружен = Истина;
		Макет = МакетИзВременногоХранилища();
		ЗаписатьМакет(Макет);
	КонецЕсли;
	Закрыть(Макет);
	
	Если Не ЭтоНовый() Тогда
		ОповеститьОЗаписиОфисногоДокумента();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОтобразитьИнструкцию()
	 
	Макет = ПолучитьОбщийМакет("ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen");
	ПолеДокументаИнструкции = Макет.ПолучитьТекст();
		
КонецПроцедуры

&НаКлиенте
Процедура ПодготовитьИнструкцию()
	
	Если Не СпрятатьЗонуПеретаскивания Тогда
		ПолеДокументаИнструкции = СтрЗаменить(ПолеДокументаИнструкции, ".thinclient{", ".webclient{");
	КонецЕсли;
	
КонецПроцедуры


&НаКлиенте
Процедура УстановитьВHTMLПоле(Значение)
	
	Если ЗначениеЗаполнено(Значение) Тогда
		Если ЭтоLinuxКлиент Тогда
			ТекстHTML = "<!DOCTYPE html>
						|
						|<html>
						|
						|<head>
						|    <title>%2</title>
						|    <style type=""text/css"">
						|        body {
						|            background: rgb(255, 255, 255);
						|            overflow-y: hidden;
						|            overflow-x: hidden;
						|        }
						|        
						|        .draggable {
						|            font-weight: normal;
						|            position: relative;
						|            display: block;
						|            border-color: rgb(253, 205, 143);
						|            border-style: dashed;
						|            border-radius: 10px;
						|            border-width: 4px;
						|        }
						|        
						|        .draggabletext {
						|            margin-left: 5px;
						|        }
        				|
						|        .draggabletab {
						|            font-size: xx-small;
						|        }
        				|
						|        .draggablebackground {
						|            position: absolute;
						|            top: 0;
						|            bottom: 0;
						|            z-index: -1;
						|            background-color: rgb(254, 242, 199);
						|            color: rgb(253, 205, 143);
						|            width: 100%%;
						|            height: 100%%;
						|            text-align: right;
						|        }
						|        
						|        .draggablebackgroundtest {
						|            position: absolute;
						|            color: rgb(253, 205, 143);
						|            width: 97%%;
						|            text-align: right;
						|        }
						|        
						|        .myButton {
						|            background-color: #ffec64;
						|            border-radius: 4px;
						|            float: none;
						|            position: absolute;
						|            bottom: 1%%;
						|            right: 1%%;
						|            display: none;
						|            background-color: rgb(254, 242, 199);
						|        }
						|    </style>
						|</head>
						|
						|<body style=""font-family:Arial, Helvetica, sans-serif;"">
						|    <div id=""field"" class=""draggable"" draggable=""true"" ondragstart=""onDragStart(event);"">
						|        <div class=""draggablebackground"">
						|            <Div class=""draggabletab""> <br></Div>
						|
						|            <div class=""draggablebackgroundtest"">
						|                %3
						|            </div>
						|        </div>
						|        <p>
						|            <div class=""draggabletext"">%1</div>
						|        </p>
						|    </div>
						|    <button id=""myb"" class=""myButton"" onclick=""copytext();"">%4</button>
						|    <script type=""text/javascript"">
						|    var value_to_copy = null;
						|        function onDragStart(event) {
						|            event
						|                .dataTransfer
						|                .setData('text/plain', value_to_copy);
						|        }
						|
        				|		function copytext() {
						|            var area = document.createElement('textarea');
						|
						|            document.body.appendChild(area);
						|            area.value = value_to_copy;
						|            area.select();
						|            document.execCommand(""copy"");
						|            document.body.removeChild(area);
						|        }
						|    </script>
						|</body>
						|
						|</html>";
		Иначе
			ТекстHTML = "<!DOCTYPE html>
						|<html>
						|
						|<head>
						|    <title>%2</title>
						|    <style type=""text/css"">
						|        body {
						|            background: rgb(255, 255, 255);
						|            overflow-y: hidden;
						|            overflow-x: hidden;
						|        }
						|
						|		  .draggable {
						|            font-weight: normal;
						|            position: relative;
						|            display: block;
						|            border-color: rgb(253, 205, 143);
						|            border-style: dashed;
						|            border-radius: 10px;
						|            border-width: 4px;
						|        }
						|        
						|        .draggabletext {
						|            margin-left:5px;
						|
						|        }
						|
						|        .draggablebackground {
						|            position: absolute;
						|            top: 0;
						|            bottom: 0;
						|            z-index: -1;
						|            background-color: rgb(254, 242, 199);
						|            color: rgb(253, 205, 143);
						|            width: 100%%;
						|            height: 100%;
						|            text-align: right;
						|        }
						|        .draggablebackgroundtest {
						|            position: absolute;
						|            top: 50%%;
						|            color: rgb(253, 205, 143);
						|            width: 97%%;
						|            text-align: right;
						|            transform: translateY(-50%%);
						|        }
						|
						|        .myButton {
						|
						|            background-color: #ffec64;
						|            border-radius: 4px;
						|            float: none;
						|            position: absolute;
						|            bottom: 1%%;
						|            right: 1%%;
						|            display: none;
						|			 background-color: rgb(254, 242, 199);
						|        }
						|    </style>
						|</head>
						|
						|<body style=""font-family:Arial, Helvetica, sans-serif;"">
						|    <div id=""field"" class=""draggable"" draggable=""true"" ondragstart=""onDragStart(event);"">
						|		<div class=""draggablebackground"">
	                    |       	<div class=""draggablebackgroundtest"">
	                    | 				%3
	                    |   	    </div>
	                    |    	</div>
	                    |    	<p><div class=""draggabletext"">%1</div></p>
						|    </div>
						|    <button id=""myb"" class=""myButton"" onclick=""copytext();"">%4</button>
						|    <script type=""text/javascript"">
						|    var value_to_copy = null;
						|        function onDragStart(event) {
						|            event
						|                .dataTransfer
						|                .setData('text/plain', value_to_copy);
						|        }
						|        function copytext() {
						|            var area = document.createElement('textarea');
						|
						|            document.body.appendChild(area);
						|            area.value = value_to_copy;
						|            area.select();
						|            document.execCommand(""copy"");
						|            document.body.removeChild(area);
						|        }
						|    </script>
						|</body>
						|
						|</html>";
		КонецЕсли;
									
	Иначе
		
		ТекстHTML = "<!DOCTYPE html>
					|
					|<html>
					|
					|<head>
					|    <title>%2</title>
					|    <style type=""text/css"">
					|        body {
					|            background: rgb(255, 255, 255);
					|            overflow-y: hidden;
					|            overflow-x: hidden;
					|        }
					|
					|        .draggable {
					|            font-weight: normal;
					|            position: relative;
					|            display: block;
					|            border-color: rgb(253, 205, 143);
					|            color: rgb(253, 205, 143);
					|            background-color: rgb(254, 242, 199);
					|            border-style: dashed;
					|            border-radius: 10px;
					|            border-width: 4px;
					|            font-size: large;
					|            text-align: center;
					|        }
					|        
					|    </style>
					|</head>
					|
					|<body style=""font-family:Arial, Helvetica, sans-serif;"">
					|    <div class=""draggable"">
					|        <p><b>%5</b></p>
					|    </div>
					|    
					|</body>
					|
					|</html>";
	КонецЕсли;
	
	ПолеHTML = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстHTML,
		СтрЗаменить(Значение, """", "&quot;"),
		НСтр("ru='Перенос текста'"),
		НСтр("ru='Перетащите<br> в редактор'"),
		НСтр("ru='Скопировать'"),
		НСтр("ru='Выберите поле'"));
	ПолеHTML = СтрЗаменить(ПолеHTML, "%%", "%");
КонецПроцедуры


&НаКлиенте
Процедура ПриЗагрузкеФайла(Файл, ДополнительныеПараметры) Экспорт
	
	МакетЗагружен = Файл <> Неопределено;
	Если МакетЗагружен Тогда
		АдресФайлаМакета = Файл.Хранение;
		ИмяФайлаМакета = Файл.Имя;
	КонецЕсли;
	
	ЗаписатьМакетИЗакрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьМакетИЗакрыть()
	Макет = Неопределено;
	Если МакетЗагружен Тогда
		Макет = МакетИзВременногоХранилища();
		ЗаписатьМакет(Макет);
		ЗаписьВыполнена = Истина;
	КонецЕсли;
	
	Закрыть(Макет);
КонецПроцедуры


&НаСервере
Функция МакетИзВременногоХранилища()
	Макет = ПолучитьИзВременногоХранилища(АдресФайлаМакета); 
	Возврат Макет;
КонецФункции

&НаСервере
Процедура ЗаписатьМакет(Макет)
	
	ПодготовитьМакетКСохранению(Макет);
	
	АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет, УникальныйИдентификатор);
	ОписаниеМакета = УправлениеПечатью.ОписаниеМакета();
	ОписаниеМакета.ИмяОбъектаМетаданныхМакета = ИдентификаторМакета;
	ОписаниеМакета.АдресМакетаВоВременномХранилище = АдресМакетаВоВременномХранилище;
	ОписаниеМакета.КодЯзыка = ТекущийЯзык;
	ОписаниеМакета.Наименование = ИмяДокумента;
	ОписаниеМакета.Ссылка = СсылкаМакета;
	ОписаниеМакета.ТипМакета = "DOCX";
	ОписаниеМакета.ИсточникиДанных = ИсточникиДанных.ВыгрузитьЗначения();
	
	ИдентификаторМакета = УправлениеПечатью.ЗаписатьМакет(ОписаниеМакета);
	Если Не ЗначениеЗаполнено(СсылкаМакета) Тогда
		СсылкаМакета = УправлениеПечатью.СсылкаМакета(ИдентификаторМакета);
	КонецЕсли;
	
	ЗаписатьМакетыНаДополнительныхЯзыках();
	
	Если Не Элементы.Язык.Доступность Тогда
		Элементы.Язык.Доступность  = Истина;
	КонецЕсли;
	
	СохраненныеЯзыкиМакета.Добавить(ТекущийЯзык);
	ЗаписьВыполнена = Истина;
	Модифицированность = Ложь;
	
КонецПроцедуры

&НаСервере
Процедура ЗаписатьМакетыНаДополнительныхЯзыках()
	
	ПараметрыМакета = Новый Структура;
	ПараметрыМакета.Вставить("ИдентификаторКопируемогоМакета", ИдентификаторКопируемогоМакета);
	ПараметрыМакета.Вставить("ТекущийЯзык", ТекущийЯзык);
	ПараметрыМакета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	ПараметрыМакета.Вставить("ИдентификаторМакета", ИдентификаторМакета);
	ПараметрыМакета.Вставить("ВладелецМакета", ВладелецМакета);
	ПараметрыМакета.Вставить("ИмяДокумента", ИмяДокумента);
	ПараметрыМакета.Вставить("СсылкаМакета", СсылкаМакета);
	ПараметрыМакета.Вставить("ТипМакета", "DOCX");
	
	УправлениеПечатью.ЗаписатьМакетыНаДополнительныхЯзыках(ПараметрыМакета);
	
КонецПроцедуры

&НаСервере
Процедура ПодготовитьМакетКСохранению(Макет)
	ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(Макет);
	СоответствиеЗамен = Новый Соответствие();
	Для Каждого ПараметрТекста Из ДеревоМакета.СтруктураДокумента.ПараметрыТекста Цикл
		ПараметрТекстаКлюч = ПараметрТекста;
		ЗаменитьПредставленияПараметров(ПараметрТекста);
		СоответствиеЗамен.Вставить(ПараметрТекстаКлюч, ПараметрТекста);
	КонецЦикла;
	ПараметрыЗаполненияОбласти = УправлениеПечатью.ПараметрыЗаполненияОбласти();
	ПараметрыЗаполненияОбласти.ДобавлятьСвязи = Ложь;
	УправлениеПечатью.УстановитьПараметры(ДеревоМакета, СоответствиеЗамен, ПараметрыЗаполненияОбласти);
	Адрес = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета);
	Макет = ПолучитьИзВременногоХранилища(Адрес);
		
КонецПроцедуры

&НаСервере
Процедура ПодготовитьМакетКОткрытию(Макет, ЗаполнитьАдресФайлаМакета = Ложь)
	ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(Макет);
	СтруктураДокумента = ДеревоМакета.СтруктураДокумента;
	ДеревоДокумента = СтруктураДокумента.ДеревоДокумента;
	УправлениеПечатью.КонвертироватьПараметры(ДеревоДокумента);
	Для Каждого Колонтитул Из СтруктураДокумента.Колонтитулы Цикл
		УправлениеПечатью.КонвертироватьПараметры(Колонтитул.Значение);
	КонецЦикла;
	
	СоответствиеЗамен = Новый Соответствие();
	Для Каждого ПараметрТекста Из ДеревоМакета.СтруктураДокумента.ПараметрыТекста Цикл
		ПараметрТекстаКлюч = ПараметрТекста;
		ЗаменитьПараметрыПредставлениями(ПараметрТекста);
		СоответствиеЗамен.Вставить(ПараметрТекстаКлюч, ПараметрТекста);
	КонецЦикла;
	
	ПараметрыЗаполненияОбласти = УправлениеПечатью.ПараметрыЗаполненияОбласти();
	ПараметрыЗаполненияОбласти.ДобавлятьСвязи = Ложь;
	УправлениеПечатью.УстановитьПараметры(ДеревоМакета, СоответствиеЗамен, ПараметрыЗаполненияОбласти);
	Если ЗаполнитьАдресФайлаМакета Тогда
		Адрес = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета, АдресФайлаМакета);
	Иначе
		Адрес = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета);
	КонецЕсли;
	
	Макет = ПолучитьИзВременногоХранилища(Адрес);
КонецПроцедуры

&НаСервере
Процедура ЗаменитьПараметрыПредставлениями(Строка)
	
	ПараметрыЗамены = ПредставленияПараметровТекста(Строка(Строка));
	
	Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены);
	
КонецПроцедуры

&НаСервере
Функция ПредставленияПараметровТекста(Знач Текст)
	
	Результат = Новый Соответствие();
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Возврат МодульУправлениеПечатью.ПредставленияПараметровТекста(Текст, ЭтотОбъект);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ЗаменитьПредставленияПараметров(Строка)
	
	ПараметрыЗамены = ФормулыИзТекста(Строка(Строка));
	
	Для Каждого Параметр Из ПараметрыЗамены Цикл
		Формула = Параметр.Ключ;
		Если СтрЧислоВхождений(Формула, "[") > 1 Тогда
			Формула = Сред(Формула, 2, СтрДлина(Формула) - 2);
		КонецЕсли;		
		
		ТекстОшибки = КонструкторФормулСлужебный.ПроверитьФормулу(ЭтотОбъект, Формула);
			
		Если ЗначениеЗаполнено(ТекстОшибки) Тогда
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки);
		КонецЕсли;
	КонецЦикла;
	
	Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены);
	
КонецПроцедуры

&НаСервере
Функция ЗаменитьВСтроке(Знач Строка, ПараметрыЗамены)
	
	Для Каждого Элемент Из ПараметрыЗамены Цикл
		ПодстрокаПоиска = Элемент.Ключ;
		ПодстрокаЗамены = Элемент.Значение;
		Строка = СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены);
	КонецЦикла;
	
	Возврат Строка;
	
КонецФункции

&НаСервере
Функция ФормулыИзТекста(Знач Текст)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Возврат МодульУправлениеПечатью.ФормулыИзТекста(Текст, ЭтотОбъект);
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Процедура УстановитьНачальныеНастройкиФормы()
			
	УстановитьИмяДокумента();
	УстановитьЗаголовок();
	НастроитьПредставлениеКоманд();

КонецПроцедуры

&НаКлиенте
Процедура УстановитьИмяДокумента()

	Если ПустаяСтрока(ИмяДокумента) Тогда
		ИспользованныеИмена = Новый Массив;
		Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтотОбъект);
		
		Индекс = 1;
		Пока ИспользованныеИмена.Найти(ИмяНовогоДокумента() + Индекс) <> Неопределено Цикл
			Индекс = Индекс + 1;
		КонецЦикла;
		
		ИмяДокумента = ИмяНовогоДокумента() + Индекс;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Функция ИмяНовогоДокумента()
	Возврат НСтр("ru = 'Новый'");
КонецФункции

&НаКлиенте
Функция ПолучитьПараметрыОткрытияМакета(АдресДокумента)
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("АдресДокумента", АдресДокумента);
	ПараметрыОткрытия.Вставить("ПроизводитьПодготовкуМакета", Истина);
	ПараметрыОткрытия.Вставить("СчитыватьХеш", Ложь);
	ПараметрыОткрытия.Вставить("ИмяФайлаДляОткрытия", "");
	ПараметрыОткрытия.Вставить("ТолькоПросмотр", РедактированиеЗапрещено);
	Возврат ПараметрыОткрытия;
КонецФункции

&НаКлиенте
Процедура ОткрытьМакет(ПараметрыОткрытия)

	ОбработчикЗавершения = Новый ОписаниеОповещения("ОткрытьПослеСохранениеУКлиента", ЭтотОбъект, ПараметрыОткрытия);

	Макет = ПолучитьИзВременногоХранилища(ПараметрыОткрытия.АдресДокумента);
	
	Если ПараметрыОткрытия.ПроизводитьПодготовкуМакета Тогда
		ПодготовитьМакетКОткрытию(Макет, ПараметрыОткрытия.АдресДокумента = АдресФайлаМакета);
	КонецЕсли;
	
	Если ПараметрыОткрытия.СчитыватьХеш Тогда
		ХешРедактируемогоМакета = ПолучитьХешМакета(Макет);
	КонецЕсли;

	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
	ДополнительныеПараметры.Вставить("ВременныйКаталог", ВременныйКаталог);
	ПослеПодключенияРасширения = Новый ОписаниеОповещения("ПослеПодключенияРасширения", ЭтотОбъект, ДополнительныеПараметры);
	ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(ПослеПодключенияРасширения);
	
	Элементы.ОткрытьРедактор.КнопкаПоУмолчанию = Ложь;
	Элементы.ЗаписатьИЗакрыть.КнопкаПоУмолчанию = Истина;
	
	Элементы.ПолеДокументаИнструкции.Видимость = Ложь;
	Элементы.ОтобразитьИнструкцию.Пометка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт
	Если Подключено Тогда
		Обработчик = Новый ОписаниеОповещения("ОткрытьМакетПослеПолученияВременногоКаталога", ЭтотОбъект, ДополнительныеПараметры.ОбработчикЗавершения);
		Если ВременныйКаталог = "" Тогда
#Если ВебКлиент Тогда
			ФайловаяСистемаКлиент.ВыбратьКаталог(Обработчик);	
#Иначе
			ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Обработчик);
#КонецЕсли
		Иначе
			ВыполнитьОбработкуОповещения(Обработчик, ВременныйКаталог);
		КонецЕсли;
	Иначе
		Обработчик = Новый ОписаниеОповещения("ПослеЗапросаРазрешенийНаОткрытиеМакета", ЭтотОбъект, ДополнительныеПараметры);
		ВыполнитьОбработкуОповещения(Обработчик);
	КонецЕсли;
КонецПроцедуры

// Параметры:
//  СозданныйВременныйКаталог - Строка.
//  ОбработчикЗавершения - ОписаниеОповещения.
//
&НаКлиенте
Процедура ОткрытьМакетПослеПолученияВременногоКаталога(СозданныйВременныйКаталог, ОбработчикЗавершения) Экспорт
	ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
		СозданныйВременныйКаталог);
	
	ПараметрыОткрытия = ОбработчикЗавершения.ДополнительныеПараметры;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
	Контекст.Вставить("ВременныйКаталог", ВременныйКаталог);
	
	ОбработчикПослеРазрешений = Новый ОписаниеОповещения("ПослеЗапросаРазрешенийНаОткрытиеМакета", ЭтотОбъект, Контекст);
	
	МассивПолучаемыхФайлов = Новый Массив;
	МассивПолучаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ВременныйКаталог+ПараметрыОткрытия.ИмяФайлаДляОткрытия,ПараметрыОткрытия.АдресДокумента));
	
	МассивВызовов = Новый Массив;
	Вызов = Новый Массив;
	Вызов.Добавить("НачатьПолучениеФайлов");
	Вызов.Добавить(МассивПолучаемыхФайлов);
	Вызов.Добавить(ВременныйКаталог);
	Вызов.Добавить(Ложь);
	МассивВызовов.Добавить(Вызов);
		
	Вызов = Новый Массив;
	Вызов.Добавить("НачатьЗапускПриложения");
	Вызов.Добавить(ВременныйКаталог+ПараметрыОткрытия.ИмяФайлаДляОткрытия);
	Вызов.Добавить();
	Вызов.Добавить(Ложь);
	МассивВызовов.Добавить(Вызов);
	
	НачатьЗапросРазрешенияПользователя(ОбработчикПослеРазрешений, МассивВызовов);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапросаРазрешенийНаОткрытиеМакета(РазрешенияПолучены, Контекст) Экспорт
	
	Если РазрешенияПолучены = Ложь Тогда
		Возврат;
	КонецЕсли;
	
	ОбработчикПослеРазрешений = Контекст.ОбработчикЗавершения; // ОписаниеОповещения
	ВременныйКаталог = Контекст.ВременныйКаталог;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	
#Если ВебКлиент Тогда
		ПараметрыСохранения.Интерактивно = Истина;
#Иначе
		ПараметрыСохранения.Интерактивно = Ложь;
#КонецЕсли

	ПараметрыОткрытия = ОбработчикПослеРазрешений.ДополнительныеПараметры;		
	ФайловаяСистемаКлиент.СохранитьФайл(ОбработчикПослеРазрешений, ПараметрыОткрытия.АдресДокумента, ВременныйКаталог+ПараметрыОткрытия.ИмяФайлаДляОткрытия, ПараметрыСохранения);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПослеСохранениеУКлиента(ПолученныеФайлы, ПараметрыОткрытия) Экспорт

	Если ПолученныеФайлы <> Неопределено Тогда		
		ПутьКФайлу = ПолученныеФайлы[0].ПолноеИмя;
		
		Если ПараметрыОткрытия.АдресДокумента = АдресФайлаМакета Тогда
			ПутьКФайлуМакета = ПутьКФайлу;
		КонецЕсли;
		
		ФайлНаДиске = Новый Файл(ПутьКФайлу);
		ОписаниеПослеУстановкиТолькоЧтения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПутьКФайлу);
		ФайлНаДиске.НачатьУстановкуТолькоЧтения(ОписаниеПослеУстановкиТолькоЧтения, ПараметрыОткрытия.ТолькоПросмотр);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФайлЗавершение(ПутьКФайлу) Экспорт		
	ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
	ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу,,,ПараметрыОткрытияФайла);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьХешМакета(АдресИлиДанные)
	Хеширование = Новый ХешированиеДанных(ХешФункция.CRC32);
	Если ТипЗнч(АдресИлиДанные) = Тип("Строка") 
		И ЭтоАдресВременногоХранилища(АдресИлиДанные) Тогда
		
		Хеширование.Добавить(ПолучитьИзВременногоХранилища(АдресИлиДанные));
	Иначе
		Хеширование.Добавить(АдресИлиДанные);
	КонецЕсли;
	Возврат Хеширование.ХешСумма;
КонецФункции

&НаКлиенте
Процедура МинимизироватьИнтерфейс()
	
	МинимизироватьИнтерфейсНаСервере();
	ОбновитьИнтерфейс();
	ВернутьИнтерфейсНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура МинимизироватьИнтерфейсНаСервере()
	ТекущиеНастройкиИнтерфейса = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения");
	АдресНастройкиПанелей = ПоместитьВоВременноеХранилище(ТекущиеНастройкиИнтерфейса, УникальныйИдентификатор);
	
	НастройкиСостава = Новый НастройкиСоставаИнтерфейсаКлиентскогоПриложения;
	НастройкиИнтерфейса = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
	НастройкиИнтерфейса.УстановитьСостав(НастройкиСостава);
	ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", , НастройкиИнтерфейса);
	
КонецПроцедуры

&НаКлиенте
Процедура ВернутьИнтерфейс()
	
	ОбновитьИнтерфейс();
	
КонецПроцедуры

&НаСервере
Процедура ВернутьИнтерфейсНаСервере()
	
	Если ЭтоАдресВременногоХранилища(АдресНастройкиПанелей) Тогда
		НастройкиИнтерфейса = ПолучитьИзВременногоХранилища(АдресНастройкиПанелей);
		ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", , НастройкиИнтерфейса);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьЗаголовок()
	
	Заголовок = ИмяДокумента;
	
	Если ЗначениеЗаполнено(ТекущийЯзык) Тогда 
		ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок; 
		Заголовок = Заголовок + " ("+ТекущийЯзыкПредставление+")";
	КонецЕсли;
	
	Если ЭтоНовый() Тогда
		Заголовок = Заголовок + " (" + НСтр("ru = 'создание'") + ")";
	ИначеЕсли РедактированиеЗапрещено Тогда
		Заголовок = Заголовок + " (" + НСтр("ru = 'только просмотр'") + ")";
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция ЭтоНовый()
	Возврат Не ЗначениеЗаполнено(Параметры.Ссылка) И ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу);
КонецФункции

&НаКлиенте
Процедура ПриВыбореФорматаПоля(Формат, ДополнительныеПараметры) Экспорт
	
	Если Формат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекущиеДанные.Формат = Формат;
	ТекущиеДанные.Образец = Формат(ТекущиеДанные.Значение, ТекущиеДанные.Формат);
	
	ЗаполнитьПолеHTMLПоТекущемуПолю();
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПереключитьЯзык(Команда)
	
	Если ЭтоНовый() Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыДляПродолжения = Новый Структура("Команда", Команда);
	Оповещение = Новый ОписаниеОповещения("ПереключитьЯзыкПослеЗагрузкиФайлаПродолжение", ЭтотОбъект, ПараметрыДляПродолжения);
	ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект);
	ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт
	
	ЗагрузитьОфисныйДокументИзМетаданных(КодЯзыка);
	Если ТребуетсяПеревод И ДоступенАвтоматическийПеревод Тогда
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Макет еще не переведен на %1 язык.
			|Выполнить автоматический перевод?'"), Элементы.Язык.Заголовок);
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'"));
		Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'"));
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект);
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);
	Иначе
		ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета);
		ПараметрыОткрытияМакета.СчитыватьХеш = Истина;
		ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = ИмяФайлаМакета;
		ОткрытьМакет(ПараметрыОткрытияМакета);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьЯзыкПослеЗагрузкиФайлаПродолжение(Результат, ДополнительныеПараметры) Экспорт
	
	Модифицированность = Модифицированность ИЛИ МакетИзменен();
	
	ПараметрыДляПродолжения = Новый Структура("Команда", ДополнительныеПараметры.Команда);
	ОписаниеОповещения = Новый ОписаниеОповещения("ПереключитьЯзыкПродолжение", ЭтотОбъект, ПараметрыДляПродолжения);
	
	Если Модифицированность Тогда
		ОписаниеЯзыка = ?(ЗначениеЗаполнено(ТекущийЯзык), " (" + ТекущийЯзык + ")", "");
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сохранить изменения в %1%2?'"), ИмяДокумента, ОписаниеЯзыка);
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, ,
			КодВозвратаДиалога.Да);
	Иначе
		ВыполнитьОбработкуОповещения(ОписаниеОповещения, КодВозвратаДиалога.Нет);
	КонецЕсли;
			
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьЯзыкПродолжение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
	
		Макет = МакетИзВременногоХранилища();
		ЗаписатьМакет(Макет);
		
		Модифицированность = Ложь;
	ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
		Модифицированность = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент");
		МодульУправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, ДополнительныеПараметры.Команда);
		УстановитьЗаголовок();
		Элементы.УдалитьЯзыкМакета.Видимость = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка();
		Элементы.КнопкаПоказатьОригинал.Доступность = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка();
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЯзыкМакета(Команда)
	
	Если ТекущийЯзык = ОбщегоНазначенияКлиент.КодОсновногоЯзыка() Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЯзыкМакетаПродолжение", ЭтотОбъект, , "ОшибкаПеремещенияУдаленияФайла", ЭтотОбъект);
	НачатьУдалениеФайлов(ОписаниеОповещения, ПутьКФайлуМакета);
	
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаПеремещенияУдаленияФайла(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
	СтандартнаяОбработка = Ложь;
	ПредупредитьОБлокировкеИОткрытьПриложение();	
КонецПроцедуры

&НаКлиенте
Процедура ПредупредитьОБлокировкеИОткрытьПриложение()
	ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПутьКФайлуМакета);
	ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Завершите работу с файлом в другом приложении.'"), , НСтр("ru = 'Файл открыт в другом приложении'"));
КонецПроцедуры

&НаСервере
Процедура УдалитьМакетНаТекущемЯзыке()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МодульУправлениеПечатью.УдалитьМакет(ИдентификаторМакета, ТекущийЯзык);
	КонецЕсли;
	
	МенюЯзык = Элементы.Язык;
	ДобавляемыеЯзыки = Элементы.ДобавляемыеЯзыки;
	ЯзыкУдаляемойФормы = ТекущийЯзык;
	ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка();
	Для Каждого КнопкаЯзыка Из МенюЯзык.ПодчиненныеЭлементы Цикл
		Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда
			КнопкаЯзыка.Пометка = Ложь;
			КнопкаЯзыка.Видимость = Ложь;
		КонецЕсли;
		
		Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ТекущийЯзык) Тогда
			КнопкаЯзыка.Пометка = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого КнопкаДобавляемогоЯзыка Из ДобавляемыеЯзыки.ПодчиненныеЭлементы Цикл
		Если СтрЗаканчиваетсяНа(КнопкаДобавляемогоЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда
			КнопкаДобавляемогоЯзыка.Видимость = Истина;
		КонецЕсли;
	КонецЦикла;
	
	МенюЯзыкВсеДействия = Элементы.ЯзыкВсеДействия;
	ДобавляемыеЯзыкиВсеДействия = Элементы.ДобавляемыеЯзыкиВсеДействия;
	Для Каждого КнопкаЯзыка Из МенюЯзыкВсеДействия.ПодчиненныеЭлементы Цикл
		Если ТипЗнч(КнопкаЯзыка) = Тип("КнопкаФормы") Тогда
			Если СтрЗаканчиваетсяНа(КнопкаЯзыка.ИмяКоманды, ЯзыкУдаляемойФормы) Тогда
				КнопкаЯзыка.Пометка = Ложь;
				КнопкаЯзыка.Видимость = Ложь;
			КонецЕсли;
			
			Если СтрЗаканчиваетсяНа(КнопкаЯзыка.ИмяКоманды, ТекущийЯзык) Тогда
				КнопкаЯзыка.Пометка = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого КнопкаДобавляемогоЯзыка Из ДобавляемыеЯзыкиВсеДействия.ПодчиненныеЭлементы Цикл
		Если ТипЗнч(КнопкаДобавляемогоЯзыка) = Тип("КнопкаФормы") Тогда
			Если СтрЗаканчиваетсяНа(КнопкаДобавляемогоЯзыка.ИмяКоманды, ЯзыкУдаляемойФормы) Тогда
				КнопкаДобавляемогоЯзыка.Видимость = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Элементы.Язык.Заголовок = Элементы["Язык_"+ТекущийЯзык].Заголовок;
	Элементы.ЯзыкВсеДействия.Заголовок = Элементы["Язык_"+ТекущийЯзык].Заголовок;
	
	ЗагрузитьОфисныйДокументИзМетаданных(ТекущийЯзык);
	ПодготовленныйМакет = ПолучитьИзВременногоХранилища(АдресФайлаМакета);
	
	ПодготовитьМакетКОткрытию(ПодготовленныйМакет);
	ПоместитьВоВременноеХранилище(ПодготовленныйМакет, АдресФайлаМакета);
	ХешРедактируемогоМакета = ПолучитьХешМакета(АдресФайлаМакета);
	ВремяПроверкиМодифицированностиМакета =	ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	
	Модифицированность = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЯзыкМакетаПродолжение(ДополнительныеПараметры) Экспорт
	ПутьКФайлуМакета = "";
	УдалитьМакетНаТекущемЯзыке();

	ЗаписьВыполнена = Истина;
	ОповеститьОЗаписиОфисногоДокумента();

	Элементы.УдалитьЯзыкМакета.Видимость = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка();
	Элементы.КнопкаПоказатьОригинал.Доступность = Ложь;
	УстановитьЗаголовок();
КонецПроцедуры

&НаКлиенте
Процедура ПриОтветеНаВопросОПереводеМакета(Ответ, ДополнительныеПараметры) Экспорт
	
	ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета);
	ПараметрыОткрытияМакета.СчитыватьХеш = Истина;
	ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = ИмяФайлаМакета;
	
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		ОткрытьМакет(ПараметрыОткрытияМакета);
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииПроверкиНастроекПеревода", ЭтотОбъект, ПараметрыОткрытияМакета);
		МодульПереводТекстаНаДругиеЯзыкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПереводТекстаНаДругиеЯзыкиКлиент");
		МодульПереводТекстаНаДругиеЯзыкиКлиент.ПроверитьНастройки(ЭтотОбъект, ОписаниеОповещения);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗавершенииПроверкиНастроекПеревода(НастройкаВыполнена, ПараметрыОткрытияМакета) Экспорт
	
	Если Не НастройкаВыполнена Тогда
		Возврат;
	КонецЕсли;
	
	ПеревестиТекстыМакета();
	ОткрытьМакет(ПараметрыОткрытияМакета);
	
КонецПроцедуры

&НаСервере
Процедура ПеревестиТекстыМакета()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
		МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
		МодульУправлениеПечатьюМультиязычность.ПеревестиТекстыОфисногоДокумента(АдресФайлаМакета, ТекущийЯзык, ОбщегоНазначения.КодОсновногоЯзыка());
		
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры


#Область КонструкторПечатныхФорм

&НаСервере
Процедура ПодобратьОбразец(ОбъектМетаданных)
	
	ТекстЗапроса =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка
	|ИЗ
	|	&Таблица КАК ПсевдонимЗаданнойТаблицы
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка УБЫВ";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Таблица", ОбъектМетаданных.ПолноеИмя());
	Запрос = Новый Запрос(ТекстЗапроса);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Образец = Выборка.Ссылка;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура РасширитьСписокПолей()
	
	ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Образец", Новый ОписаниеТипов, ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Формат", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ФорматПоУмолчанию", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("КнопкаНастройкиФормата", Новый ОписаниеТипов("Число"), ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов, ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Общее", Новый ОписаниеТипов("Булево"), ИмяСпискаПолей()));
	
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	СписокПолей = Элементы[ИмяСпискаПолей()];
	СписокПолей.Шапка = Истина;
	СписокПолей.УстановитьДействие("ПриАктивизацииСтроки", "Подключаемый_ДоступныеПоляПриАктивизацииСтроки");
	
	ИмяКолонкиПредставление = КонструкторФормулСлужебный.ИмяКолонкиПредставление(ИмяСпискаПолей());
	
	КолонкаПредставление = Элементы[ИмяКолонкиПредставление];
	КолонкаПредставление.Заголовок = НСтр("ru = 'Поле'");
	
	КолонкаОбразец = Элементы.Добавить(ИмяСпискаПолей() + "Образец", Тип("ПолеФормы"), СписокПолей);
	КолонкаОбразец.ПутьКДанным = ИмяСпискаПолей() + "." + "Образец";
	КолонкаОбразец.Вид = ВидПоляФормы.ПолеВвода;
	КолонкаОбразец.Заголовок = НСтр("ru = 'Образец'");
	КолонкаОбразец.УстановитьДействие("ПриИзменении", "Подключаемый_ОбразецПриИзменении");
	КолонкаОбразец.ОтображатьВПодвале = Ложь;
	
	КнопкаНастройкиФормата = Элементы.Добавить(ИмяСпискаПолей() + "КнопкаНастройкиФормата", Тип("ПолеФормы"), СписокПолей);
	КнопкаНастройкиФормата.ПутьКДанным = ИмяСпискаПолей() + "." + "КнопкаНастройкиФормата";
	КнопкаНастройкиФормата.Вид = ВидПоляФормы.ПолеКартинки;
	КнопкаНастройкиФормата.ОтображатьВШапке = Истина;
	КнопкаНастройкиФормата.КартинкаШапки = БиблиотекаКартинок.ПараметрыВыводаКомпоновкиДанных;	
	КнопкаНастройкиФормата.КартинкаЗначений = БиблиотекаКартинок.ПараметрыВыводаКомпоновкиДанных;	
	КнопкаНастройкиФормата.Заголовок = НСтр("ru = 'Настройка формата'");
	КнопкаНастройкиФормата.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
	КнопкаНастройкиФормата.ГиперссылкаЯчейки = Истина;
	КнопкаНастройкиФормата.ОтображатьВПодвале = Ложь;
		
	УстановитьПримерыЗначений();
	УстановитьФорматЗначенийПоУмолчанию();
	НастроитьПолеОбразец();
	ОтметитьОбщиеПоля();
	
	Для Каждого ЭлементОформления Из УсловноеОформление.Элементы Цикл
		Для Каждого ОформляемоеПоле Из ЭлементОформления.Поля.Элементы Цикл
			Если ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "Представление") Тогда
				ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
				ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "Образец");
				ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
				ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "КнопкаНастройкиФормата");
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	// Цвет полей, не являющихся общими для выбранных объектов
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей());
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + ".Общее");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);	
	
КонецПроцедуры

&НаСервере
Функция ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей, Результат = Неопределено)
	
	Если Результат = Неопределено Тогда
		Результат = Новый Массив;
	КонецЕсли;
	
	Для Каждого Элемент Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		Если Не ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда
			Продолжить;
		КонецЕсли;
		Результат.Добавить(Элемент.ПутьКДанным);
		ЗаполнитьСписокОтображаемыхПолей(Элемент, Результат);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура УстановитьПримерыЗначений(КоллекцияПолей = Неопределено, ДанныеПечати = Неопределено)
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		Возврат;
	КонецЕсли;
	
	МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");

	Если КоллекцияПолей = Неопределено Тогда
		КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()];
	КонецЕсли;
	
	Если ДанныеПечати = Неопределено Тогда
		Если Не ЗначениеЗаполнено(Образец) Тогда
			Возврат;
		КонецЕсли;
		Объекты = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Образец);
		ОтображаемыеПоля = ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей);
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
			Попытка
				ДанныеПечати = МодульУправлениеПечатью.ДанныеПечати(Объекты, ОтображаемыеПоля, ТекущийЯзык);
			Исключение
				РазблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования, УникальныйИдентификатор);
				ВызватьИсключение ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			КонецПопытки;
			ПолучитьСообщенияПользователю(Истина);
		Иначе
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	МодульУправлениеПечатью.УстановитьПримерыЗначений(КоллекцияПолей, ДанныеПечати, Образец);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьФорматЗначенийПоУмолчанию(КоллекцияПолей = Неопределено)
	
	Если КоллекцияПолей = Неопределено Тогда
		КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()];
	КонецЕсли;
	
	Для Каждого Элемент Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		Если Не ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Элемент.ФорматПоУмолчанию) Тогда
			Элемент.ФорматПоУмолчанию = ФорматПоУмолчанию(Элемент.Тип);
		КонецЕсли;
		
		Элемент.Формат = Элемент.ФорматПоУмолчанию;
		
		Если ЗначениеЗаполнено(Элемент.Формат) Тогда
			Элемент.Образец = Формат(Элемент.Образец, Элемент.Формат);
		Иначе
			Элемент.КнопкаНастройкиФормата = -1;
		КонецЕсли;
			
		УстановитьФорматЗначенийПоУмолчанию(Элемент);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ФорматПоУмолчанию(ОписаниеТипов)
	
	Формат = "";
	Если ОписаниеТипов.Типы().Количество() <> 1 Тогда
		Возврат Формат;
	КонецЕсли;
	
	Тип = ОписаниеТипов.Типы()[0];
	
	Если Тип = Тип("Число") Тогда
		Формат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'ЧЦ=%1; ЧДЦ=%2'"),
			ОписаниеТипов.КвалификаторыЧисла.Разрядность,
			ОписаниеТипов.КвалификаторыЧисла.РазрядностьДробнойЧасти);
	ИначеЕсли Тип = Тип("Дата") Тогда
		Если ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
			Формат = НСтр("ru = 'ДЛФ=D'");
		Иначе
			Формат = НСтр("ru = 'ДЛФ=DT'");
		КонецЕсли;
	ИначеЕсли Тип = Тип("Булево") Тогда
		Формат = НСтр("ru = 'БЛ=Нет; БИ=Да'");
	КонецЕсли;
	
	Возврат Формат;
	
КонецФункции

&НаСервере
Функция ВладелецМакета()
	
	Если ЗначениеЗаполнено(ВладелецМакета) Тогда
		Возврат ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецМакета);
	КонецЕсли;
	
	ПутьКМакету = ИдентификаторМакета;
	
	ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина);
	Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если ЧастиПути.Количество() <> 3 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЧастиПути.Удалить(ЧастиПути.ВГраница());
	ИмяОбъекта = СтрСоединить(ЧастиПути, ".");
	
	Если ПустаяСтрока(ИмяОбъекта) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта);
	
КонецФункции

&НаСервереБезКонтекста
Функция КоллекцииПолей(ИсточникиДанных, ПараметрыРедактирования)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Попытка
			Возврат МодульУправлениеПечатью.КоллекцииПолейИсточниковДанных(ИсточникиДанных);
		Исключение
			РазблокироватьДанныеДляРедактирования(ПараметрыРедактирования.КлючОбъектаРедактирования, ПараметрыРедактирования.УникальныйИдентификатор);
			ВызватьИсключение ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		КонецПопытки
	КонецЕсли;

	Возврат Новый Массив;
	
КонецФункции

&НаКлиенте
Процедура ПриВыбореИмениМакета(НовоеИмяМакета, ДополнительныеПараметры) Экспорт
	
	Если НовоеИмяМакета = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ИмяДокумента <> НовоеИмяМакета Тогда
		Модифицированность = Истина;
		ИмяДокумента = НовоеИмяМакета;
		УстановитьЗаголовок();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция СписокОператоров()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
				
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		
		ДополнительныеПоля = Новый Структура;
		
		ОписаниеДополнительногоПоля = Новый Структура("Представление, Тип");
		ОписаниеДополнительногоПоля.Представление = НСтр("ru = 'Начало условия'");
		ОписаниеДополнительногоПоля.Тип = Новый ОписаниеТипов("Булево");
		ДополнительныеПоля.Вставить("НачалоОбласти", ОписаниеДополнительногоПоля);
		
		ОписаниеДополнительногоПоля = Новый Структура("Представление, Тип");
		ОписаниеДополнительногоПоля.Представление = НСтр("ru = 'Окончание условия'");
		ОписаниеДополнительногоПоля.Тип = Новый ОписаниеТипов("Булево");
		ДополнительныеПоля.Вставить("ОкончаниеОбласти", ОписаниеДополнительногоПоля);
		
		
		ОписаниеГруппыДополнительныхПолей = Новый Структура("Представление, Порядок, Картинка");
		ОписаниеГруппыДополнительныхПолей.Вставить("Элементы", ДополнительныеПоля);
		ОписаниеГруппыДополнительныхПолей.Представление = НСтр("ru = 'Условный вывод'");
		ОписаниеГруппыДополнительныхПолей.Порядок = 7;
		
		ГруппыДополнительныхПолей = Новый Структура;
		ГруппыДополнительныхПолей.Вставить("УсловныйВывод", ОписаниеГруппыДополнительныхПолей);
		
		Возврат МодульУправлениеПечатью.СписокОператоров(ГруппыДополнительныхПолей);
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Функция ИмяТегаУсловие()
	Возврат УправлениеПечатьюКлиентСервер.ИмяТегаУсловие();
КонецФункции

#Область ПодключаемыйСписокПолей

&НаКлиенте
Процедура Подключаемый_СписокПолейПередРазворачиванием(Элемент, Строка, Отказ)
	
	КонструкторФормулКлиент.СписокПолейПередРазворачиванием(ЭтотОбъект, Элемент, Строка, Отказ);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РазвернутьТекущийЭлементСпискаПолей()
	
	КонструкторФормулКлиент.РазвернутьТекущийЭлементСпискаПолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения) Экспорт // АПК:78 - вызывается из КонструкторФормулКлиент
	
	ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения)
	
	КонструкторФормул.ЗаполнитьСписокДоступныхПолей(ЭтотОбъект, ПараметрыЗаполнения);

	ТекущиеДанные = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ПараметрыЗаполнения.ИдентификаторСтроки);
	УстановитьПримерыЗначений(ТекущиеДанные);
	УстановитьФорматЗначенийПоУмолчанию(ТекущиеДанные);
	Если (ТекущиеДанные.Папка Или ТекущиеДанные.Таблица) И ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		ОтметитьОбщиеПоля(ТекущиеДанные);
	Иначе
		УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ТекущиеДанные);
	КонецЕсли;		
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СписокПолейНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	Реквизит = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	
	Если Реквизит.Папка Или Реквизит.Таблица 
		И Не СтрНачинаетсяС(Реквизит.ПутьКДанным, "ОбщиеРеквизиты.") Тогда
		Выполнение = Ложь;
		Возврат;
	КонецЕсли;
	
	ПараметрыПеретаскивания.Значение = "[" + Реквизит.ПредставлениеПутиКДанным + "]";

	Если Элемент = Элементы[ИмяСпискаПолей()]
		И ЗначениеЗаполнено(Реквизит.Формат) И Реквизит.Формат <> Реквизит.ФорматПоУмолчанию Тогда
		
		ПараметрыПеретаскивания.Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			"[Формат(%1, %2)]", ПараметрыПеретаскивания.Значение, """" + Реквизит.Формат + """");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	
	КонструкторФормулКлиент.СтрокаПоискаИзменениеТекстаРедактирования(ЭтотОбъект, Элемент, Текст, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьПоискВСпискеПолей()
	
	ВыполнитьПоискВСпискеПолей();
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПоискВСпискеПолей()
	
	КонструкторФормул.ВыполнитьПоискВСпискеПолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	
	КонструкторФормулКлиент.СтрокаПоискаОчистка(ЭтотОбъект, Элемент, СтандартнаяОбработка);
	
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры)

	КонструкторФормул.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры);
	Если ДополнительныеПараметры.КлючОперации = "ОбработатьСообщениеПоиска" Тогда
		ОтметитьОбщиеПоля();
		УстановитьФорматЗначенийПоУмолчанию();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбработчикКонструктораФормулКлиент(Параметр, ДополнительныеПараметры = Неопределено) Экспорт  // АПК:78 Процедура вызывается из КонструкторФормулКлиент.НачатьПоискВСпискеПолей
		
	КонструкторФормулКлиент.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры);
	Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.ВыполнитьНаСервере Тогда
		Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_НачатьПоискВСпискеПолей()

	КонструкторФормулКлиент.НачатьПоискВСпискеПолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ИмяСпискаПолей()
	
	Возврат "ДоступныеПоля";
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяСпискаОператоров()
	
	Возврат "СписокОператоров";
	
КонецФункции

#КонецОбласти


#Область ДополнительныеОбработчикиПодключаемыхСписков

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриАктивизацииСтроки(Элемент)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;

	Если ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ПодсказкаВводаСтрокиПоискаСпискаПолей();
	Иначе
		Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ТекущиеДанные.ПредставлениеПутиКДанным;
	КонецЕсли;
	
	ЗаполнитьПолеHTMLПоТекущемуПолю();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПолеHTMLПоТекущемуПолю()
	
	Значение = ПолучитьЗначениеТекущейСтроки();
	
	УстановитьВHTMLПоле(Значение);
	
КонецПроцедуры

&НаКлиенте
Функция ПолучитьЗначениеТекущейСтроки()
	ТекущаяСтрока = Элементы[ИмяСпискаПолей()].ТекущаяСтрока; 	
	Реквизит = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ТекущаяСтрока);
	
	Если Реквизит.Папка Или Реквизит.Таблица 
		И Не СтрНачинаетсяС(Реквизит.ПутьКДанным, "ОбщиеРеквизиты.") Тогда
		Возврат "";
	КонецЕсли;
	
	Значение = "[" + Реквизит.ПредставлениеПутиКДанным + "]";

	Если ТекущийЭлемент = Элементы[ИмяСпискаПолей()]
		И ЗначениеЗаполнено(Реквизит.Формат) И Реквизит.Формат <> Реквизит.ФорматПоУмолчанию Тогда
		
		Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			"[Формат(%1, %2)]", Значение, """" + Реквизит.Формат + """");
	КонецЕсли;
	
	Возврат Значение;
	
КонецФункции

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПередНачаломИзменения(Элемент, Отказ)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	ТекущиеДанные.Образец = ТекущиеДанные.Значение;
	ПолеВвода = Элементы[ИмяСпискаПолей() + "Образец"];
	ВыбранноеПоле = КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаПолей());
	ПолеВвода.ОграничениеТипа = ВыбранноеПоле.Тип;
	
КонецПроцедуры

// Параметры:
//  Элемент - ТаблицаФормы
//  ВыбраннаяСтрока - Число
//  Поле - ПолеФормы
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_СписокПолейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Поле.Имя = Элемент.Имя + "Представление" Тогда
		СтандартнаяОбработка = Ложь;
		ВыбранноеПоле = КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект);
		Если ЗначениеЗаполнено(ТекущееЗначение) Тогда
			ТекущееЗначение = СокрП(ТекущееЗначение) + " ";
		Иначе
			ТекущееЗначение = "";
		КонецЕсли;
		Если Элемент.Имя = ИмяСпискаПолей() Тогда
			ТекущееЗначение = ТекущееЗначение + "[" + ВыбранноеПоле.ПредставлениеПутиКДанным + "]";
		Иначе
			ТекущееЗначение = ТекущееЗначение + КонструкторФормулКлиент.ВыражениеДляВставки(ВыбранноеПоле);
		КонецЕсли;
	КонецЕсли;
	
	Если Поле = Элементы[ИмяСпискаПолей() + "КнопкаНастройкиФормата"] Тогда
		СтандартнаяОбработка = Ложь;
		Конструктор = Новый КонструкторФорматнойСтроки(Элементы[ИмяСпискаПолей()].ТекущиеДанные.Формат);
		Конструктор.ДоступныеТипы = Элементы[ИмяСпискаПолей()].ТекущиеДанные.Тип;
		ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореФорматаПоля", ЭтотОбъект);
		Конструктор.Показать(ОписаниеОповещения);
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СписокПолейАктивизацияСтроки(Элемент)
	
	Оператор = КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров());
	
	Если ЗначениеЗаполнено(Оператор.Родитель) Тогда
		ГруппаОператоров = Оператор.Родитель; // см. КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей
		ИмяГруппыОператоров = ГруппаОператоров.Имя;
		
		Если ИмяГруппыОператоров = "УсловныйВывод" Тогда
			Если Оператор.Имя = "НачалоОбласти" Тогда
				УстановитьВHTMLПоле(СтрШаблон("{%1 *текст условия*}", ИмяТегаУсловие()));
			ИначеЕсли Оператор.Имя = "ОкончаниеОбласти" Тогда
				УстановитьВHTMLПоле(СтрШаблон("{/%1}", ИмяТегаУсловие()));
			КонецЕсли;
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	УстановитьВHTMLПоле(КонструкторФормулКлиент.ВыражениеДляВставки(Оператор));
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОператорыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	Оператор = КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров());
	
	Если ЗначениеЗаполнено(Оператор.Родитель) Тогда
		ГруппаОператоров = Оператор.Родитель; // см. КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей
		ИмяГруппыОператоров = ГруппаОператоров.Имя;
		
		Если ИмяГруппыОператоров = "УсловныйВывод" Тогда
			Если Оператор.Имя = "НачалоОбласти" Тогда
				ПараметрыПеретаскивания.Значение = "{v8 Условие *текст условия*}";
			ИначеЕсли Оператор.Имя = "ОкончаниеОбласти" Тогда
				ПараметрыПеретаскивания.Значение = "{/v8 Условие}";
			КонецЕсли;
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	ПараметрыПеретаскивания.Значение = КонструкторФормулКлиент.ВыражениеДляВставки(Оператор);
	
	Если Оператор.ПутьКДанным = "УправлениеПечатью_КоличествоСтрок" Тогда
		ПредставлениеТекущейТаблицы = ПредставлениеТекущейТаблицы();
		Выполнение = ПредставлениеТекущейТаблицы <> Неопределено;
		ПараметрыПеретаскивания.Значение = СтрЗаменить(ПараметрыПеретаскивания.Значение, "()", "(["+ПредставлениеТекущейТаблицы+"])");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	Если ЗначениеЗаполнено(ТекущиеДанные.Формат) Тогда
		ТекущиеДанные.Образец = Формат(ТекущиеДанные.Значение, ТекущиеДанные.Формат);
	КонецЕсли;

	Если ТекущиеДанные.ПутьКДанным = "Ссылка" Тогда
		Образец = ТекущиеДанные.Образец;
	КонецЕсли;
	ПодключитьОбработчикОжидания("ПриИзмененииОбразца", 0.1,  Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбразецПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	ТекущиеДанные.Значение = ТекущиеДанные.Образец;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииОбразца()

	ПриИзмененииОбразцаНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
	
	УстановитьПримерыЗначений();
		
КонецПроцедуры

#КонецОбласти

#КонецОбласти


&НаКлиентеНаСервереБезКонтекста
Функция ПодсказкаВводаСтрокиПоискаСпискаПолей()
	
	Возврат НСтр("ru = 'Найти поле...'");
	
КонецФункции

&НаСервере
Функция ПолучитьПечатнуюФорму()
	
	Ссылки = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Образец);
	ОбъектыПечати = Новый СписокЗначений;
	Макет = ПолучитьИзВременногоХранилища(АдресФайлаМакета);
	ПодготовитьМакетКСохранению(Макет);
	ПараметрыПечати = Новый Структура;
		
	ОфисныеДокументы = УправлениеПечатью.СформироватьОфисныйДокумент(Макет, Ссылки, ОбъектыПечати, КодЯзыка, ПараметрыПечати);
	Если ОфисныеДокументы.Количество() > 0 Тогда
		Для Каждого ОфисныйДокумент Из ОфисныеДокументы Цикл
			Возврат ОфисныйДокумент;
		КонецЦикла;
	Иначе 
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Функция ПредставлениеТекущейТаблицы()
	Для Каждого ПодключенныйСписокПолей Из ЭтотОбъект["ПодключенныеСпискиПолей"] Цикл
		Если ПодключенныйСписокПолей.ИмяСпискаПолей <> ИмяСпискаОператоров() Тогда
			Если Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные <> Неопределено
				И Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.Таблица Тогда
					Возврат Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.ПредставлениеПутиКДанным;
			КонецЕсли;			
		КонецЕсли;
	КонецЦикла;	
	Возврат Неопределено;
КонецФункции

&НаКлиенте
Процедура НазначениеМакетаНажатие(Элемент)
	
	ПараметрыПодбора = СтандартныеПодсистемыКлиентСервер.ПараметрыВыбораОбъектовМетаданных();
	ПараметрыПодбора.ВыбранныеОбъектыМетаданных = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ИсточникиДанных);
	ПараметрыПодбора.ВыбиратьСсылки = Истина;
	ПараметрыПодбора.Заголовок = НСтр("ru = 'Назначение макета'");
	ПараметрыПодбора.ФильтрПоОбъектамМетаданных = ОбъектыСКомандамиПечати();
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореВладельцевМакета", ЭтотОбъект);
	СтандартныеПодсистемыКлиент.ВыбратьОбъектыМетаданных(ПараметрыПодбора, ОписаниеОповещения);

КонецПроцедуры

&НаКлиенте
Процедура ПриВыбореВладельцевМакета(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИсточникиДанных.ЗагрузитьЗначения(Результат.ВыгрузитьЗначения());
	Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных);
	ОбновитьСписокДоступныхПолей();
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеИсточниковДанных(ИсточникиДанных)
	
	Значения = Новый Массив;
	Для Каждого Элемент Из ИсточникиДанных Цикл
		Значения.Добавить(Элемент.Значение);
	КонецЦикла;
	
	Результат = СтрСоединить(Значения, ", ");
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Результат = "<" + НСтр("ru = 'не выбрано'") + ">";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция ОбъектыСКомандамиПечати()
	
	ОбъектыСКомандамиПечати = Новый СписокЗначений;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Для Каждого ОбъектМетаданных Из МодульУправлениеПечатью.ИсточникиКомандПечати() Цикл
			ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя());
		КонецЦикла;
	КонецЕсли;

	Возврат ОбъектыСКомандамиПечати;
	
КонецФункции

&НаСервере
Процедура ОбновитьСписокДоступныхПолей()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МодульУправлениеПечатью.ОбновитьСписокДоступныхПолей(ЭтотОбъект, 
			КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения(), ПараметрыРедактирования()), ИмяСпискаПолей());
		
		НастроитьПолеОбразец();
		ОтметитьОбщиеПоля();
		УстановитьФорматЗначенийПоУмолчанию();
			
		Если ИсточникиДанных.Количество() > 0 Тогда
			ИсточникДанных = ИсточникиДанных[0].Значение;
			ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных);
			ПодобратьОбразец(ОбъектМетаданных);
			УстановитьПримерыЗначений();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьПолеОбразец()

	КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()].ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева
	Смещение = 0;
	Для Каждого ОписаниеПоля Из КоллекцияПолей Цикл
		Если ОписаниеПоля.ПутьКДанным = "Ссылка" Тогда
			ОписаниеПоля.Заголовок = НСтр("ru = 'Образец'");
			Если Смещение <> 0 Тогда
				Индекс = КоллекцияПолей.Индекс(ОписаниеПоля);
				КоллекцияПолей.Сдвинуть(Индекс, Смещение);
			КонецЕсли;
			Прервать;
		КонецЕсли;
		Смещение = Смещение - 1;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ОбщиеПоляИсточниковДанных()
	
	ОбщиеПоляИсточниковДанных = Новый Массив;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		ОбщиеПоляИсточниковДанных = МодульУправлениеПечатью.ОбщиеПоляИсточниковДанных(ИсточникиДанных.ВыгрузитьЗначения());
	КонецЕсли;
	
	Возврат ОбщиеПоляИсточниковДанных;
	
КонецФункции

&НаСервере
Процедура ОтметитьОбщиеПоля(Знач КоллекцияПолей = Неопределено, Знач ОбщиеПоля = Неопределено)
	
	Если КоллекцияПолей = Неопределено Тогда
		КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()];
	КонецЕсли;
	
	Если ОбщиеПоля = Неопределено Тогда
		ОбщиеПоля = ОбщиеПоляИсточниковДанных();
	КонецЕсли;
	
	Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		Если ОписаниеПоля.Папка И ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты")
			Или ОписаниеПоля.ПолучитьРодителя() <> Неопределено И ОписаниеПоля.ПолучитьРодителя().Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты") Тогда
			ОписаниеПоля.Общее = Истина;
			УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля);
			Продолжить;
		КонецЕсли;
		
		Если ОбщиеПоля.Найти(ОписаниеПоля.Поле) <> Неопределено Тогда
			ОписаниеПоля.Общее = Истина;
			Если Не ОписаниеПоля.Папка И Не ОписаниеПоля.Таблица Тогда
				УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля);
			КонецЕсли;
		КонецЕсли;
		Если ОписаниеПоля.Общее И (ОписаниеПоля.Папка Или ОписаниеПоля.Таблица) Тогда
			ОтметитьОбщиеПоля(ОписаниеПоля, ОбщиеПоля);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(КоллекцияПолей)
	
	Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		ОписаниеПоля.Общее = КоллекцияПолей.Общее;
		УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьПредставлениеКоманд()
	
	Элементы.ЗаписатьИЗакрыть.Видимость = Не РедактированиеЗапрещено;
	Элементы.Закрыть.Видимость = РедактированиеЗапрещено;
	Элементы.Записать.Доступность = Не РедактированиеЗапрещено;
	Элементы.Перевести.Доступность = Не РедактированиеЗапрещено;
	Элементы.ПеревестиВсеДействия.Доступность = Элементы.Перевести.Доступность;
	Элементы.Переименовать.Доступность = Не РедактированиеЗапрещено;
	Элементы.УдалитьЯзыкМакета.Доступность = Не РедактированиеЗапрещено;
	Элементы.ЗагрузитьИзФайла.Доступность = Не РедактированиеЗапрещено;
	УстановитьДоступностьРекурсивно(Элементы.ДобавляемыеЯзыки, Не РедактированиеЗапрещено);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьРекурсивно(Элемент, Доступность = Неопределено)
	Если Доступность = Неопределено Тогда
		Доступность = Элемент.Доступность;
	КонецЕсли;
	
	Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
		Если ТипЗнч(ПодчиненныйЭлемент) = Тип("КнопкаФормы") И ПодчиненныйЭлемент.ИмяКоманды <> "" Тогда
			ПодчиненныйЭлемент.Доступность = Доступность;
		КонецЕсли;
		
		Если ТипЗнч(ПодчиненныйЭлемент) = Тип("ГруппаФормы") Тогда
			УстановитьДоступностьРекурсивно(ПодчиненныйЭлемент, Доступность);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ПараметрыРедактирования()
	Результат = Новый Структура;
	Результат.Вставить("КлючОбъектаРедактирования", КлючОбъектаРедактирования);
	Результат.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	Возврат Результат;
КонецФункции

#КонецОбласти



