Функция ПолучитьИли(Знач Коллекция, Знач Поле, Знач ЗначениеИначе) Экспорт

    ЗначениеПоля = Неопределено;
    Существует   = ПолеКоллекцииСуществует(Коллекция, Поле, ЗначениеПоля);

    Если Не Существует Тогда
        ЗначениеПоля = ЗначениеИначе;
    КонецЕсли;

    Возврат ЗначениеПоля;

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

Функция СравнитьДвеКоллекции(Знач ПерваяКоллекция
    , Знач ВтораяКоллекция
    , Знач ИсключаемыеПоля  = Неопределено
    , Знач РодительскоеПоле = "Корень") Экспорт

    Если ТипЗнч(ПерваяКоллекция) <> ТипЗнч(ВтораяКоллекция) Тогда
        Если Не (ЭтоКоллекция(ПерваяКоллекция, Истина) И ЭтоКоллекция(ВтораяКоллекция, Истина)) Тогда
            ОтладочнаяИнформация(СтрШаблон("%1: Типы коллекций не равны", РодительскоеПоле), Истина);
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

    СписокИсключаемых = Новый СписокЗначений();

    Если Не ИсключаемыеПоля = Неопределено Тогда
        OPI_ПреобразованиеТипов.ПолучитьМассив(ИсключаемыеПоля);
        СписокИсключаемых.ЗагрузитьЗначения(ИсключаемыеПоля);
    КонецЕсли;

    Попытка

        Если ЭтоКоллекция(ПерваяКоллекция, Истина) Тогда

            Для Каждого ЭлементКоллекции Из ПерваяКоллекция Цикл

                Если СписокИсключаемых.НайтиПоЗначению(ЭлементКоллекции.Ключ) <> Неопределено Тогда
                    Продолжить;
                КонецЕсли;

                ТекущийКлюч     = ЭлементКоллекции.Ключ;
                ТекущееЗначение = ЭлементКоллекции.Значение;
                ТекущееПоле     = СтрШаблон("%1.%2", РодительскоеПоле, Строка(ЭлементКоллекции.Ключ));

                Если Не СравнитьДвеКоллекции(ТекущееЗначение, ВтораяКоллекция[ТекущийКлюч], , ТекущееПоле) Тогда
                    Возврат Ложь;
                КонецЕсли;

            КонецЦикла;

        ИначеЕсли ЭтоКоллекция(ПерваяКоллекция) Тогда

            Для Н = 0 По ПерваяКоллекция.ВГраница() Цикл

                ТекущееПоле = СтрШаблон("%1.%2", РодительскоеПоле, Строка(Н));

                Если Не СравнитьДвеКоллекции(ПерваяКоллекция[Н], ВтораяКоллекция[Н], , ТекущееПоле) Тогда
                    Возврат Ложь;
                КонецЕсли;

            КонецЦикла;

        Иначе

             Если ПерваяКоллекция <> ВтораяКоллекция Тогда
                 ОтладочнаяИнформация(СтрШаблон("%1: Значения не равны", РодительскоеПоле), Истина);
                 Возврат Ложь;
             КонецЕсли;

        КонецЕсли;

    Исключение
        ОтладочнаяИнформация(СтрШаблон("Исключение: %1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
        Возврат Ложь;
    КонецПопытки;

    Возврат Истина;

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

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

#Область РаботаСДатой

Функция ПолучитьТекущуюДату() Экспорт

    Если ЭтоOneScript() Тогда

        ТекущаяДата = ТекущаяДата();

    Иначе

        ТекущаяДата = Неопределено;

    КонецЕсли;

    Возврат ТекущаяДата;

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

Функция UNIXTime(Знач Дата) Экспорт

    ОТД  = Новый ОписаниеТипов("Дата");
    Дата = ОТД.ПривестиЗначение(Дата);

    UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0");
    UNIX = СтрЗаменить(UNIX, ","        , "");
    UNIX = СтрЗаменить(UNIX, Символы.НПП, "");
    UNIX = СтрЗаменить(UNIX, " "        , "");
    UNIX = Лев(UNIX, 10);

    Возврат UNIX;

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

Функция ВременнаяМеткаISO(Знач Дата) Экспорт

    Метка = Лев(XMLСтрока(Дата), 19) + "Z";
    Метка = СтрЗаменить(Метка, "-", "");
    Метка = СтрЗаменить(Метка, ":", "");

    Возврат Метка;

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

Функция ДатаISO8601(Знач Дата) Экспорт

    Возврат XMLСтрока(Дата);

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

Функция ДатаRFC3339(Знач Дата, Знач Смещение = "Z") Экспорт

    OPI_ПреобразованиеТипов.ПолучитьДату(Дата);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Смещение);

    Возврат XMLСтрока(Дата) + Смещение;

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

Функция ДатаRFC822(Дата) Экспорт

    ДниНедели = Новый Соответствие;
    ДниНедели.Вставить(1, "Mon");
    ДниНедели.Вставить(2, "Tue");
    ДниНедели.Вставить(3, "Wed");
    ДниНедели.Вставить(4, "Thu");
    ДниНедели.Вставить(5, "Fri");
    ДниНедели.Вставить(6, "Sat");
    ДниНедели.Вставить(7, "Sun");

    Месяцы = Новый Соответствие;
    Месяцы.Вставить(1 , "Jan");
    Месяцы.Вставить(2 , "Feb");
    Месяцы.Вставить(3 , "Mar");
    Месяцы.Вставить(4 , "Apr");
    Месяцы.Вставить(5 , "May");
    Месяцы.Вставить(6 , "Jun");
    Месяцы.Вставить(7 , "Jul");
    Месяцы.Вставить(8 , "Aug");
    Месяцы.Вставить(9 , "Sep");
    Месяцы.Вставить(10, "Oct");
    Месяцы.Вставить(11, "Nov");
    Месяцы.Вставить(12, "Dec");

    ДеньНедели = ДниНедели.Получить(ДеньНедели(Дата));
    День       = Формат(День(Дата), "ЧЦ=2; ЧВН=");
    Месяц      = Месяцы.Получить(Месяц(Дата));
    Год        = Формат(Год(Дата), "ЧГ=0");
    Время      = Формат(Дата, "ДФ='ЧЧ:мм:сс'");

    Результат = СтрШаблон("%1, %2 %3 %4 %5 +0000", ДеньНедели, День, Месяц, Год, Время);

    Возврат Результат;

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

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

#Область OneScript

Функция ЭтоOneScript() Экспорт

    Попытка

        Ответ = Ложь;

        // BSLLS:UnusedLocalVariable-off

        //@skip-check module-unused-local-variable
        Проверка = Новый ЗащищенноеСоединениеOpenSSL;

        // BSLLS:UnusedLocalVariable-on

    Исключение

        Ответ = Истина;

    КонецПопытки;

    Возврат Ответ;

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

Функция ЭтоCLI() Экспорт

    Если ЭтоOneScript() Тогда

        ЭтоCLI = Неопределено;
        ЭтоCLI = ПолучитьПеременнуюСреды("OINT_CLI");
        ЭтоCLI = ?(ЗначениеЗаполнено(ЭтоCLI), ЭтоCLI, "NO");

        Возврат ЭтоCLI = "YES";

    КонецЕсли;

    Возврат Ложь;

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

Функция ПолучитьКаталогБиблиотеки() Экспорт

    КаталогСкрипта = "";

    КаталогСкрипта = ТекущийСценарий().Каталог;

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

    КаталогСкрипта = СтрЗаменить(КаталогСкрипта, "\", "/");
    МассивЧастей   = СтрРазделить(КаталогСкрипта, "/");

    МассивЧастей.Удалить(МассивЧастей.ВГраница());
    МассивЧастей.Удалить(МассивЧастей.ВГраница());
    МассивЧастей.Удалить(МассивЧастей.ВГраница());
    МассивЧастей.Удалить(МассивЧастей.ВГраница());
    МассивЧастей.Удалить(МассивЧастей.ВГраница());

    Путь = СтрСоединить(МассивЧастей, "/");

    Возврат Путь;

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

Процедура ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт

    Если Не ЭтоCLI() Тогда
        Возврат;
    КонецЕсли;

    Целое   = 100;
    Текущее = Окр(Текущее / Делитель, 2);
    Всего   = Окр(Всего / Делитель, 2);
    Процент = Цел(Текущее / Всего * Целое);

    СтрТекущее = ЧислоВСтроку(Текущее);
    СтрВсего   = ЧислоВСтроку(Всего);
    СтрПроцент = ЧислоВСтроку(Процент);

    Прогресс   = "Прогресс [" + СтрПроцент + "%" + "] ▐";
    Информация = "▌ " + СтрТекущее + "/" + СтрВсего + " " + ЕдИзм;

    // Прогресс бар
    ДлинаПолоски = 30;
    Счетчик      = 0;
    Буфер        = "";

    Показатель = Цел(Текущее / Всего * ДлинаПолоски);

    Пока Счетчик < ДлинаПолоски Цикл
        Буфер   = Буфер + ?(Счетчик < Показатель, "█", " ");
        Счетчик = Счетчик + 1;
    КонецЦикла;

    ВывестиТекстВТекущуюСтроку(Прогресс, , Истина);
    ВывестиТекстВТекущуюСтроку(Буфер   , "Зеленый");
    ВывестиТекстВТекущуюСтроку(Информация);

    Если Процент = Целое Тогда
        ВывестиТекстВТекущуюСтроку(Символы.ПС, , Истина);
    КонецЕсли;

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

Процедура ОтладочнаяИнформация(Знач Текст, Знач Принудительно = Ложь) Экспорт

    Если Не ЭтоOneScript() Тогда
        Возврат;
    КонецЕсли;

    Попытка

        ЭтоОтладка = Неопределено;
        ЭтоОтладка = ПолучитьПеременнуюСреды("OINT_DEBUG");
        ЭтоОтладка = ?(ЗначениеЗаполнено(ЭтоОтладка), ЭтоОтладка, "NO");

    Исключение
       ЭтоОтладка = "NO";
    КонецПопытки;

    Если ЭтоОтладка = "YES" Или Принудительно Тогда

        // BSLLS:DeprecatedMessage-off

        //@skip-check use-non-recommended-method
        Сообщить(Текст);

        // BSLLS:DeprecatedMessage-on

    КонецЕсли;

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

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

#Область Служебные


Процедура УстановитьСостояниеЭлементовФормыЗадачи(Форма) Экспорт

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

	Форма.Элементы.Предмет.Гиперссылка = Форма.Объект.Предмет <> Неопределено И Не Форма.Объект.Предмет.Пустая();
	Форма.ПредметСтрокой = ОбщегоНазначения.ПредметСтрокой(Форма.Объект.Предмет);

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

Функция РезультатВыполненияПриПеренаправлении(Знач СведенияОЗадаче)

	СтрокаФормат = "%1, %2 " + НСтр("ru = 'перенаправил(а) задачу'") + ":
																	   |%3
																	   |";

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

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

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

#КонецЕсли


Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт

	Результат = Новый Массив;
	Результат.Добавить("Описание");
	Результат.Добавить("Автор");
	Результат.Добавить("ТолькоДляАвтора");

	Возврат Результат;

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

// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтение
	|ГДЕ
	|	Пользовательский = ЛОЖЬ
	|	ИЛИ ТолькоДляАвтора = ЛОЖЬ
	|	ИЛИ ЭтоАвторизованныйПользователь(Автор)
	|;
	|РазрешитьИзменениеЕслиРазрешеноЧтение
	|ГДЕ
	|	ЭтоАвторизованныйПользователь(Автор)";

	Ограничение.ТекстДляВнешнихПользователей = Ограничение.Текст;

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

#КонецЕсли

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

		ПараметрыОткрытия = ВариантыОтчетов.ПараметрыОткрытия(СсылкаВарианта);

		ВариантыОтчетовКлиентСервер.ДополнитьСтруктуруКлючом(ПараметрыОткрытия, "ВыполнятьЗамеры", Ложь);

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

		ПолноеИмяОтчета = Вид + "." + ПараметрыОткрытия.ИмяОтчета;

		КлючУникальности = ОтчетыКлиентСервер.КлючУникальности(ПолноеИмяОтчета, ПараметрыОткрытия.КлючВарианта);
		ПараметрыОткрытия.Вставить("КлючПараметровПечати", КлючУникальности);
		ПараметрыОткрытия.Вставить("КлючСохраненияПоложенияОкна", КлючУникальности);

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

#КонецЕсли

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)

	Поля.Добавить("Наименование");
	Поля.Добавить("Ссылка");
	Поля.Добавить("Пользовательский");
	Поля.Добавить("ПредопределенныйВариант");
	Поля.Добавить("ТипОтчета");
	СтандартнаяОбработка = Ложь;

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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)

	Если ВариантыОтчетовВызовСервера.ЭтоПредопределенныйВариантОтчета(Данные) Тогда
		Данные.Ссылка = Данные.ПредопределенныйВариант;
	КонецЕсли;

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

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

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

