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

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

&НаКлиенте
Перем ПолучательПеретаскиваемогоЗначения, АдресПараметровДляОбработкиОжидания;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

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

	Элементы.ГруппаНазначениеМакета.Видимость = ЭтоПечатнаяФорма;
	Элементы.ГруппаНазначениеМакета.Доступность = Параметры.ДоступноНазначение;
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ТабличныйДокументПриАктивизации(Элемент)
	ОбновитьПометкиКнопокКоманднойПанели();
	СинхронизироватьОбластьПросмотраМакетов();
	ПодключитьОбработчикОжидания("ОчиститьПодсветку", 0.1, Истина);
	ПодключитьОбработчикОжидания("ОбновитьОбластьНастройкиВыбранныхЯчеек", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПоставляемыйМакетПриАктивизации(Элемент)
	
	СинхронизироватьОбластьПросмотраМакетов();
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ФорматСохраненияВыгрузкиОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

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

// Действия с документом

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

&НаКлиенте
Процедура Записать(Команда)
	ЗаписатьТабличныйДокумент();
	ОповеститьОЗаписиТабличногоДокумента();
КонецПроцедуры

&НаКлиенте
Процедура Редактирование(Команда)
	Элементы.ТабличныйДокумент.Редактирование = Не Элементы.ТабличныйДокумент.Редактирование;
	НастроитьПредставлениеКоманд();
	НастроитьОтображениеТабличногоДокумента();
КонецПроцедуры

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

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

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

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

// Форматирование

&НаКлиенте
Процедура УвеличитьРазмерШрифта(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Размер = Область.Шрифт.Размер;
		Размер = Размер + ШагИзмененияРазмераШрифтаУвеличение(Размер);
		Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); // АПК:1345 - Применение стиля не требуется.
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УменьшитьРазмерШрифта(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Размер = Область.Шрифт.Размер;
		Размер = Размер - ШагИзмененияРазмераШрифтаУменьшение(Размер);
		Если Размер < 1 Тогда
			Размер = 1;
		КонецЕсли;
		Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); // АПК:1345 - Применение стиля не требуется.
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура Зачеркивание(Команда)
	
	УстанавливаемоеЗначение = Неопределено;
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Если УстанавливаемоеЗначение = Неопределено Тогда
			УстанавливаемоеЗначение = Не Область.Шрифт.Зачеркивание = Истина;
		КонецЕсли;
		Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,,,УстанавливаемоеЗначение); // АПК:1345 - Применение стиля не требуется.
	КонецЦикла;
	
	ОбновитьПометкиКнопокКоманднойПанели();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьВыводКолонтитула(Колонтитул)
	Колонтитул.Выводить = Не ПустаяСтрока(Колонтитул.ТекстСлева) Или Не ПустаяСтрока(Колонтитул.ТекстСправа) Или Не ПустаяСтрока(Колонтитул.ТекстВЦентре);
	Колонтитул.НачальнаяСтраница = 1;	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьОтображениеТабличногоДокумента()
	Элементы.ТабличныйДокумент.ОтображатьЗаголовки = Элементы.ТабличныйДокумент.Редактирование;
	Элементы.ТабличныйДокумент.ОтображатьСетку = Элементы.ТабличныйДокумент.Редактирование;
КонецПроцедуры

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

&НаКлиенте
Функция ШагИзмененияРазмераШрифтаУвеличение(Размер)
	Если Размер = -1 Тогда
		Возврат 10;
	КонецЕсли;
	
	Если Размер < 10 Тогда
		Возврат 1;
	ИначеЕсли 10 <= Размер И  Размер < 20 Тогда
		Возврат 2;
	ИначеЕсли 20 <= Размер И  Размер < 48 Тогда
		Возврат 4;
	ИначеЕсли 48 <= Размер И  Размер < 72 Тогда
		Возврат 6;
	ИначеЕсли 72 <= Размер И  Размер < 96 Тогда
		Возврат 8;
	Иначе
		Возврат Окр(Размер / 10);
	КонецЕсли;
