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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	Если Не ТолькоПросмотр Тогда
		ОбновитьСтатус();
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	СохранитьРезультатПроверкиПодписейНаСервере();
	
КонецПроцедуры

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЭлементОрганизацияПриИзменении(Элемент)
	
	ОрганизацияПриИзменении(Элемент.Имя);
	
КонецПроцедуры

&НаКлиенте
Процедура ЭлементОрганизацияОчистка(Элемент, СтандартнаяОбработка)
	
	ОрганизацияОчистка(Элемент.Имя, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ЭлементОрганизацияНаименованиеОчистка(Элемент, СтандартнаяОбработка)
	
	ОрганизацияОчистка(СтрЗаменить(Элемент.Имя, "Наименование", ""), СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ЭлементОрганизацияНаименованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ЭлементОрганизацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура РеквизитыЛицаПредставителя(Команда)
	
	ОткрытьФормуВводаРеквизитов("ЛицоПредставителя");
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура КодНалоговогоОрганаПредставленияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Истина;

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

&НаКлиенте
Процедура ДекорацияНалоговыеОрганыДействияНажатие(Элемент)

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

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

&НаКлиенте
Процедура ДекорацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Массив = СтрРазделить(НавигационнаяСсылкаФорматированнойСтроки, ":");
	ОткрытьФормуВводаРеквизитов(Массив[0], Массив[1]);

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

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

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

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

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

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

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

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

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


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

&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
	
	ИспользуетсяАвтоНаименование = Ложь;
	
КонецПроцедуры

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

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

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаПредставительНесколько

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыПередоверие

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

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

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

&НаКлиенте
Процедура ВыборТипаДоверителя(Команда)

	ВыборТипаОрганизации("Доверитель");

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

&НаКлиенте
Процедура ВыборТипаЛицаДоверителя(Команда)
	
	ВыборТипаОрганизации("ЛицоДоверителя");

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

&НаКлиенте
Процедура ВыборТипаПредставителя(Команда)
	
	ВыборТипаОрганизации("Представитель");
	
КонецПроцедуры

&НаКлиенте
Процедура РеквизитыПредставителя(Команда)
	
	ОткрытьФормуВводаРеквизитов("Представитель");

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

&НаКлиенте
Процедура РеквизитыДоверителя(Команда)
	
	ОткрытьФормуВводаРеквизитов("Доверитель");
	
КонецПроцедуры

&НаКлиенте
Процедура РеквизитыЛицаДоверителя(Команда)
	
	ОткрытьФормуВводаРеквизитов("ЛицоДоверителя");
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ДобавитьПредставителя(Команда)
	
	Добавить("Представитель", "ПредставительДобавить");
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьЛицаПредставителя(Команда)
	
	Добавить("ЛицоПредставителя", "ЛицоПредставителяДобавить");
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПредставителяВТаблицу(Команда)
	
	Если ПредставительНесколько Тогда
		Добавить("Представитель", "ПредставительВыборТипа1");
	Иначе
		Добавить("ЛицоПредставителя", "ПредставительВыборТипа1");
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВыбратьПолномочия(Команда)
	ОткрытиеФормыВводаПолномочий();
КонецПроцедуры

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

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

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

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


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

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

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

&НаКлиенте
Процедура ОчиститьРезультатыПроверки()
	
	Объект.СтатусВернаУстановленВручную = Ложь;
	Объект.Верна = Ложь;
	Объект.УстановившийСтатусВерна = Неопределено;
	Объект.ДатаПроверки = Неопределено;
	Модифицированность = Истина;
	ОтобразитьДекорациюВерна(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

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

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

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

&НаСервере
Функция ПолномочияПоКодам(КодыПолномочий)
	Возврат МашиночитаемыеДоверенностиФНССлужебный.ПолномочияПоКодам(КодыПолномочий);
КонецФункции

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

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

&НаКлиенте
Процедура ПослеВводаКодаНалоговогоОргана(Результат, ДополнительныеПараметры) Экспорт
	
	Объект.КодНалоговогоОрганаПредставления = Результат;
	
КонецПроцедуры

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

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

			Отказ = Истина;
		КонецЕсли;

	КонецЦикла;
	
	Назначение.ТипУчастника = ПредопределенноеЗначение("Перечисление.ТипыУчастниковМЧД.Представитель");
	Для Каждого Строка Из Объект.Представители Цикл

		РеквизитыОрганизации = ПолучитьИзВременногоХранилища(Строка.АдресРеквизитов);
		ПредставлениеПредставителя = ПредставлениеДоверителяПредставителяДляОшибки(Строка.Представитель, РеквизитыОрганизации);
		
		ШаблонОшибки = ПредставлениеПредставителя + " - %1:";
		
		Если Не ЗначениеЗаполнено(Строка.ИдентификаторРодителя) Тогда
			Поле = "Представитель";
		Иначе
			Поле = "ЛицоПредставителя";
		КонецЕсли;

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

	КонецЦикла;
	
	Если Не ПроверитьДублированиеСтрокИДанныеПервоначальнойДоверенности() Тогда
		Отказ = Истина;
	КонецЕсли;

	Возврат Не Отказ;
	
КонецФункции

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

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

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

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

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

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

				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 - %2",
					ПредставлениеПредставителя, НСтр(
				"ru = 'указан представитель и доверитель с одним и тем же ИНН.'"));
				ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,, Поле,, Отказ);

			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Не Отказ;
	
КонецФункции

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

	Иначе
		Наименование = СтрШаблон("%1 %2 %3",
			РеквизитыОрганизации.Фамилия, РеквизитыОрганизации.Имя, РеквизитыОрганизации.Отчество);

		Если Не РеквизитыОрганизации.ЭтоИндивидуальныйПредприниматель Тогда
			ИНН = РеквизитыОрганизации.ИННФЛ;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(КПП) Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 (ИНН: %2, КПП %3)'"), ?(ЗначениеЗаполнено(Ссылка), Ссылка, Наименование), ИНН, КПП);
	ИначеЕсли ЗначениеЗаполнено(ИНН) Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 (ИНН: %2)'"), ?(ЗначениеЗаполнено(Ссылка), Ссылка, Наименование), ИНН);
	Иначе
		Возврат ?(ЗначениеЗаполнено(Ссылка), Строка(Ссылка), Строка(Наименование));
	КонецЕсли;
		
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

	Возврат Истина;
	
КонецФункции

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

&НаСервере
Функция ПолучитьНомерМЧДРР()
	Возврат МашиночитаемыеДоверенностиФНССлужебный.НомерМЧДРР();
КонецФункции

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

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

	Если Условие = Неопределено Или Условие = "Представитель" Или Условие = "ПредставительНесколько"
		Или Условие = "ЛицоПредставителяНесколько" Тогда
		
		ВидимостьПредставителей(Форма);

	КонецЕсли;

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

&НаКлиентеНаСервереБезКонтекста
Функция ДоступенВыборДоверенностиОснования()
	Возврат Ложь;
КонецФункции

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

	Форма.Элементы.ФормаОтправить.Видимость = Ложь;
	Форма.Элементы.ФормаЗаписать.Видимость = Ложь;
	Форма.Элементы.ФормаПодписать.Видимость = Ложь;
	Форма.Элементы.ФормаДобавитьПодпись.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; 
	Форма.Элементы.ФормаДобавитьПодпись.КнопкаПоУмолчанию = Ложь;
	
	Если РеквизитыНедоступныДляРедактирования Тогда

		Форма.Элементы.ГруппаЭлектронныеПодписи.Видимость = Форма.ЭлектронныеПодписи.Количество() > 0;

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

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

	Форма.Элементы.НомерДоверенности.ТолькоПросмотр = РеквизитыНедоступныДляРедактирования;
	ДоступностьПризнакаРегистрацииВРеестре(Форма);
	
	Форма.Элементы.РеквизитыДоверителя.Видимость = Не РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.РеквизитыЛицаДоверителя.Видимость = Не РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.РеквизитыПредставителяУправляющейОрганизации.Видимость = Не РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.РеквизитыПредставителя.Видимость = Не РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.РеквизитыЛицаПредставителя.Видимость = Не РеквизитыНедоступныДляРедактирования;

	Форма.Элементы.ПредставительДобавить.Видимость = Не РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.ЛицоПредставителяДобавить.Видимость = Не РеквизитыНедоступныДляРедактирования;

	Форма.Элементы.ГруппаШапка.ТолькоПросмотр = РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.ГруппаДоверители.ТолькоПросмотр = РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.ГруппаПредставители.ТолькоПросмотр = РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.ГруппаПодвал.ТолькоПросмотр = РеквизитыНедоступныДляРедактирования;

	ЛицоДоверителяОформление(Форма);

	Форма.Элементы.ПредставительВыборТипа.Видимость = Не РеквизитыНедоступныДляРедактирования;
	Форма.Элементы.ПредставительТипДекорация.Видимость = РеквизитыНедоступныДляРедактирования;

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ДоступностьПризнакаРегистрацииВРеестре(Форма)
	
	Форма.Элементы.РегистрироватьВРеестре.ТолькоПросмотр = Форма.РеквизитыНедоступныДляРедактирования
		И МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ВнешниеСтатусы()[Форма.ТехническийСтатус] = Истина;
	
	Если Форма.Элементы.РегистрироватьВРеестре.ТолькоПросмотр И Форма.Объект.РегистрироватьВРеестре
		И Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыМЧД.Действует") Тогда
		ЗаголовокРегистрироватьВРеестре = НСтр(
			"ru='Зарегистрирована в <a href = ""https://m4d.nalog.gov.ru/EMCHD/check-status?guid=%1"">распределенном реестре ФНС России</a>'");
	Иначе
		ЗаголовокРегистрироватьВРеестре = НСтр(
			"ru='Регистрировать в <a href = ""https://m4d.nalog.gov.ru/"">распределенном реестре ФНС России</a>'");
	КонецЕсли;
	
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	МодульСтроковыеФункции = СтроковыеФункции;
#Иначе
	МодульСтроковыеФункции = СтроковыеФункцииКлиент;
#КонецЕсли

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриИзмененииОрганизацииНаСервере(Знач ИмяЭлементаОрганизация, Знач Загрузка = Ложь)
	
	ЗаполнитьРеквизитыОрганизации(ИмяЭлементаОрганизация, Загрузка);

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

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

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

&НаСервере
Процедура ОчисткаДоверителяПредставителя(Знач ИмяЭлементаОрганизация)

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьТипИРеквизитыОрганизации(Знач ИмяЭлементаОрганизация, Знач ТипСтрока)
	ЗаполнитьТипОрганизации(ИмяЭлементаОрганизация, ТипСтрока);
	ЗаполнитьРеквизитыОрганизации(ИмяЭлементаОрганизация);
КонецПроцедуры

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

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

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

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

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

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

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

	Если Форма.ЛицоДоверителяРеквизиты = Неопределено Тогда
		Форма.Элементы.ЛицоДоверителяТипДекорация.Заголовок = НСтр("ru='Физическое лицо:'");
	Иначе
		Форма.Элементы.ЛицоДоверителяТипДекорация.Заголовок = ?(Форма.ЛицоДоверителяРеквизиты.ЭтоФизическоеЛицо,
			НСтр("ru='Физическое лицо:'"), НСтр("ru='Организация:'"));
	КонецЕсли;

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПриПотереГотовности(Форма, УстановитьМодифицированность = Истина)
	
	Форма.Модифицированность = Истина;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыПриИзмененииДоверитель()
	
	ОбработчикОжиданияРеквизитыПриИзменении("Доверитель");
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыПриИзмененииЛицоДоверителя()
	
	ОбработчикОжиданияРеквизитыПриИзменении("ЛицоДоверителя");
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыПриИзмененииПредставительУправляющейКомпании()
	
	ОбработчикОжиданияРеквизитыПриИзменении("ПредставительУправляющейКомпании");
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыПриИзмененииПредставитель()
	
	ОбработчикОжиданияРеквизитыПриИзменении("Представитель");
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыПриИзмененииЛицоПредставителя()
	
	ОбработчикОжиданияРеквизитыПриИзменении("ЛицоПредставителя");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОрганизацияОчистка(ИмяЭлементаОрганизация, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПриПотереГотовности(ЭтотОбъект);
	
	ОчиститьСообщения();
	ОчиститьРеквизитыОрганизации(ИмяЭлементаОрганизация, Ложь);
	
	УстановитьОтображениеРеквизитовЗависимыхОтОрганизации(ИмяЭлементаОрганизация);
	
КонецПроцедуры

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

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

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

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

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

		Если КоличествоСтрок > 0 Тогда
			ЗагрузитьПредставителяУправляющейКомпанииИзСтроки(Строки[0].Идентификатор);
		Иначе
			ЗаполнитьПустоеЗначениеФормы("ПредставительУправляющейКомпании");
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Функция ЗаголовокВыбораТипа(Тип)
	Если Тип = "ФизическоеЛицо" Тогда
		Возврат НСтр("ru='Физическое лицо'");
	КонецЕсли;
	Если Тип = "Контрагент" Тогда
		Возврат НСтр("ru='Контрагент'");
	КонецЕсли;
	Возврат НСтр("ru='Организация'");
КонецФункции

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

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

&НаСервере
Функция АдресПолномочий()

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

&НаСервере
Функция АдресПолномочийРодительскойДоверенности()

	Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.РодительскаяДоверенность,"Полномочия, Ограничения");

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

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

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

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

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

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

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

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

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

		Если ЭтоАдресВременногоХранилища(АдресХронологическихДанных) Тогда
			ПоместитьВоВременноеХранилище(ДанныеСостояния.ХронологическиеДанные, АдресХронологическихДанных);
		Иначе
			АдресХронологическихДанных = ПоместитьВоВременноеХранилище(ДанныеСостояния.ХронологическиеДанные, УникальныйИдентификатор);
		КонецЕсли;

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ОрганизацииДоверители()
	
	Массив = Новый Массив;
	Строки = Объект.Доверители.НайтиСтроки(Новый Структура("ЭтоФизЛицо", Ложь));
	Для Каждого Строка Из Строки Цикл
		Массив.Добавить(Строка.Доверитель);
	КонецЦикла;
	Возврат Массив;
	
КонецФункции

&НаСервереБезКонтекста
Функция ИспользуетсяАвтоНаименование(Объект)
	
	АвтоНаименование = Справочники.МашиночитаемыеДоверенности.АвтоНаименование(Объект);
	Возврат Не ЗначениеЗаполнено(Объект.Наименование) Или Объект.Наименование = АвтоНаименование;
	
КонецФункции

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

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

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

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

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

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

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

			ДоверительПервоначальнойДоверенностиРеквизиты = РеквизитыДоверителя;
			Возврат;
		КонецЕсли;
		
		Если ТипЗнч(Доверители) = Тип("Строка") Тогда
			ОшибкаПриПолученииДанныхДоверенности = Доверители;
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Объект.РодительскаяДоверенность) Тогда

		Доверители = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.РодительскаяДоверенность,
			"Доверители").Выгрузить();
		Найдено = Доверители.НайтиСтроки(Новый Структура("ИдентификаторРодителя",
			Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")));
		Доверители = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
				Объект.РодительскаяДоверенность, "Доверители").Выгрузить();

			Если Доверители.Количество() > 0 Тогда

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

&НаСервере
Процедура ПостроитьЦепочкуПередоверия()
	
	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("Ссылка");
	ТаблицаЗначений.Колонки.Добавить("Наименование");
	ТаблицаЗначений.Колонки.Добавить("Уровень");
	ТаблицаЗначений.Колонки.Добавить("ИндексСтатуса");
	ТаблицаЗначений.Колонки.Добавить("ФайлДоверенности");
	ТаблицаЗначений.Колонки.Добавить("НомерДоверенности");
	
	Если ЗначениеЗаполнено(Объект.НомерДоверенности) Тогда
		Уровень = 0 ;
		ДочерняяДоверенность = ДочерняяДоверенность(Объект.НомерДоверенности);
		Пока ДочерняяДоверенность <> Неопределено Цикл
			НоваяСтрока = ТаблицаЗначений.Добавить();
			НоваяСтрока.Наименование = ДочерняяДоверенность.Наименование;
			НоваяСтрока.Ссылка = ДочерняяДоверенность.Ссылка;
			НоваяСтрока.ИндексСтатуса = ДочерняяДоверенность.ИндексСтатуса;
			НоваяСтрока.ФайлДоверенности = ДочерняяДоверенность.ФайлДоверенности;
			НоваяСтрока.НомерДоверенности = ДочерняяДоверенность.НомерДоверенности;
			Уровень = Уровень - 1;
			НоваяСтрока.Уровень = Уровень;
			// @skip-check query-in-loop - обычно не более 2 запросов, проектное решение.
			ДочерняяДоверенность = ДочерняяДоверенность(ДочерняяДоверенность.НомерДоверенности);
		КонецЦикла;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Объект.РодительскаяДоверенностьНомер) Тогда
		Уровень = 0 ;
		РодительскаяДоверенность = РодительскаяДоверенность(Объект.РодительскаяДоверенностьНомер);
		
		Если Не ЗначениеЗаполнено(Объект.РодительскаяДоверенность) И ЗначениеЗаполнено(РодительскаяДоверенность) Тогда
			Объект.РодительскаяДоверенность = РодительскаяДоверенность.Ссылка;
			Модифицированность = Ложь;
		КонецЕсли;
		
		Пока РодительскаяДоверенность <> Неопределено Цикл
			НоваяСтрока = ТаблицаЗначений.Добавить();
			НоваяСтрока.Наименование = РодительскаяДоверенность.Наименование;
			НоваяСтрока.Ссылка = РодительскаяДоверенность.Ссылка;
			НоваяСтрока.ИндексСтатуса = РодительскаяДоверенность.ИндексСтатуса;
			НоваяСтрока.ФайлДоверенности = РодительскаяДоверенность.ФайлДоверенности;
			НоваяСтрока.НомерДоверенности = РодительскаяДоверенность.НомерДоверенности;
			Уровень = Уровень + 1;
			НоваяСтрока.Уровень = Уровень;
			// @skip-check query-in-loop - обычно не более 2 запросов, проектное решение.
			РодительскаяДоверенность = РодительскаяДоверенность(РодительскаяДоверенность.РодительскаяДоверенностьНомер);
		КонецЦикла;
	КонецЕсли;
	
	Если ТаблицаЗначений.Количество() > 0 Тогда
		
		НоваяСтрока = ТаблицаЗначений.Добавить();
		НоваяСтрока.Уровень = 0;
		НоваяСтрока.НомерДоверенности = Объект.НомерДоверенности;
		НоваяСтрока.Ссылка = Объект.Ссылка;
		Если Объект.Статус = Перечисления.СтатусыМЧД.Действует Тогда
			Если КонецДня(Объект.ДатаОкончания) >= ТекущаяДатаСеанса()
				И КонецДня(Объект.ДатаОкончания) <= ТекущаяДатаСеанса() + 3*24*60*60 Тогда
				НоваяСтрока.ИндексСтатуса = 3;
			ИначеЕсли Объект.ДатаВыдачи > ТекущаяДатаСеанса() Тогда
				НоваяСтрока.ИндексСтатуса = 5;
			ИначеЕсли КонецДня(Объект.ДатаОкончания) >= ТекущаяДатаСеанса() Тогда
				НоваяСтрока.ИндексСтатуса = 2;
			Иначе
				НоваяСтрока.ИндексСтатуса = 4;
			КонецЕсли;
		ИначеЕсли Объект.Статус = Перечисления.СтатусыМЧД.Черновик Тогда
			НоваяСтрока.ИндексСтатуса = 5;
		ИначеЕсли Объект.Статус = Перечисления.СтатусыМЧД.НеДействует Тогда
			НоваяСтрока.ИндексСтатуса = 4;
		Иначе
			НоваяСтрока.ИндексСтатуса = 5;
		КонецЕсли;
		
		НоваяСтрока.Наименование =?(ЗначениеЗаполнено(Объект.Наименование), Объект.Наименование, НСтр("ru = 'Текущая доверенность'"));
		ТаблицаЗначений.Сортировать("Уровень Убыв");
		
		Родитель = ЦепочкаПередоверия.ПолучитьЭлементы();
		Для Каждого Строка Из ТаблицаЗначений Цикл
			НоваяСтрока = Родитель.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
			Родитель = НоваяСтрока.ПолучитьЭлементы();
		КонецЦикла;
		
		Элементы.ГруппаПередоверие.Видимость = Истина;
		
	Иначе
		Элементы.ГруппаПередоверие.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ДочерняяДоверенность(НомерДоверенности) 

	Если Не ЗначениеЗаполнено(НомерДоверенности) Тогда
		Возврат Неопределено;
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	МашиночитаемыеДоверенности.Ссылка КАК Ссылка,
	|	МашиночитаемыеДоверенности.НомерДоверенности КАК НомерДоверенности,
	|	МашиночитаемыеДоверенности.ФайлДоверенности КАК ФайлДоверенности,
	|	ВЫБОР
	|		КОГДА КОНЕЦПЕРИОДА(МашиночитаемыеДоверенности.ДатаОкончания, ДЕНЬ) МЕЖДУ &ТекущаяДата И &СрокИстекающихДоверенностей
	|		И МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Действует)
	|			ТОГДА 3
	|		КОГДА &ТекущаяДата > КОНЕЦПЕРИОДА(МашиночитаемыеДоверенности.ДатаОкончания, ДЕНЬ)
	|		И МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Действует)
	|			ТОГДА 4
	|		КОГДА МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Черновик)
	|			ТОГДА 5
	|		КОГДА &ТекущаяДата
	|			МЕЖДУ МашиночитаемыеДоверенности.ДатаВыдачи И КОНЕЦПЕРИОДА(МашиночитаемыеДоверенности.ДатаОкончания, ДЕНЬ)
	|		И МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Действует)
	|			ТОГДА 2
	|		КОГДА МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.НеДействует)
	|			ТОГДА 4
	|		ИНАЧЕ 5
	|	КОНЕЦ КАК ИндексСтатуса,
	|	МашиночитаемыеДоверенности.Наименование КАК Наименование
	|ИЗ
	|	Справочник.МашиночитаемыеДоверенности КАК МашиночитаемыеДоверенности
	|ГДЕ
	|	МашиночитаемыеДоверенности.РодительскаяДоверенностьНомер = &НомерДоверенности
	|	И НЕ МашиночитаемыеДоверенности.ПометкаУдаления";
	
	Запрос.УстановитьПараметр("НомерДоверенности", НомерДоверенности);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	Запрос.УстановитьПараметр("СрокИстекающихДоверенностей", ТекущаяДатаСеанса() + 3*24*60*60);
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Выборка = РезультатЗапроса.Выбрать();
	Выборка.Следующий();
	Возврат Выборка;
	