////////////////////////////////////////////////////////////////////////////////
// Обработчики обновления.

// Регистрирует данные к обновлению в плане обмена ОбновлениеИнформационнойБазы
//  см. Стандарты и методики разработки прикладных решений: Параллельный режим отложенного обновления.
//
// Параметры:
//  Параметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке
//

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

	Ссылки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, Ссылки);
КонецПроцедуры

// Обрабатывает данные, зарегистрированные в плане обмена ОбновлениеИнформационнойБазы
//  см. Стандарты и методики разработки прикладных решений: Параллельный режим отложенного обновления.
//
// Параметры:
//  Параметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке
//


Функция СведенияОЛицахПередавшихПолномочия(Доверенность)

	ДляНалоговыхОрганов = Доверенность.ДляНалоговыхОрганов;
	СведенияОЛицахПередавшихПолномочия = Новый Массив;

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

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

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

		ТипЛицаПередавшегоПолномочия = Неопределено;

		ДоверителемЯвляетсяФизическоеЛицо = РеквизитыДоверителя.ЭтоФизическоеЛицо;
		Если ДоверителемЯвляетсяФизическоеЛицо Тогда
			ТипЛицаПередавшегоПолномочия = "3";
			СведенияОФизическомЛицеПередавшемПолномочия = СведенияОФизическомЛицеПередавшемПолномочия(РеквизитыДоверителя, ДляНалоговыхОрганов);
			ЛицоПередавшееПолномочия.ФЛПерПолн = СведенияОФизическомЛицеПередавшемПолномочия;
		Иначе
			Если РеквизитыДоверителя.ЭтоИностраннаяОрганизация Тогда
				ТипЛицаПередавшегоПолномочия = "5";
				СведенияОбИностранномЮридическомЛице = СведенияОДоверителеИностранногоЮридическогоЛица(РеквизитыДоверителя, РеквизитыЛицДоверителя, ДляНалоговыхОрганов);
				ЛицоПередавшееПолномочия.ИнПерПолн = СведенияОбИностранномЮридическомЛице;
			ИначеЕсли РеквизитыДоверителя.ЭтоИндивидуальныйПредприниматель Тогда
				ТипЛицаПередавшегоПолномочия = "2";
				СведенияОбИндивидуальномПредпринимателе = СведенияОбИндивидуальномПредпринимателе(РеквизитыДоверителя, РеквизитыЛицДоверителя, ДляНалоговыхОрганов);
				ЛицоПередавшееПолномочия.ИППерПолн = СведенияОбИндивидуальномПредпринимателе;
			ИначеЕсли РеквизитыДоверителя.ЭтоФилиал Тогда
				ТипЛицаПередавшегоПолномочия = "4";
				СведенияОФилиалеЮридическогоЛица = СведенияОФилиалеЮридическогоЛица(РеквизитыДоверителя, РеквизитыЛицУправляющихКомпаний, РеквизитыЛицДоверителя, ДляНалоговыхОрганов);
				ЛицоПередавшееПолномочия.ФилПерПолн = СведенияОФилиалеЮридическогоЛица;
			Иначе
				ТипЛицаПередавшегоПолномочия = "1";
				СведенияОДоверителеЮридическогоЛица = СведенияОДоверителеЮридическогоЛица(РеквизитыДоверителя, РеквизитыЛицУправляющихКомпаний, РеквизитыЛицДоверителя, ДляНалоговыхОрганов);
				ЛицоПередавшееПолномочия.РосОргПерПолн = СведенияОДоверителеЮридическогоЛица;
			КонецЕсли;
		КонецЕсли;

		Если ТипЛицаПередавшегоПолномочия <> Неопределено Тогда
			СведенияОЛицеПередавшемПолномочия.ТипПерПолн = ТипЛицаПередавшегоПолномочия;
			СведенияОЛицеПередавшемПолномочия.ПередПолн = ЛицоПередавшееПолномочия;
			СведенияОЛицахПередавшихПолномочия.Добавить(СведенияОЛицеПередавшемПолномочия);
		КонецЕсли;

	КонецЦикла;

	Возврат СведенияОЛицахПередавшихПолномочия;

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