КонецФункции

&НаКлиенте
Функция ШагИзмененияРазмераШрифтаУменьшение(Размер)
	Если Размер = -1 Тогда
		Возврат -8;
	КонецЕсли;
	
	Если Размер <= 11 Тогда
		Возврат 1;
	ИначеЕсли 11 < Размер И Размер <= 23 Тогда
		Возврат 2;
	ИначеЕсли 23 < Размер И Размер <= 53 Тогда
		Возврат 4;
	ИначеЕсли 53 < Размер И Размер <= 79 Тогда
		Возврат 6;
	ИначеЕсли 79 < Размер И Размер <= 105 Тогда
		Возврат 8;
	Иначе
		Возврат Окр(Размер / 11);
	КонецЕсли;
КонецФункции

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

&НаКлиенте
Процедура ЗакрытьФормуПослеЗаписиТабличногоДокумента(Закрывать, ДополнительныеПараметры) Экспорт
	Если Закрывать Тогда
		Закрыть();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьТабличныйДокумент(ОбработчикЗавершения = Неопределено, ОсвободитьФайл = Ложь)

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

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

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

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

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

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

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

&НаКлиенте
Функция ОписаниеФайла(ПолноеИмя)
	
	ПозицияРазделителя = СтрНайти(ПолноеИмя, ПолучитьРазделительПути(), НаправлениеПоиска.СКонца);
	
	Имя = Сред(ПолноеИмя, ПозицияРазделителя + 1);
	Путь = Лев(ПолноеИмя, ПозицияРазделителя);
	
	ПозицияРасширения = СтрНайти(Имя, ".", НаправлениеПоиска.СКонца);
	
	ИмяБезРасширения = Лев(Имя, ПозицияРасширения - 1);
	Расширение = Сред(Имя, ПозицияРасширения + 1);
	
	Результат = Новый Структура;
	Результат.Вставить("ПолноеИмя", ПолноеИмя);
	Результат.Вставить("Имя", Имя);
	Результат.Вставить("Путь", Путь);
	Результат.Вставить("ИмяБезРасширения", ИмяБезРасширения);
	Результат.Вставить("Расширение", Расширение);
	
	Возврат Результат;
	
КонецФункции
	
&НаКлиенте
Функция ИмяНовогоДокумента()
	Возврат НСтр("ru = 'Новый'");
КонецФункции

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

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

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

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

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

&НаСервере
Процедура ОбновитьТабличныйДокумент(Знач ЗагруженныйТабличныйДокумент)
	ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ЗагруженныйТабличныйДокумент);
КонецПроцедуры

// Параметры:
//  ТабличныйДокумент - ТабличныйДокумент - входной и выходной параметр.
//  ЗагруженныйТабличныйДокумент - ТабличныйДокумент
//
&НаСервереБезКонтекста
Процедура ЗаполнитьТабличныйДокумент(ТабличныйДокумент, Знач ЗагруженныйТабличныйДокумент)
	Для НомерСтроки = 1 По ЗагруженныйТабличныйДокумент.ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По ЗагруженныйТабличныйДокумент.ШиринаТаблицы Цикл
			ИсходнаяЯчейка = ЗагруженныйТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
			Если ИсходнаяЯчейка.Заполнение <> ТипЗаполненияОбластиТабличногоДокумента.Текст Тогда
				ТабличныйДокумент = ЗагруженныйТабличныйДокумент;
				Возврат;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	ТабличныйДокумент.Очистить();
	ТабличныйДокумент.Вывести(ЗагруженныйТабличныйДокумент);
	
	
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева;
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре;
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа;
	ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстСлева;
	ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре;
	ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстСправа;
	
	ТаблицаОбластей = ТаблицаОбластей(ЗагруженныйТабличныйДокумент);
	Для Каждого ТекущаяОбласть Из ТаблицаОбластей Цикл
		
		Область = ТабличныйДокумент.Области.Найти(ТекущаяОбласть.Имя);
		Если Область = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента")
			И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки
			Или ТипЗнч(Область) = Тип("РисунокТабличногоДокумента") Тогда
				КопируемаяОбласть = ЗагруженныйТабличныйДокумент.Области.Найти(Область.Имя);
				Если КопируемаяОбласть = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				Область.ПараметрРасшифровки = КопируемаяОбласть.ПараметрРасшифровки;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура УдалитьЯзыкМакета(Команда)
	
	УдалитьМакетНаТекущемЯзыке();

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

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

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

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