КонецФункции

&НаСервере
Функция РодительскаяДоверенность(РодительскаяДоверенностьНомер) 
	
	Если Не ЗначениеЗаполнено(РодительскаяДоверенностьНомер) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	МашиночитаемыеДоверенности.Ссылка КАК Ссылка,
	|	МашиночитаемыеДоверенности.НомерДоверенности КАК НомерДоверенности,
	|	МашиночитаемыеДоверенности.РодительскаяДоверенностьНомер КАК РодительскаяДоверенностьНомер,
	|	МашиночитаемыеДоверенности.ФайлДоверенности КАК ФайлДоверенности,
	|	ВЫБОР
	|		КОГДА КОНЕЦПЕРИОДА(МашиночитаемыеДоверенности.ДатаОкончания, ДЕНЬ) МЕЖДУ &ТекущаяДата И &СрокИстекающихДоверенностей
	|				И МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Действует)
	|			ТОГДА 3
	|		КОГДА &ТекущаяДата > КОНЕЦПЕРИОДА(МашиночитаемыеДоверенности.ДатаОкончания, ДЕНЬ)
	|				И МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Действует)
	|			ТОГДА 4
	|		КОГДА МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Черновик)
	|			ТОГДА 5
	|		КОГДА &ТекущаяДата МЕЖДУ МашиночитаемыеДоверенности.ДатаВыдачи И КОНЕЦПЕРИОДА(МашиночитаемыеДоверенности.ДатаОкончания, ДЕНЬ)
	|				И МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.Действует)
	|			ТОГДА 2
	|		КОГДА МашиночитаемыеДоверенности.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыМЧД.НеДействует)
	|			ТОГДА 4
	|		ИНАЧЕ 5
	|	КОНЕЦ КАК ИндексСтатуса,
	|	МашиночитаемыеДоверенности.Наименование КАК Наименование
	|ИЗ
	|	Справочник.МашиночитаемыеДоверенности КАК МашиночитаемыеДоверенности
	|ГДЕ
	|	МашиночитаемыеДоверенности.НомерДоверенности = &РодительскаяДоверенностьНомер
	|	И НЕ МашиночитаемыеДоверенности.ПометкаУдаления";
	
	Запрос.УстановитьПараметр("РодительскаяДоверенностьНомер", РодительскаяДоверенностьНомер);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	Запрос.УстановитьПараметр("СрокИстекающихДоверенностей", ТекущаяДатаСеанса() + 3*24*60*60);
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Выборка = РезультатЗапроса.Выбрать();
	Выборка.Следующий();
	Возврат Выборка;
	
КонецФункции

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

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

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

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