Функция ДоверенностьXDTOПоСсылке(ДоверенностьСсылка)

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

	Если ФайлДоверенности.Пустая() Тогда
		Возврат Неопределено;
	КонецЕсли;

	ДанныеФайла = РаботаСФайлами.ДанныеФайла(ФайлДоверенности);
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
	ДоверенностьXML = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
	ДоверенностьXDTO = ДоверенностьXDTO(ДоверенностьXML);

	Возврат ДоверенностьXDTO;

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

Функция СведенияОДоверителяхПервоначальнойДоверенности(СведенияОДоверителях) // СвДоверПервТип

	СведенияОДоверителяхПервоначальнойДоверенности = Новый Массив;

	Для Каждого СведенияОДоверителе Из СведенияОДоверителях Цикл
		ТипДоверителя = СведенияОДоверителе.ТипДоверит;
		Доверитель = СведенияОДоверителе.Доверит;

		ДоверительПервоначальнойДоверенности  = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИдентификаторСхемыМЧД(), "ДоверитПервТип"));

		Если ТипДоверителя = "1" Тогда
			ДоверительПервоначальнойДоверенности.РосОргДовер = Доверитель.РосОргДовер.СвРосОрг;
		ИначеЕсли ТипДоверителя = "2" Тогда
			ДоверительПервоначальнойДоверенности.ИнОргДовер = Доверитель.ИнОргДовер.СвИнОрг;
		ИначеЕсли ТипДоверителя = "3" Тогда
			ДоверительПервоначальнойДоверенности.ИПДовер = Доверитель.ИПДовер;
		ИначеЕсли ТипДоверителя = "4" Тогда
			ДоверительПервоначальнойДоверенности.ФЛДовер = Доверитель.ФЛДовер;
		КонецЕсли;

		СведенияОДоверителеПервоначальнойДоверенности = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИдентификаторСхемыМЧД(), "СвДоверПервТип"));
		СведенияОДоверителеПервоначальнойДоверенности.ТипДоверит = ТипДоверителя;
		СведенияОДоверителеПервоначальнойДоверенности.ДоверитПерв = ДоверительПервоначальнойДоверенности;

		СведенияОДоверителяхПервоначальнойДоверенности.Добавить(СведенияОДоверителеПервоначальнойДоверенности);
	КонецЦикла;

	Возврат СведенияОДоверителяхПервоначальнойДоверенности;

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

Функция СведенияОФизическомЛицеПередавшемПолномочия(РеквизитыФизическогоЛица, ДляНалоговыхОрганов) // ФЛПерПолн

	ИНН = РеквизитыФизическогоЛица.ИНН;
	СНИЛС = РеквизитыФизическогоЛица.СНИЛС;
	СведенияОФизическомЛице = СведенияОФизическомЛице(РеквизитыФизическогоЛица, ДляНалоговыхОрганов);

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

	Возврат СведенияОФизическомЛицеПередавшемПолномочия;

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

Функция СведенияОФилиалеЮридическогоЛица(РеквизитыОрганизации, РеквизитыУправляющихКомпаний, РеквизитыФизическихЛиц, ДляНалоговыхОрганов) // ФилПерПолн

	СведенияОФилиалеЮридическогоЛица = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИдентификаторСхемыМЧД(), "ФилПерПолнТип"));
	СведенияОФилиалеЮридическогоЛица.СвФил = СведенияОЮридическомЛице(РеквизитыОрганизации);

	Для Каждого РеквизитыФизическогоЛица Из РеквизитыФизическихЛиц Цикл
		СведенияОФилиалеЮридическогоЛица.СвРукФил = СведенияОДолжностномЛице(РеквизитыФизическогоЛица, ДляНалоговыхОрганов);
		Прервать;
	КонецЦикла;

	Возврат СведенияОФилиалеЮридическогоЛица;

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


Функция СтранаАдресаКонтактнойИнформации(ВыбранноеЗначение)

	Возврат УправлениеКонтактнойИнформацией.СтранаАдресаКонтактнойИнформации(ВыбранноеЗначение);

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

&НаКлиенте

Процедура ПредставлениеТелефонаНачалоВыбора(Форма, Элемент, ДанныеВыбора, СтандартнаяОбработка, ИмяРеквизита, ЗаголовокФормы)

	Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		Возврат;
	КонецЕсли;

	МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
		"УправлениеКонтактнойИнформациейКлиент");

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

	ПараметрыФормы.Вставить("Заголовок", ЗаголовокФормы);

	МодульУправлениеКонтактнойИнформациейКлиент.ОткрытьФормуКонтактнойИнформации(ПараметрыФормы, Элемент);

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

&НаКлиенте

Процедура ПредставлениеТелефонаОчистка(Форма, Элемент, СтандартнаяОбработка, ИмяРеквизита)

	Форма[ИмяРеквизита + "Значение"] = "";
	Форма[ИмяРеквизита] = "";

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

&НаКлиенте

Процедура ПредставлениеТелефонаОбработкаВыбора(Форма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка, ИмяРеквизита)

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

	Форма[ИмяРеквизита + "Значение"] = ВыбранноеЗначение.КонтактнаяИнформация;
	Форма[ИмяРеквизита] = ВыбранноеЗначение.Представление;

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

&НаСервере

Функция ПроверитьСведенияОбОрганизации()

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

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

&НаКлиенте

Процедура СтранаРегистрацииПриИзменении(Элемент)
	СтранаРегистрацииПриИзмененииНаСервере();
	Модифицированность = Истина;
КонецПроцедуры

&НаСервере

Процедура СтранаРегистрацииПриИзмененииНаСервере()

	СтранаРегистрацииКод = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтранаРегистрации, "Код");

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

&НаКлиенте

Процедура СтранаРегистрацииОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	УправлениеКонтактнойИнформациейКлиент.СтранаМираОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста

Процедура УправлениеВидимостью(Форма)

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

	Для Каждого Элемент Из Форма.Элементы Цикл

		Если ТипЗнч(Элемент) = Тип("ТаблицаФормы") Или Элемент.Вид <> ВидПоляФормы.ПолеВвода Тогда
			Продолжить;
		КонецЕсли;

		Если Элемент.Имя = "Ссылка1" Или Элемент.Имя = "Представитель" Тогда
			Продолжить;
		КонецЕсли;

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

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

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

&НаКлиенте

Процедура ПредставительПриИзменении(Элемент)

	ЗаполнитьРеквизитыОрганизации("ФизическоеЛицо", ТаблицаПредставительНесколько[0].Представитель);
	УправлениеВидимостью(ЭтотОбъект);

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

&НаСервере

Процедура ЗаполнитьРеквизитыОрганизации(ОрганизацияТипСтрока, ОрганизацияСсылка, Реквизиты = Неопределено)

	Если ОрганизацияТипСтрока <> "ФизическоеЛицо" Тогда

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

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

		Если ЭтоИндивидуальныйПредприниматель Тогда
			ИндивидуальныйПредпринимательПриИзменении(ЭтотОбъект);
		Иначе
			ФилиалПриИзменении(ЭтотОбъект);
		КонецЕсли;

		Если ЭтоИндивидуальныйПредприниматель
			Или ЭтоФилиал Тогда

			ЗаполнитьРеквизитыОрганизации("ФизическоеЛицо", Реквизиты.ЛицоБезДоверенности, Реквизиты.РеквизитыЛицаБезДоверенности);

		КонецЕсли;
	Иначе
		ТаблицаПредставительНесколько[0].Представитель = ОрганизацияСсылка;

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

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

		ЗаголовокДекорации = МашиночитаемыеДоверенностиФНССлужебный.ЗаголовокДекорации(
			Реквизиты, "Представитель", Ложь, Ложь); // ФорматированнаяСтрока

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

	Модифицированность = Истина;

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

&НаКлиентеНаСервереБезКонтекста

Процедура ИндивидуальныйПредпринимательПриИзменении(Форма)

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

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

&НаКлиентеНаСервереБезКонтекста

Процедура ФилиалПриИзменении(Форма)

	Форма.ТаблицаПредставительНесколько.Очистить();
	Если Форма.ЭтоФилиал Тогда
		Форма.ТаблицаПредставительНесколько.Добавить();
	КонецЕсли;

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

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