&НаКлиенте
Процедура ПриЗавершенииПеревода(ПереведенныйТабличныйДокумент, ДополнительныеПараметры) Экспорт
	
	Если ТипЗнч(ПереведенныйТабличныйДокумент) = Тип("ТабличныйДокумент") Тогда
		ТабличныйДокумент = ПереведенныйТабличныйДокумент;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ЗавершениеИзменитьШрифт(Шрифт, Параметры) Экспорт

	Если Шрифт = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	ТекущаяОбласть.Шрифт = Шрифт;
	Модифицированность = Истина;
		
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеИзменитьЦветГраницы(Цвет, Параметры) Экспорт
	
	УстановитьЦвет("ЦветРамки", Цвет);
	
КонецПроцедуры


&НаКлиенте
Процедура ЗавершениеИзменитьЦветТекста(Цвет, Параметры) Экспорт
	
	УстановитьЦвет("ЦветТекста", Цвет);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеИзменитьЦветФона(Цвет, Параметры) Экспорт
	
	УстановитьЦвет("ЦветФона", Цвет);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеВыбораЦвета(Цвет, ИмяПоля) Экспорт
	УстановитьЦвет(ИмяПоля, Цвет);
КонецПроцедуры

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

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

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

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

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

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

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

		ОбластьСтрок = ТабличныйДокумент.Область(Область.Верх, , Область.Верх + 6);
		ОбластьСтрок.СоздатьФорматСтрок();
		
		ОбластьШтампа = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх + 6, Область.Лево + 1);
		ОбластьШтампа.Имя = ПодобратьИмяОбласти(ТабличныйДокумент, "ШтампЭП");
		
		ОбластьШтампа = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх + 6, Область.Лево);
		ОбластьШтампа.ШиринаКолонки = 10;
		ОбластьШтампа = ТабличныйДокумент.Область(Область.Верх, Область.Лево + 1, Область.Верх + 6, Область.Лево + 1);
		ОбластьШтампа.ШиринаКолонки = 30;
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	Если ВыбранноеПоле.Имя = "QRКод" Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ТабличныйДокумент, ВыбранноеПоле.Имя);
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Расположить(Область);
		Рисунок.Высота = 40;
		Рисунок.Ширина = 40;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		Рисунок.Картинка = БиблиотекаКартинок["МестоДляQRКода"];
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	Если ВыбранноеПоле.Имя = "КартинкаШтрихкода" Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ТабличныйДокумент, ВыбранноеПоле.Имя);
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Расположить(Область);
		Рисунок.Высота = 25.93;
		Рисунок.Ширина = 37.29;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		Рисунок.Картинка = БиблиотекаКартинок["МестоДляШтрихкода"];
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	ЭтоПрисоединенныйФайл = ВыбранноеПоле.Тип.Типы().Количество() = 1
		И ТипыПрисоединенныхФайлов.СодержитТип(ВыбранноеПоле.Тип.Типы()[0]);
		
	Если ЭтоПрисоединенныйФайл Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ТабличныйДокумент, "Рисунок");
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Картинка = БиблиотекаКартинок["МестоДляКартинки"];
		Рисунок.Расположить(Область);
		Рисунок.Высота = 20;
		Рисунок.Ширина = 20;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

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

	Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Массив")
		Или ПараметрыПеретаскивания.Значение.Количество() <> 1 
		Или Не ПараметрыПеретаскивания.Значение[0].Таблица Тогда
		Возврат;
	КонецЕсли;
	
	КоличествоКолонок = ПараметрыПеретаскивания.Значение[0].Элементы.Количество();
	Если КоличествоКолонок = 0 Тогда
		ШиринаОбласти = ?(Область.Лево > 1, 2, 1);
		Область = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх, Область.Лево + ШиринаОбласти - 1);
		Элемент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	Область = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх + 1, Область.Лево + КоличествоКолонок - 1);
	Элемент.ТекущаяОбласть = Область;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОчиститьФормат(Команда)
	
	ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	ОчиститьФорматОбласти(ТекущаяОбласть);
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьФорматОбласти(Область)
	
	Область.Шрифт = Неопределено;
	Область.ЦветРамки = ЦветПоУмолчанию();
	Область.ЦветТекста = ЦветПоУмолчанию();
	Область.ЦветУзора = ЦветПоУмолчанию();
	Область.ЦветФона = ЦветПоУмолчанию();
	Область.ВертикальноеПоложение = Неопределено;
	Область.ВертикальноеПоложениеКартинки = Неопределено;
	Область.ГоризонтальноеПоложение = Неопределено;
	Область.ГоризонтальноеПоложениеКартинки = Неопределено;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЦветПоУмолчанию()
	Возврат Новый Цвет;