Процедура ОбработатьНаборыСвойствДляПереходаНаНовуюВерсию(Параметры) Экспорт

	ПредопределенныеНаборыСвойств = УправлениеСвойствамиПовтИсп.ПредопределенныеНаборыСвойств();
	ПроблемныхОбъектов = 0;

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

	Для Каждого ОбновляемыйНабор Из Результат Цикл

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

			ДлинаПрефикса = СтрДлина("Удалить");
			ИмяНабора = Сред(ОбновляемыйНабор.ИмяПредопределенныхДанных, ДлинаПрефикса + 1, СтрДлина(ОбновляемыйНабор.ИмяПредопределенныхДанных) - ДлинаПрефикса);
			ОписаниеНовогоНабора = ПредопределенныеНаборыСвойств.Получить(ИмяНабора); // см. Справочники.НаборыДополнительныхРеквизитовИСведений.СвойстваНабора
			Если ОписаниеНовогоНабора = Неопределено Тогда
				ОтменитьТранзакцию();
				Продолжить;
			КонецЕсли;
			НовыйНабор = ОписаниеНовогоНабора.Ссылка;

			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений");
			ЭлементБлокировки.УстановитьЗначение("Ссылка", НовыйНабор);
			Блокировка.Заблокировать();

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

				// Обновление набора свойств в зависимостях дополнительного реквизита.
				Свойство = НоваяСтрокаРеквизиты.Свойство;
				Блокировка = Новый БлокировкаДанных;
				ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения");
				ЭлементБлокировки.УстановитьЗначение("Ссылка", Свойство);
				Блокировка.Заблокировать();

				СвойствоОбъект = Свойство.ПолучитьОбъект();
				Если СвойствоОбъект = Неопределено Тогда
					Продолжить;
				КонецЕсли;

				Если СвойствоОбъект.НаборСвойств = ОбновляемыйНабор.Ссылка Тогда
					СвойствоОбъект.НаборСвойств = НовыйНабор;
				КонецЕсли;

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

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

				НовыйНаборОбъект.КоличествоРеквизитов = Формат(КоличествоРеквизитов, "ЧГ=");
				НовыйНаборОбъект.КоличествоСведений   = Формат(КоличествоСведений, "ЧГ=");
				НовыйНаборОбъект.КоличествоМеток      = Формат(КоличествоМеток, "ЧГ=");
			КонецЕсли;

			ОбновлениеИнформационнойБазы.ЗаписатьОбъект(НовыйНаборОбъект);

			// Очистка старого набора.
			УстаревшийНаборОбъект = ОбновляемыйНабор.Ссылка.ПолучитьОбъект();
			УстаревшийНаборОбъект.ДополнительныеРеквизиты.Очистить();
			УстаревшийНаборОбъект.ДополнительныеСведения.Очистить();
			УстаревшийНаборОбъект.Используется = Ложь;

			ОбновлениеИнформационнойБазы.ЗаписатьОбъект(УстаревшийНаборОбъект);

			Если ОбновляемыйНабор.ЭтоГруппа Тогда
				Запрос = Новый Запрос;
				Запрос.УстановитьПараметр("Родитель", ОбновляемыйНабор.Ссылка);
				Запрос.Текст =
					"ВЫБРАТЬ
					|	НаборыДополнительныхРеквизитовИСведений.Ссылка КАК Ссылка
					|ИЗ
					|	Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыДополнительныхРеквизитовИСведений
					|ГДЕ
					|	НаборыДополнительныхРеквизитовИСведений.Родитель = &Родитель
					|	И НаборыДополнительныхРеквизитовИСведений.Предопределенный = ЛОЖЬ";
				ПереносимыеНаборы = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - Порционная обработка данных.
				Для Каждого Строка Из ПереносимыеНаборы Цикл
					НаборОбъект = Строка.Ссылка.ПолучитьОбъект();
					НаборОбъект.Родитель = НовыйНабор;
					ОбновлениеИнформационнойБазы.ЗаписатьОбъект(НаборОбъект);
				КонецЦикла;
			КонецЕсли;

			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();

			ПроблемныхОбъектов = ПроблемныхОбъектов + 1;

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

	КонецЦикла;

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

	Параметры.ОбработкаЗавершена = Истина;

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

// Начальное заполнение наборов

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов
//
// Параметры:
//  Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки
//


Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт

	Результат = Новый Массив;

	Результат.Добавить("КраткоеПредставление");
	Результат.Добавить("Комментарий");
	Результат.Добавить("ВнешняяРоль");
	Результат.Добавить("УзелОбмена");

	Возврат Результат
КонецФункции

// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

// Заполнение предопределенных элементов

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

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

#КонецЕсли

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

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

	ФрагментыТекстаПоискДляДополнительныхЯзыков = Новый Массив;

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

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

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

	КонецЕсли;

	ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 20
		|	РолиИсполнителей.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.РолиИсполнителей.Назначение КАК РолиИсполнителейНазначение
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.РолиИсполнителей КАК РолиИсполнителей
		|		ПО РолиИсполнителейНазначение.Ссылка = РолиИсполнителей.Ссылка
		|ГДЕ
		|	РолиИсполнителейНазначение.ТипПользователей = &Тип
		|	И (РолиИсполнителей.Наименование ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~""
		|			ИЛИ &ПоискДляДополнительныхЯзыков
		|			ИЛИ РолиИсполнителей.Код ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"")
		|	И НЕ РолиИсполнителей.Ссылка ЕСТЬ NULL";

	Если ФрагментыТекстаПоискДляДополнительныхЯзыков.Количество() > 0 Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоискДляДополнительныхЯзыков", СтрСоединить(ФрагментыТекстаПоискДляДополнительныхЯзыков, " ИЛИ "));
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоискДляДополнительныхЯзыков", "ЛОЖЬ");
	КонецЕсли;

	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("Тип",          ОбъектАвторизации);
	Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Параметры.СтрокаПоиска) + "%");
	РезультатЗапроса = Запрос.Выполнить().Выбрать();

	ДанныеВыбора = Новый СписокЗначений;
	Пока РезультатЗапроса.Следующий() Цикл
		ДанныеВыбора.Добавить(РезультатЗапроса.Ссылка, РезультатЗапроса.Ссылка);
	КонецЦикла;

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

#КонецЕсли

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)

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

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

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)

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

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

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов
//
// Параметры:
//  Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки
//

Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт

	Настройки.ПриНачальномЗаполненииЭлемента = Истина;

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

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов
//
// Параметры:
//   КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков
//   Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы
//   ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти
//

Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт

	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных = "ОтветственныйЗаКонтрольИсполнения";

	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
		МодульМультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование",
			"ru='Координатор выполнения задач'", КодыЯзыков); // @НСтр-1
	Иначе
		Элемент.Наименование = НСтр("ru = 'Координатор выполнения задач'", ОбщегоНазначения.КодОсновногоЯзыка());
	КонецЕсли;

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

	Назначение = ТабличныеЧасти.Назначение.Скопировать(); // ТаблицаЗначений
	ЭлементТЧ = Назначение.Добавить();
	ЭлементТЧ.ТипПользователей = Справочники.Пользователи.ПустаяСсылка();
	Элемент.Назначение = Назначение;

	БизнесПроцессыИЗадачиПереопределяемый.ПриНачальномЗаполненииРолейИсполнителей(КодыЯзыков, Элементы, ТабличныеЧасти);

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

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов
//
// Параметры:
//  Объект                  - СправочникОбъект.РолиИсполнителей - заполняемый объект.
//  Данные                  - СтрокаТаблицыЗначений - данные заполнения объекта.
//  ДополнительныеПараметры - Структура:
//   * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов.
//


Процедура НачалоВыбораФизическогоЛица(СтандартнаяОбработка)

	ТекущиеДанные = Элементы.Сертификаты.ТекущиеДанные;

	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

	Результат = ЭлектроннаяПодписьСлужебныйВызовСервера.ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан(
		ТекущиеДанные.КомуВыдан);

	Если Не Результат.Свойство("ФизическиеЛица") Тогда
		Возврат;
	КонецЕсли;

	ФизическиеЛица = Результат.ФизическиеЛица.Получить(ТекущиеДанные.КомуВыдан);

	СтандартнаяОбработка = Ложь;

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

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

	ФиксированныеНастройки = Новый НастройкиКомпоновкиДанных;

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

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ФиксированныеНастройки", ФиксированныеНастройки);
	ПараметрыФормы.Вставить("ОтборПоСсылке", Истина);
	ПараметрыФормы.Вставить("РежимВыбора", Истина);

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

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

&НаСервере

Функция ДобавитьСертификатыВСправочникНаСервере()

	Успех = Истина;

	Для Каждого ТекущаяСтрока Из Сертификаты Цикл

		ПараметрыСертификата = Новый Структура;

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

		ПараметрыСертификата.Вставить("Наименование", ТекущаяСтрока.Представление);

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

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

		Попытка

			СсылкаНаСертификат = ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник(ТекущаяСтрока.АдресСертификата, ПараметрыСертификата);
			ТекущаяСтрока.Сертификат = СсылкаНаСертификат;
			ТекущаяСтрока.Обновить = Ложь;

		Исключение

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

			ИндексСтроки = Сертификаты.Индекс(ТекущаяСтрока);
			ОбщегоНазначения.СообщитьПользователю(СообщениеОбОшибке,, "Сертификаты[" + ИндексСтроки + "].Представление");
			Успех = Ложь;

		КонецПопытки;

	КонецЦикла;

	Возврат Успех;

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

&НаКлиенте
Асинх Процедура ЗаполнитьОписаниеДанныхСертификата(Результат, АдресСертификата) Экспорт

	Если Результат <> Истина Тогда
		РасширениеПодключено = Ложь;
		ЗаполнитьОписаниеДанныхСертификатаНаСервере(АдресСертификата);
		Возврат;
	ИначеЕсли РасширениеПодключено <> Истина Тогда
		РасширениеПодключено = Истина;
	КонецЕсли;

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

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

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

&НаСервере

Процедура ЗаполнитьОписаниеДанныхСертификатаНаСервере(АдресСертификата)

	СертификатКриптографии = Новый СертификатКриптографии(ПолучитьИзВременногоХранилища(АдресСертификата));
	СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии);

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

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

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


Функция ПолучитьНастройкиСобытий() Экспорт
	РезультатФункции = Новый Структура();

	ВидыСобытий_ДобавленаЗадача = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ДобавленаЗадача");
	ВидыСобытий_НовыйИсполнитель = ПредопределенноеЗначение("Перечисление.узВидыСобытий.НовыйИсполнитель");
	ВидыСобытий_ДобавленКомментарий = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ДобавленКомментарий");
	ВидыСобытий_ИзмененКомментарий = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ИзмененКомментарий");
	ВидыСобытий_ИзмененоОписаниеЗадачи = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ИзмененоОписаниеЗадачи");
	ВидыСобытий_ИзменениеСтатуса = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ИзменениеСтатуса");
	ВидыСобытий_ВходящееПисьмо = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ВходящееПисьмо");
	ВидыСобытий_ВыполненаЗадача = ПредопределенноеЗначение("Перечисление.узВидыСобытий.ВыполненаЗадача");

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

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

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

	МассивСобытийКоторыеПодлежатОтправки = Новый Массив();
	МассивСобытийКоторыеПодлежатОтправки.Добавить(ВидыСобытий_ДобавленаЗадача);
	МассивСобытийКоторыеПодлежатОтправки.Добавить(ВидыСобытий_НовыйИсполнитель);
	МассивСобытийКоторыеПодлежатОтправки.Добавить(ВидыСобытий_ДобавленКомментарий);
	МассивСобытийКоторыеПодлежатОтправки.Добавить(ВидыСобытий_ИзмененКомментарий);
	МассивСобытийКоторыеПодлежатОтправки.Добавить(ВидыСобытий_ВходящееПисьмо);

	РезультатФункции.Вставить("МассивСобытийКоторыеПодлежатОтправки",МассивСобытийКоторыеПодлежатОтправки);

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

	МассивСобытийДляКонтрагентовКоторыеПодлежатОтправки = Новый Массив();
	МассивСобытийДляКонтрагентовКоторыеПодлежатОтправки.Добавить(ВидыСобытий_ДобавленаЗадача);
	МассивСобытийДляКонтрагентовКоторыеПодлежатОтправки.Добавить(ВидыСобытий_ВыполненаЗадача);

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

	Возврат РезультатФункции;
КонецФункции

Функция ЕстьЗаписиВРССвязанныеЗадачи(пЗадача, ОтбиратьЗаписиИПоСвязаннойЗадачи = Ложь) Экспорт

	пЕстьЗаписиВРССвязанныеЗадачи = Ложь;

	Если НЕ ЗначениеЗаполнено(пЗадача) Тогда
		Возврат пЕстьЗаписиВРССвязанныеЗадачи;
	Конецесли;

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
	               |	узСвязанныеЗадачи.Задача,
	               |	узСвязанныеЗадачи.СвязаннаяЗадача
	               |ИЗ
	               |	РегистрСведений.узСвязанныеЗадачи КАК узСвязанныеЗадачи
	               |ГДЕ
	               |	ВЫБОР
	               |			КОГДА &ОтбиратьЗаписиИПоСвязаннойЗадачи
	               |				ТОГДА узСвязанныеЗадачи.Задача = &Задача
	               |						ИЛИ узСвязанныеЗадачи.СвязаннаяЗадача = &Задача
	               |			ИНАЧЕ узСвязанныеЗадачи.Задача = &Задача
	               |		КОНЕЦ";

	Запрос.УстановитьПараметр("Задача",пЗадача);
	РезультатЗапроса = Запрос.Выполнить();

	Если НЕ РезультатЗапроса.Пустой() Тогда
		пЕстьЗаписиВРССвязанныеЗадачи = Истина;
	Конецесли;

	Возврат пЕстьЗаписиВРССвязанныеЗадачи;
КонецФункции

Функция ПолучитьМассивНомеровСвязанныхЗадач(пЗадача) Экспорт

	МассивНомеровСвязанныхЗадач = Новый Массив;

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	узСвязанныеЗадачи.СвязаннаяЗадача
	|ПОМЕСТИТЬ ВТРезультат
	|ИЗ
	|	РегистрСведений.узСвязанныеЗадачи КАК узСвязанныеЗадачи
	|ГДЕ
	|	узСвязанныеЗадачи.Задача = &Задача
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	узСвязанныеЗадачи.Задача
	|ИЗ
	|	РегистрСведений.узСвязанныеЗадачи КАК узСвязанныеЗадачи
	|ГДЕ
	|	узСвязанныеЗадачи.СвязаннаяЗадача = &Задача
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТРезультат.СвязаннаяЗадача.Код КАК НомерЗадачи
	|ИЗ
	|	ВТРезультат КАК ВТРезультат
	|ГДЕ
	|	ВТРезультат.СвязаннаяЗадача <> &Задача";

	Запрос.УстановитьПараметр("Задача",пЗадача);

	РезультатЗапроса = Запрос.Выполнить();

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

	Выборка = РезультатЗапроса.Выбрать();

	Пока Выборка.Следующий() Цикл
		МассивНомеровСвязанныхЗадач.Добавить(Формат(Выборка.НомерЗадачи,"ЧГ=0"));
	КонецЦикла;

	Возврат МассивНомеровСвязанныхЗадач;
КонецФункции

//+ #104 Дзеса Ігор (capitoshko) 08.10.2018

Функция ЗадачаБезПодчененнойИерархии(Ссылка) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ узЗадачи.Ссылка) КАК КоличествоДокументов
	|ИЗ
	|	Справочник.узЗадачи КАК узЗадачи
	|ГДЕ
	|	узЗадачи.ОсновнаяЗадача В ИЕРАРХИИ(&Ссылка)";

	Запрос.УстановитьПараметр("Ссылка", Ссылка);

	ВыборкаДокументов = Запрос.Выполнить().Выбрать();

	ВыборкаДокументов.Следующий();

	Если ВыборкаДокументов.КоличествоДокументов = 0 Тогда
		Возврат Ложь;
	Иначе
		Возврат Истина;
	КонецЕсли;

КонецФункции
//- #104 Дзеса Ігор (capitoshko) 08.10.2018

//+ГЕНА


Процедура ДиапазонПодсказокПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	ДиапазонПодсказокПрежнееЗначение = Элемент.ТекущиеДанные.ЗначениеДо;

	Если Элемент.ТекущийЭлемент = Элементы.ДиапазонПодсказокЗначениеДо Тогда
		Элемент.ТекущиеДанные.ОтключитьУсловноеОформление = Истина
	КонецЕсли;

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

&НаКлиенте

Процедура ДиапазонПодсказокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекущиеДанные.ОтключитьУсловноеОформление = Ложь;

	Если ОтменаРедактирования Тогда
		Если ВернутьЗначениеДиапазону Тогда
			ТекущиеДанные.ЗначениеДо = ДиапазонПодсказокПрежнееЗначение;
			ВернутьЗначениеДиапазону = Ложь;
		КонецЕсли;
		Возврат;
	КонецЕсли;

	Если Не НоваяСтрока И ДиапазонПодсказокПрежнееЗначение = ТекущиеДанные.ЗначениеДо Тогда
		Возврат;
	КонецЕсли;

	ТаблицаДиапазонов = Объект.ДиапазонПодсказокЧисловогоВопроса;

	Если Не НоваяСтрока И ДиапазонПодсказокПрежнееЗначение = ТекущиеДанные.ЗначениеДо Тогда
		Возврат;
	КонецЕсли;

	ПроверитьЗаполнениеДиапазонаПодсказок(ТаблицаДиапазонов, Отказ);

	Если Не Отказ Тогда
		УстановитьПозициюДиапазонаПодсказок(ТаблицаДиапазонов, ТекущиеДанные, ТекущиеДанные.ЗначениеДо);
		УстановитьПредставлениеДиапазонаПодсказокЧисловогоВопроса();
	Иначе
		ВернутьЗначениеДиапазону = Истина;

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

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