КонецФункции

&НаСервере
Процедура УстановитьПримерыЗначений(КоллекцияПолей = Неопределено, ДанныеПечати = Неопределено)

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбновитьОбластьНастройкиВыбранныхЯчеек()
	ОбновитьПолеВводаЗначенияТекущейЯчейки();
КонецПроцедуры

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

	Элементы.ПовторятьВНачалеСтраницы.Пометка = Не Элементы.ПовторятьВНачалеСтраницы.Пометка;
	ТекущаяОбласть.НачалоСтраницы = Элементы.ПовторятьВНачалеСтраницы.Пометка;
	
КонецПроцедуры

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

	Элементы.ПовторятьВКонцеСтраницы.Пометка = Не Элементы.ПовторятьВКонцеСтраницы.Пометка;
	ТекущаяОбласть.КонецСтраницы = Элементы.ПовторятьВКонцеСтраницы.Пометка;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекущееЗначениеПриИзменении(Элемент)
	
	ОбновитьТекстВОбластиЯчеек();
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Функция ПодготовитьМакетДляЗаписи(УстановитьКодЯзыка = Истина, Отказ = Ложь)

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

&НаСервереБезКонтекста
Процедура ПроверитьЯчейкиОбъединены(Знач Область, Знач НомерСтроки, Знач НомерКолонки, Отказ)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Шаблон = НСтр("ru = 'Объединение ячеек запрещено (стр. %1 кол. %2)'");
		ИдентификаторОбласти = МодульУправлениеПечатью.ИдентификаторОбласти(Область);
		МассивАдреса = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИдентификаторОбласти, ":");
		
		Если МассивАдреса[0] <> МассивАдреса[2]
		 ИЛИ МассивАдреса[1] <> МассивАдреса[3] Тогда
			
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				НомерСтроки,
				НомерКолонки);
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьИмяПоляDBF(Знач ТекстЯчейки, Знач НомерСтроки, Знач НомерКолонки, Отказ)
	
	Если СтрДлина(ТекстЯчейки) > 10 Тогда
		
		Шаблон = НСтр("ru = 'Имя поля не может превышать 10 знаков (стр. %1 кол. %2)'");
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			Шаблон,
			НомерСтроки, 
			НомерКолонки);
		ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
		
	КонецЕсли;
	
	ДопустимыеСимволы = "0123456789_";
	Для Индекс = 1 По СтрДлина(ТекстЯчейки) Цикл
		
		Символ = Сред(ТекстЯчейки, Индекс, 1);
		Если СтрНайти(ДопустимыеСимволы, Символ) <> 0 Тогда
			Продолжить;
		КонецЕсли;
		
		КодСимвола = КодСимвола(Символ);
		
		ПервыйСимволЛатиницыВРег = 65;
		ПоследнийСимволЛатиницыВРег = 90;
		ПервыйСимволЛатиницыНРег = 97;
		ПоследнийСимволЛатиницыНРег = 122;
		
		ОшибкаКодаСимвола = ((КодСимвола < ПервыйСимволЛатиницыВРег)
						 Или (КодСимвола > ПоследнийСимволЛатиницыВРег 
						    И КодСимвола < ПервыйСимволЛатиницыНРег)
						 Или (КодСимвола > ПоследнийСимволЛатиницыНРег));
		Если ОшибкаКодаСимвола Тогда
			
			Шаблон = НСтр("ru = 'Имена полей могут содержать только латинские буквы, цифры и символ подчеркивания (стр. %1 кол. %2)'");
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				НомерСтроки,
				НомерКолонки);
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
			Прервать;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаСервереБезКонтекста
Функция ТекстСоответствуетТребованиямКИменам(Знач Текст, ЭтоXML = Истина, ЗапрещеннаяПодстрока = Неопределено)
	
	Результат = Новый Структура;
	Результат.Вставить("СодержитЗапрещеннуюПодстроку", Ложь);
	Результат.Вставить("СоответствуетТребованиямКИменам", Истина);
	
	Если ЭтоXML Тогда
		ШаблонВыражения = "^[\p{L}_]+[\w.-]*$";
	Иначе
		ШаблонВыражения = "^[\p{L}_]\w*$";
	КонецЕсли;
	
	Если ЗапрещеннаяПодстрока <> Неопределено Тогда
		
		ДлинаЗапрещеннойПодстроки = СтрДлина(ЗапрещеннаяПодстрока);
		КоличествоСимволов = Мин(СтрДлина(СокрЛП(Текст)), ДлинаЗапрещеннойПодстроки);
		ПроверяемаяПодстрока = Лев(СокрЛП(Текст), КоличествоСимволов);
		Результат.СодержитЗапрещеннуюПодстроку = (НРег(ПроверяемаяПодстрока) = НРег(ЗапрещеннаяПодстрока));
		
	КонецЕсли;
	
	Выражение = Текст;
	РезультатВыражения = СтрНайтиПоРегулярномуВыражению(Выражение, ШаблонВыражения);
	Результат.СоответствуетТребованиямКИменам = (РезультатВыражения.Длина <> 0);
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Процедура ПроверитьСимволыЯчейки(Знач ТекстЯчейки, Знач НомерСтроки, Знач НомерКолонки, Знач ЭтоXML, Отказ)
	
	ЗапрещеннаяПодстрока = Неопределено;
	Если ЭтоXML Тогда
		
		ШаблонНеСоответствуетТребованиям = НСтр("ru = 'Имя поля ""%1"" не соответствует требованиям к именам токенов XML (стр. %2 кол. %3)'");
		ЗапрещеннаяПодстрока = "xml";
		
	Иначе
		
		ШаблонНеСоответствуетТребованиям = НСтр("ru = 'Имя поля ""%1"" не соответствует требованиям к именам переменных (стр. %2 кол. %3)'");
		
	КонецЕсли;
	
	РезультатПроверки = ТекстСоответствуетТребованиямКИменам(ТекстЯчейки, ЭтоXML, ЗапрещеннаяПодстрока);
	
	Если РезультатПроверки.СодержитЗапрещеннуюПодстроку Тогда 
		
		ШаблонЗапрещеннаяСтрока = НСтр("ru = 'Имя поля ""%1"" не может начинаться с ""%2"" (стр. %3 кол. %4)'");
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонЗапрещеннаяСтрока,
			ТекстЯчейки,
			ЗапрещеннаяПодстрока,
			НомерСтроки,
			НомерКолонки);
		ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
		
	КонецЕсли;
	
	Если НЕ РезультатПроверки.СоответствуетТребованиямКИменам Тогда
		
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонНеСоответствуетТребованиям,
			ТекстЯчейки,
			НомерСтроки,
			НомерКолонки);
		ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПроверитьМассивИменОбласти(Знач ИмяОбласти, Знач МассивИмен, ОбластьМакета, ЗапрещеннаяПодстрока, Отказ)
	
	Верх = ОбластьМакета.Верх;
	СчетчикМассива = 0;
	НомерПервойПодстроки = 1;
	НомерВторойПодстроки = 2;
	
	ШаблонНеСоответствуетТребованиямДо = НСтр("ru = 'Часть имени области ""%1"" до первого символа ''_'' не соответствует требованиям к именам токенов XML (стр. %2)'");
	ШаблонНеСоответствуетТребованиямПосле = НСтр("ru = 'Часть имени области ""%1"" после первого символа ''_'' не соответствует требованиям к именам токенов XML (стр. %2)'");
	ШаблонЗапрещеннаяСтрока = НСтр("ru = 'Имя области не может начинаться с ""%1"" (стр. %2)'");
	ШаблонЗапрещеннаяСтрокаПосле = НСтр("ru = 'Часть имени области ""%1"" после первого символа ''_'' не может начинаться с ""%2"" (стр. %3)'");
	
	Для Каждого ТекущееИмя Из МассивИмен Цикл
		
		СчетчикМассива = СчетчикМассива + 1;
		
		Если СчетчикМассива > НомерВторойПодстроки Тогда
			Прервать;
		КонецЕсли;
		
		РезультатПроверки = ТекстСоответствуетТребованиямКИменам(ТекущееИмя,, ЗапрещеннаяПодстрока);
		
		Если РезультатПроверки.СодержитЗапрещеннуюПодстроку Тогда
			
			Если СчетчикМассива = НомерПервойПодстроки Тогда
				
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					ШаблонЗапрещеннаяСтрока,
					ИмяОбласти,
					ЗапрещеннаяПодстрока,
					Верх);
				
			Иначе
				
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					ШаблонЗапрещеннаяСтрокаПосле,
					ИмяОбласти,
					ЗапрещеннаяПодстрока,
					Верх);
				
			КонецЕсли;
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
			
		КонецЕсли;
		
		Если НЕ РезультатПроверки.СоответствуетТребованиямКИменам Тогда
			
			Если СчетчикМассива = НомерПервойПодстроки Тогда
				
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					ШаблонНеСоответствуетТребованиямДо,
					ИмяОбласти,
					Верх);
				
			Иначе
				
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					ШаблонНеСоответствуетТребованиямПосле,
					ИмяОбласти,
					Верх);
				
			КонецЕсли;
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьПересечениеОбластей(Знач ТаблицаОбластей, Отказ)
	
	ТаблицаОбластейВЗапрос = ТаблицаОбластей.Скопировать();
	ТаблицаОбластейВЗапрос.Колонки.Добавить("НомерОбласти", Новый ОписаниеТипов("Число"));
	ТаблицаОбластейВЗапрос.Колонки.Верх.Имя = "ВерхОбласти";
	ТаблицаОбластейВЗапрос.Колонки.Низ.Имя = "НизОбласти";
	
	СчетчикСтрок = 0;
	Для Каждого ТекущаяСтрока Из ТаблицаОбластейВЗапрос Цикл
		
		СчетчикСтрок = СчетчикСтрок + 1;
		ТекущаяСтрока.НомерОбласти = СчетчикСтрок;
		
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ТаблицаОбластей", ТаблицаОбластейВЗапрос);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТаблицаОбластей.Имя КАК Имя,
	|	ТаблицаОбластей.ВерхОбласти КАК ВерхОбласти,
	|	ТаблицаОбластей.НизОбласти КАК НизОбласти,
	|	ТаблицаОбластей.НомерОбласти КАК НомерОбласти
	|ПОМЕСТИТЬ ВТ_ТаблицаОбластей
	|ИЗ
	|	&ТаблицаОбластей КАК ТаблицаОбластей
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_ТаблицаОбластей.Имя КАК ИмяОбласти,
	|	ВТ_ТаблицаОбластейПересечение.Имя КАК ИмяОбластиПересечения
	|ИЗ
	|	ВТ_ТаблицаОбластей КАК ВТ_ТаблицаОбластей
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТаблицаОбластей КАК ВТ_ТаблицаОбластейПересечение
	|		ПО ВТ_ТаблицаОбластей.ВерхОбласти < ВТ_ТаблицаОбластейПересечение.ВерхОбласти
	|			И ВТ_ТаблицаОбластей.НизОбласти < ВТ_ТаблицаОбластейПересечение.НизОбласти
	|			И ВТ_ТаблицаОбластей.НизОбласти >= ВТ_ТаблицаОбластейПересечение.ВерхОбласти
	|			И ВТ_ТаблицаОбластей.НомерОбласти <> ВТ_ТаблицаОбластейПересечение.НомерОбласти
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВТ_ТаблицаОбластей.НомерОбласти";
	
	Результат = Запрос.Выполнить();
	
	Если НЕ Результат.Пустой() Тогда
		
		Шаблон = НСтр("ru = 'Для типа макета выгрузки ""%1"" не допускается пересечение областей ""%2"" и ""%3""'");
		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				ФорматСохраненияВыгрузки,
				Выборка.ИмяОбласти,
				Выборка.ИмяОбластиПересечения);
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
		
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Процедура АнализТаблицыМакетаОбластей(Знач ТаблицыМакетаОбластей, Знач ТаблицаОбластей, Отказ)
	
	Если ТаблицыМакетаОбластей.Количество() <= 1 Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ТекущаяОбласть Из ТаблицаОбластей Цикл
		
		Если ТекущаяОбласть.ЭтоОбластьУсловияВывода Тогда
			Продолжить;
		КонецЕсли;
		
		ИмяОбласти = ТекущаяОбласть.Имя;
		Отбор = Новый Структура;
		Отбор.Вставить("ИмяОбласти", ИмяОбласти);
		
		НайденныеСтроки = ТаблицыМакетаОбластей.НайтиСтроки(Отбор);
		
		Если НайденныеСтроки.Количество() <= 1 Тогда
			Продолжить;
		КонецЕсли;
			
		ИмяТаблицы = НайденныеСтроки[0].Имя;
		
		Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
			
			ИмяТаблицыТекущее = НайденнаяСтрока.Имя;
			
			Если ИмяТаблицы = ИмяТаблицыТекущее Тогда
				Продолжить;
			КонецЕсли;
			
			Шаблон = НСтр("ru = 'В области ""%1"" уже есть таблица ""%2"". Область может содержать только одну таблицу (стр. %3)'");
			
			ВерхОбласти = НайденнаяСтрока.Верх;
			НизОбласти = НайденнаяСтрока.Низ;
			
			Пока ВерхОбласти <= НизОбласти Цикл
				
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					Шаблон,
					ИмяОбласти,
					ИмяТаблицы,
					ВерхОбласти);
				ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ);
				ВерхОбласти = ВерхОбласти + 1;
				
			КонецЦикла;
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