&НаКлиенте

Процедура ДиапазонПодсказокПередУдалением(Элемент, Отказ)

	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекущиеДанные.ЗначениеДо = ЗначениеПорогаДиапазонаПодсказокЧисловогоВопроса() Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;

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

&НаКлиенте

Процедура ДиапазонПодсказокПослеУдаления(Элемент)
	УстановитьПредставлениеДиапазонаПодсказокЧисловогоВопроса();
КонецПроцедуры

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

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
//
// Параметры:
//   Команда - КомандаФормы
//
&НаКлиенте

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

&НаКлиенте

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

&НаСервере

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

&НаКлиенте

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

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

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

&НаСервере


Функция ОбъектМетаданныхДоступен(ОбъектМетаданных)

	ЭтоПодсистема = ЭтоПодсистема(ОбъектМетаданных);
	ЭтоЖурналДокументов = ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных);

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

		Если Не ЭтоВыбираемыйОбъект Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;

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

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

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

	СвойстваМетаданного = Новый Структура("ПолнотекстовыйПоиск, ВключатьВКомандныйИнтерфейс");
	ЗаполнитьЗначенияСвойств(СвойстваМетаданного, ОбъектМетаданных);

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

	Если СвойстваМетаданного.ВключатьВКомандныйИнтерфейс = Неопределено Тогда
		ВключатьВКомандныйИнтерфейс = Истина; // Если свойства нет - игнорируем.
	Иначе
		ВключатьВКомандныйИнтерфейс = СвойстваМетаданного.ВключатьВКомандныйИнтерфейс;
	КонецЕсли;

	Возврат ДоступенПоПравам И ДоступенПоФункциональнымОпциям
		И ИспользованиеПолнотекстовогоПоиска И ВключатьВКомандныйИнтерфейс;

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

&НаСервере

Функция ПодчиненныеСправочники(ОбъектМетаданных)

	Если ПодчиненныеСправочники = Неопределено Тогда
		ПодчиненныеСправочники = Новый Соответствие;

		Для Каждого Справочник Из Метаданные.Справочники Цикл
			Если ПодчиненныеСправочники[Справочник] = Неопределено Тогда
				ПодчиненныеСправочники[Справочник] = Новый Массив;
			КонецЕсли;
			Для Каждого ВладелецСправочника Из Справочник.Владельцы Цикл
				Если ПодчиненныеСправочники[ВладелецСправочника] = Неопределено Тогда
					ПодчиненныеСправочники[ВладелецСправочника] = Новый Массив;
				КонецЕсли;
				СписокСправочников = ПодчиненныеСправочники[ВладелецСправочника]; // Массив
				СписокСправочников.Добавить(Справочник);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;

	Возврат ПодчиненныеСправочники[ОбъектМетаданных];

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

&НаКлиенте

Процедура ЗаполнитьДеревоОбъектов(ПриОткрытии = Ложь)

	ИдентификаторыРазворачиваемыхСтрок = Новый Массив;
	ЗаполнитьДеревоОбъектовНаСервере(ПриОткрытии, ИдентификаторыРазворачиваемыхСтрок);

	Если ПриОткрытии
	   И (РодительскиеПодсистемы.Количество() > 0
	      Или КоллекцииВыбираемыхОбъектовМетаданных.Количество() = 1) Тогда

		Элементы.ДеревоОбъектовМетаданных.Развернуть(ИдентификаторыРазворачиваемыхСтрок[0], Истина);
		Возврат;
	КонецЕсли;

	Для Каждого ИдентификаторСтроки Из ИдентификаторыРазворачиваемыхСтрок Цикл
		Элементы.ДеревоОбъектовМетаданных.Развернуть(ИдентификаторСтроки);
	КонецЦикла;

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

&НаСервере

Процедура ЗаполнитьДеревоОбъектовНаСервере(ПриОткрытии, ИдентификаторыРазворачиваемыхСтрок)

	ИдентификаторТекущейСтрокиПриОткрытии = 0;
	ИдентификаторСтрокиПервогоВыбранногоОбъекта = 0;

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

	НачальнаяПометкаКоллекций(ДеревоОбъектовМетаданных);

	Если ДеревоОбъектовМетаданных.ПолучитьЭлементы().Количество() < 1 Тогда
		Возврат;
	КонецЕсли;

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

	// Устанавливаем начальное значение выбора.
	Если (ПриОткрытии Или Не ПометкаВыполнялась)
	   И ИдентификаторТекущейСтрокиПриОткрытии > 0 Тогда

		Элементы.ДеревоОбъектовМетаданных.ТекущаяСтрока = ИдентификаторТекущейСтрокиПриОткрытии;

	ИначеЕсли ЗначениеЗаполнено(ИдентификаторСтрокиПервогоВыбранногоОбъекта) Тогда

		Элементы.ДеревоОбъектовМетаданных.ТекущаяСтрока = ИдентификаторСтрокиПервогоВыбранногоОбъекта;
	КонецЕсли;

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

#Область ПометкаЭлементов

// Параметры:
//  ЭлементДерева - ДанныеФормыЭлементДерева:
//      * Пометка             - Число  - обязательный реквизит дерева.
//      * ЭтоОбъектМетаданных - Булево - обязательный реквизит дерева.
//
&НаКлиентеНаСервереБезКонтекста

Процедура ПриПометкеЭлементаДерева(ЭлементДерева)

	ЭлементДерева.Пометка = СледующееЗначениеПометкиЭлемента(ЭлементДерева);

	Если ТребуетсяПометитьВложенныеЭлементы(ЭлементДерева) Тогда
		ПометитьВложенныеЭлементыРекурсивно(ЭлементДерева);
	КонецЕсли;

	Если ЭлементДерева.Пометка = ПометкаФлажокНеУстановлен() Тогда
		ЭлементДерева.Пометка = ЗначениеПометкиОтносительноВложенныхЭлементов(ЭлементДерева);
	КонецЕсли;

	ПометитьЭлементыРодителейРекурсивно(ЭлементДерева);

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

&НаКлиентеНаСервереБезКонтекста

Функция ПометкаФлажокНеУстановлен()

	Возврат 0;

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

&НаКлиентеНаСервереБезКонтекста

Функция ПометкаФлажокУстановлен()

	Возврат 1;

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

&НаКлиентеНаСервереБезКонтекста

Функция ПометкаКвадрат()

	Возврат 2;

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

// Параметры:
//  ЭлементДерева - ДанныеФормыЭлементДерева:
//      * Пометка             - Число  - обязательный реквизит дерева.
//      * ЭтоОбъектМетаданных - Булево - обязательный реквизит дерева.
//
&НаКлиентеНаСервереБезКонтекста


Функция ТаблицаПереходовНоваяСтрока(ИмяОсновнойСтраницы, ИмяСтраницыНавигации, ИмяСтраницыДекорации = "")

	НоваяСтрока = ТаблицаПереходов.Добавить();

	НоваяСтрока.ПорядковыйНомерПерехода = ТаблицаПереходов.Количество();
	НоваяСтрока.ИмяОсновнойСтраницы     = ИмяОсновнойСтраницы;
	НоваяСтрока.ИмяСтраницыДекорации    = ИмяСтраницыДекорации;
	НоваяСтрока.ИмяСтраницыНавигации    = ИмяСтраницыНавигации;

	Возврат НоваяСтрока;

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

&НаКлиенте

Функция ПолучитьКнопкуФормыПоИмениКоманды(ЭлементФормы, ИмяКоманды)

	Для Каждого Элемент Из ЭлементФормы.ПодчиненныеЭлементы Цикл

		Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда

			ЭлементФормыПоИмениКоманды = ПолучитьКнопкуФормыПоИмениКоманды(Элемент, ИмяКоманды);

			Если ЭлементФормыПоИмениКоманды <> Неопределено Тогда

				Возврат ЭлементФормыПоИмениКоманды;

			КонецЕсли;

		ИначеЕсли ТипЗнч(Элемент) = Тип("КнопкаФормы")
			И СтрНайти(Элемент.ИмяКоманды, ИмяКоманды) > 0 Тогда

			Возврат Элемент;

		Иначе

			Продолжить;

		КонецЕсли;

	КонецЦикла;

	Возврат Неопределено;

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

&НаКлиенте

Процедура ПерейтиДалее()

	ИзменитьПорядковыйНомерПерехода(+1);

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

&НаКлиенте

Процедура ПерейтиНазад()

	ИзменитьПорядковыйНомерПерехода(-1);

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

////////////////////////////////////////////////////////////////////////////////
// Переопределяемая часть - Служебные процедуры и функции

&НаСервере

Процедура УдалитьАвтономноеРабочееМесто(Отказ, СообщениеОбОшибке = "")

	КонтекстУдаления = Новый Структура("АвтономноеРабочееМесто", АвтономноеРабочееМесто);

	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Удаление автономного рабочего места'");
	ПараметрыВыполнения.ЗапуститьНеВФоне = Ложь;
	ПараметрыВыполнения.ЗапуститьВФоне   = Истина;

	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне(
		"АвтономнаяРаботаСлужебный.УдалитьАвтономноеРабочееМесто",
		КонтекстУдаления,
		ПараметрыВыполнения);

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

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

&НаСервереБезКонтекста

Процедура ЗаписатьОшибкуВЖурналРегистрации(СтрокаСообщенияОбОшибке, Событие)

	ЗаписьЖурналаРегистрации(Событие, УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке);

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

////////////////////////////////////////////////////////////////////////////////
// Переопределяемая часть - Обработчики событий переходов

&НаКлиенте

Функция Подключаемый_Ожидание_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее)

	ДлительнаяОперация = Ложь;
	ДлительнаяОперацияЗавершена = Ложь;
	ИдентификаторЗадания = Неопределено;

	СообщениеОбОшибке = "";
	УдалитьАвтономноеРабочееМесто(Отказ, СообщениеОбОшибке);

	Если Отказ Тогда

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

	ИначеЕсли Не ДлительнаяОперация Тогда

		Оповестить("Удаление_АвтономноеРабочееМесто");

	КонецЕсли;

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

&НаКлиенте

Функция Подключаемый_ОжиданиеДлительнаяОперация_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее)

	Если ДлительнаяОперация Тогда

		ПерейтиДалее = Ложь;

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

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

	КонецЕсли;

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

&НаКлиенте

Функция Подключаемый_ОжиданиеДлительнаяОперацияОкончание_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее)

	Если ДлительнаяОперацияЗавершена Тогда

		Оповестить("Удаление_АвтономноеРабочееМесто");

	КонецЕсли;

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

&НаСервереБезКонтекста

Функция ЗаданиеВыполнено(ИдентификаторЗадания)

	Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);

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

////////////////////////////////////////////////////////////////////////////////
// Переопределяемая часть - Инициализация переходов помощника

&НаСервере

Процедура УстановитьОсновнойСценарий()

	ТаблицаПереходов.Очистить();

	НовыйПереход = ТаблицаПереходовНоваяСтрока("Начало", "СтраницаНавигацииНачало");

	НовыйПереход = ТаблицаПереходовНоваяСтрока("Ожидание", "СтраницаНавигацииОжидание");
	НовыйПереход.ДлительнаяОперация = Истина;
	НовыйПереход.ИмяОбработчикаДлительнойОперации = "Подключаемый_Ожидание_ОбработкаДлительнойОперации";

	НовыйПереход = ТаблицаПереходовНоваяСтрока("Ожидание", "СтраницаНавигацииОжидание");
	НовыйПереход.ДлительнаяОперация = Истина;
	НовыйПереход.ИмяОбработчикаДлительнойОперации = "Подключаемый_ОжиданиеДлительнаяОперация_ОбработкаДлительнойОперации";

	НовыйПереход = ТаблицаПереходовНоваяСтрока("Ожидание", "СтраницаНавигацииОжидание");
	НовыйПереход.ДлительнаяОперация = Истина;
	НовыйПереход.ИмяОбработчикаДлительнойОперации = "Подключаемый_ОжиданиеДлительнаяОперацияОкончание_ОбработкаДлительнойОперации";

	НовыйПереход = ТаблицаПереходовНоваяСтрока("Завершение", "СтраницаНавигацииОкончание");

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

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


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

	ПредставлениеИстина = НСтр("ru='Все варианты отчетов'");
	ПредставлениеЛожь = НСтр("ru='Для компьютеров и планшетов'");
	Элементы.ОтображатьВсеВариантыОтчетов.ФорматРедактирования = "БЛ='" + ПредставлениеЛожь + "'; БИ='"
		+ ПредставлениеИстина + "'";
	ОпределитьПоведениеВМобильномКлиенте();

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

	ПараметрыКлиента = ВариантыОтчетов.ПараметрыКлиента();
	ПараметрыКлиента.Вставить("ПутьКПодсистеме", Параметры.ПутьКПодсистеме);

	КартинкаБыстрыйДоступ = БиблиотекаКартинок.БыстрыйДоступ;

	ЭлементыСтиля = Метаданные.ЭлементыСтиля;

	ЦветСкрытыхВариантов = ЭлементыСтиля.СкрытыйВариантОтчетаЦвет.Значение;
	ЦветСкрытыхПоНазначениюВариантов = ЭлементыСтиля.ЗаблокированныйРеквизитЦвет.Значение;
	ЦветВидимыхВариантов = ЭлементыСтиля.ГиперссылкаЦвет.Значение;
	ЦветПодсветкиНайденныхСлов = ЭлементыСтиля.ФонРезультатовПоиска.Значение;
	ЦветПодсказки = ЭлементыСтиля.ПоясняющийТекст.Значение;
	ЦветГруппыВариантовОтчетов = ЭлементыСтиля.ГруппаВариантовОтчетовЦвет.Значение;

	ШрифтВажнойГруппы = ЭлементыСтиля.ГруппаВариантовОтчетовВажнаяШрифт.Значение;
	ШрифтОбычнойГруппы = ЭлементыСтиля.ГруппаВариантовОтчетовОбычнаяШрифт.Значение;
	ШрифтРаздела = ЭлементыСтиля.РазделВариантовОтчетовШрифт.Значение;
	ШрифтВажнойНадписи = ЭлементыСтиля.ВажнаяНадписьШрифт.Значение;

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

	ГлобальныеНастройки = ВариантыОтчетов.ГлобальныеНастройки();
	Элементы.СтрокаПоиска.ПодсказкаВвода = ГлобальныеНастройки.Поиск.ПодсказкаВвода;

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

	ЦветРаздела = ЦветГруппыВариантовОтчетов;

	Элементы.БыстрыйДоступШапкаНадпись.Шрифт = ШрифтВажнойГруппы;
	Элементы.БыстрыйДоступШапкаНадпись.ЦветТекста = ЦветГруппыВариантовОтчетов;

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

	Для Каждого Команда Из Команды Цикл
		ПостоянныеКоманды.Добавить(Команда.Имя);
	КонецЦикла;

	// Чтение пользовательской настройки, общей для всех панелей отчетов.
	ЗагрузитьВсеНастройки();

	Если Параметры.Свойство("СтрокаПоиска") Тогда
		СтрокаПоиска = Параметры.СтрокаПоиска;
	КонецЕсли;
	Если Параметры.Свойство("ИскатьВоВсехРазделах") Тогда
		ИскатьВоВсехРазделах = Параметры.ИскатьВоВсехРазделах;
	Иначе
		ИскатьВоВсехРазделах = Истина;
	КонецЕсли;

	ОпределитьПодсистемыИЗаголовок(Параметры);
	ДлительнаяОперация = ОбновитьПанельОтчетовНаСервере();

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

&НаКлиенте

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

&НаКлиенте

Процедура ОбновитьПанельОтчетовЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

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

&НаКлиенте

Процедура ПриПовторномОткрытии()
	Если РежимНастройки Или ЗначениеЗаполнено(СтрокаПоиска) Тогда
		РежимНастройки = Ложь;
		СтрокаПоиска = "";
		ОбновитьПанельОтчетовНаКлиенте("ПриПовторномОткрытии");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

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

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

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

// Параметры:
//  Элемент - ДекорацияФормы
//
&НаКлиенте

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

// Параметры:
//  Элемент - ПолеФормы
//
&НаКлиенте

Процедура Подключаемый_ВидимостьВариантаПриИзменении(Элемент)
	Флажок = Элемент;
	Показать = ЭтотОбъект[Флажок.Имя];

	НадписьИмя = Сред(Флажок.Имя, СтрДлина("Флажок_")+1);
	Вариант = НайтиВариантПоИмениЭлемента(НадписьИмя);
	Элемент = Элементы.Найти(НадписьИмя);
	Если Вариант = Неопределено Или Элемент = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПоказатьСкрытьВариант(Вариант, Элемент, Показать);