&НаСервере
Функция ЗаменитьВФорматированнойСтроке(Строка, ПараметрыЗамены)

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

		НайденнаяОбласть = ФорматированныйДокумент.НайтиТекст(ПодстрокаПоиска);
		Пока НайденнаяОбласть <> Неопределено Цикл
			Фрагменты = ФорматированныйДокумент.СформироватьЭлементы(НайденнаяОбласть.ЗакладкаНачала, НайденнаяОбласть.ЗакладкаКонца);
			Для Индекс = 1 По Фрагменты.ВГраница() Цикл
				Фрагменты[0].Текст = Фрагменты[0].Текст + Фрагменты[Индекс].Текст;
				Фрагменты[Индекс].Текст = "";
			КонецЦикла;
			Фрагменты[0].Текст = СтрЗаменить(Фрагменты[0].Текст, ПодстрокаПоиска, ПодстрокаЗамены);
	
			НайденнаяОбласть = ФорматированныйДокумент.НайтиТекст(ПодстрокаПоиска, НайденнаяОбласть.ЗакладкаКонца);
		КонецЦикла;
	КонецЦикла;
	
	Возврат ФорматированныйДокумент.ПолучитьФорматированнуюСтроку();

КонецФункции

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

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

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

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

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

&НаСервере
Процедура ЗаменитьПараметрыПредставлениями(Строка)
	
	ПараметрыЗамены = ПредставленияПараметровТекста(Строка(Строка));
	
	Если ТипЗнч(Строка) = Тип("ФорматированнаяСтрока") Тогда
		Строка = ЗаменитьВФорматированнойСтроке(Строка, ПараметрыЗамены);
	Иначе
		Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПрочитатьТекстВПолеКолонтитула(Знач Текст, Колонтитул)
	
	ФорматированнаяСтрока = Текст;
	Если ТипЗнч(Текст)  = Тип("Строка") Тогда
		ФорматированнаяСтрока = Новый ФорматированнаяСтрока(Текст);
	КонецЕсли;

	Колонтитул.УстановитьФорматированнуюСтроку(ФорматированнаяСтрока);
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьВидимостьКомандКолонтитулов()
	
	Если ТекущийЭлемент = Элементы.ТекстСлеваСверху
		Или ТекущийЭлемент = Элементы.ТекстВЦентреСверху
		Или ТекущийЭлемент = Элементы.ТекстСправаСверху
		Или ТекущийЭлемент = Элементы.ТекстСлеваСнизу
		Или ТекущийЭлемент = Элементы.ТекстВЦентреСнизу
		Или ТекущийЭлемент = Элементы.ТекстСправаСнизу Тогда
	
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаСлеваВерхнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстСлеваСверху);
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаВЦентреВерхнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстВЦентреСверху);
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаСправаВерхнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстСправаСверху);

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