КонецПроцедуры

&НаКлиенте

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

&НаКлиенте

Функция ВведенаСлишкомКороткаяСтрокаПоиска(Текст)
	Текст = СокрЛП(Текст);
	Если СтрДлина(Текст) < 2 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Введена слишком короткая строка поиска.'"));
		Возврат Истина;
	КонецЕсли;

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

	Возврат Ложь;
КонецФункции

&НаКлиенте

Процедура СтрокаПоискаПриИзменении(Элемент)
	Если Не ПустаяСтрока(СтрокаПоиска) И ВведенаСлишкомКороткаяСтрокаПоиска(СтрокаПоиска) Тогда
		СтрокаПоиска = "";
		ТекущийЭлемент = Элементы.СтрокаПоиска;
		Возврат;
	КонецЕсли;

	ОбновитьПанельОтчетовНаКлиенте("СтрокаПоискаПриИзменении");

	Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
		ТекущийЭлемент = Элементы.СтрокаПоиска;
	КонецЕсли;
КонецПроцедуры

// Параметры:
//  Элемент - ДекорацияФормы
//
&НаКлиенте


Функция ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит, НастройкиПечатныхФормВр = Неопределено)

	Если НастройкиПечатныхФормВр = Неопределено Тогда
		НастройкиПечатныхФормВр = НастройкиПечатныхФорм;
	КонецЕсли;

	Результат = "";

	Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВр Цикл

		Если Не ВыводДоступен() Тогда
			Продолжить;
		КонецЕсли;

		Если ПустаяСтрока(Результат) Тогда
			Результат = НастройкаПечатнойФормы.Название;
		Иначе
			Результат = НСтр("ru = 'Документы'");
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если ПереводитьИменаФайловВТранслит Тогда
		Результат = СтроковыеФункции.СтрокаЛатиницей(Результат);
	КонецЕсли;

	Возврат Результат + ".zip";

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

&НаСервереБезКонтекста

Функция НастройкиСохранения()

	Возврат УправлениеПечатью.НастройкиСохранения();

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

&НаСервере

Функция ВыводДоступен()
	Возврат ПравоДоступа("Вывод", Метаданные);
КонецФункции

&НаКлиенте

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

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

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

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

// Параметры:
//  ПараметрыПодготовки - см. УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов
//
&НаКлиенте

Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки)

	УправлениеПечатьюКлиент.ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);

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

&НаКлиенте

Процедура ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога) Экспорт

	СохраняемыеФайлы = Новый Массив;

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

	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
	ПараметрыСохранения.Диалог.Каталог = ИмяКаталога;
	ПараметрыСохранения.Интерактивно = Не ЗначениеЗаполнено(ИмяКаталога);
	ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);

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

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

&НаКлиенте

Процедура ОткрытьПапкуСохранения(ИмяКаталога) Экспорт
	ФайловаяСистемаКлиент.ОткрытьПроводник(ИмяКаталога);
КонецПроцедуры

&НаСервере

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

&НаКлиенте

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

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

&НаКлиенте

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

&НаКлиенте

Процедура НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение)
	ДлительнаяОперация = ДлительнаяОперацияПолученияПечатныхФорм(СтруктураЕдиногоДокумента);
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания());
КонецПроцедуры

&НаСервереБезКонтекста

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


Процедура ЗагрузитьДанные(ОтборПрофилейТолькоТекущегоПользователя)

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

	УстановитьПривилегированныйРежим(Истина);
	РезультатыЗапроса = Запрос.ВыполнитьПакет();
	УстановитьПривилегированныйРежим(Ложь);

	ЗначениеВРеквизитФормы(РезультатыЗапроса[1].Выгрузить(), "Профили");
	ЗначениеВРеквизитФормы(РезультатыЗапроса[2].Выгрузить(), "ВидыДоступа");
	ЗначениеВРеквизитФормы(РезультатыЗапроса[3].Выгрузить(), "ЗначенияДоступа");

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

&НаСервере


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

	ФорматированныйДокумент = Новый ФорматированныйДокумент;
	ФорматированныйДокумент.УстановитьФорматированнуюСтроку(Строка);

	Для Каждого Элемент Из ПараметрыЗамены Цикл
		ПодстрокаПоиска = Элемент.Ключ;
		ПодстрокаЗамены = Элемент.Значение;

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

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

	Возврат ФорматированныйДокумент.ПолучитьФорматированнуюСтроку();

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

&НаСервере

Функция ФормулыИзТекста(Знач Текст)

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

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

&НаСервере

Функция ФормулаИзПредставления(Представление)

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

	Возврат Представление;

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

&НаСервере

Функция ПредставленияПараметровТекста(Знач Текст)

	Результат = Новый Соответствие();

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

	Возврат Результат;

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

&НаСервере

Функция ПрочитатьМакет(ДвоичныеДанные = Неопределено)

	КодЯзыка = ТабличныйДокумент.КодЯзыка;

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

	Макет = СкопироватьТабличныйДокумент(ТабличныйДокумент, КодЯзыка);

	Если Не ЭтоПечатнаяФорма Тогда
		Возврат Макет;
	КонецЕсли;

	ОбработанныеОбласти = Новый Соответствие();

	Для НомерСтроки = 1 По Макет.ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
			Область = Макет.Область(НомерСтроки, НомерКолонки);

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

			Если ЗначениеЗаполнено(Область.Текст) Тогда
				ЗаменитьПараметрыПредставлениями(Область.Текст);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	ЗаменитьПараметрыПредставлениями(Макет.ВерхнийКолонтитул.ТекстСлева);
	ЗаменитьПараметрыПредставлениями(Макет.ВерхнийКолонтитул.ТекстВЦентре);
	ЗаменитьПараметрыПредставлениями(Макет.ВерхнийКолонтитул.ТекстСправа);
	ЗаменитьПараметрыПредставлениями(Макет.НижнийКолонтитул.ТекстСлева);
	ЗаменитьПараметрыПредставлениями(Макет.НижнийКолонтитул.ТекстВЦентре);
	ЗаменитьПараметрыПредставлениями(Макет.НижнийКолонтитул.ТекстСправа);

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

	Возврат Макет;

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

&НаСервере

Процедура ЗаменитьПараметрыПредставлениями(Строка)

	ПараметрыЗамены = ПредставленияПараметровТекста(Строка(Строка));

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

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

&НаСервере

Функция ПредставлениеФормулы(Знач Формула)

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

	Возврат Формула;

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

// Возвращаемое значение:
//  ТабличныйДокумент
//
&НаСервереБезКонтекста

Функция СкопироватьТабличныйДокумент(ТабличныйДокумент, КодЯзыка)

	Результат = Новый ТабличныйДокумент;
	Результат.Макет = ТабличныйДокумент.Макет;
	Результат.КодЯзыка = КодЯзыка;
	Результат.Вывести(ТабличныйДокумент);

	СистемнаяИнформация = Новый СистемнаяИнформация;
	ЕстьФорматСтрок = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.22.1923") >= 0;

	ОбработанныеЯчейки = Новый Соответствие;
	Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
		Для НомерСтолбца = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
			КопируемаяЯчейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);

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

			Если КопируемаяЯчейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Текст Тогда
				Продолжить;
			КонецЕсли;

			Ячейка = Результат.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
			ЗаполнитьЗначенияСвойств(Ячейка, КопируемаяЯчейка, , ?(ЕстьФорматСтрок, "ФорматСтрок", Неопределено));

			Если КопируемаяЯчейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
				Ячейка.Текст = КопируемаяЯчейка.Текст;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	Результат.ВерхнийКолонтитул.ТекстСлева = ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева;
	Результат.ВерхнийКолонтитул.ТекстВЦентре = ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре;
	Результат.ВерхнийКолонтитул.ТекстСправа = ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа;
	Результат.НижнийКолонтитул.ТекстСлева = ТабличныйДокумент.НижнийКолонтитул.ТекстСлева;
	Результат.НижнийКолонтитул.ТекстВЦентре = ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре;
	Результат.НижнийКолонтитул.ТекстСправа = ТабличныйДокумент.НижнийКолонтитул.ТекстСправа;

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

	Возврат Результат;

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

&НаКлиентеНаСервереБезКонтекста

Процедура ПрочитатьТекстВПолеКолонтитула(Знач Текст, Колонтитул)

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

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

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

&НаКлиенте