&НаКлиенте
Процедура ПереключитьВидимостьЭлемента(Элемент, Видимость)
	
	Если Элемент.Видимость <> Видимость Тогда
		Элемент.Видимость = Видимость;
	КонецЕсли;

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

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

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

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

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

	СистемнаяИнформация = Новый СистемнаяИнформация;
	ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;

	ПодключитьОбработчикОжидания("ПодсветитьЯчейкиСВыбраннымПолем", 0.1, Истина);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

	Для Каждого Область Из Области Цикл
		ПодобратьИмяОбласти(Макет, Префикс, Область);
	КонецЦикла;
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Функция ИмяОбласти(ИмяОбласти, Индекс)
	
	Возврат ИмяОбласти + Формат(Индекс, "ЧГ=0;");
	
КонецФункции

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ЗакончитьЗагрузкуИзФайла(Знач ДвоичныеДанные)
	
	КодЯзыка = ТабличныйДокумент.КодЯзыка;
	Макет = ПрочитатьМакет(ДвоичныеДанные);
	ТабличныйДокумент.КодЯзыка = КодЯзыка;
	
	ЗаполнитьТабличныйДокумент(ТабличныйДокумент, Макет);
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ПрефиксУсловнойОбласти()
	
	Возврат "Условие" + "_";
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЛокализованныйПрефиксУсловнойОбласти()
	
	Возврат НСтр("ru = 'Условие'") + "_";
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ФорматыВыгрузкиРазрешеноНаличияКартинок()
	
	МассивФорматов = Новый Массив;
	МассивФорматов.Добавить(ПредопределенноеЗначение("Перечисление.ФорматыВыгрузкиОбъектов.XLS"));
	МассивФорматов.Добавить(ПредопределенноеЗначение("Перечисление.ФорматыВыгрузкиОбъектов.XLSX"));
	МассивФорматов.Добавить(ПредопределенноеЗначение("Перечисление.ФорматыВыгрузкиОбъектов.HTML5"));
	МассивФорматов.Добавить(ПредопределенноеЗначение("Перечисление.ФорматыВыгрузкиОбъектов.MXL"));
	
	Возврат МассивФорматов;
	
КонецФункции

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

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

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