Загрузка данных


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

#Область РЛС


// Процедура выполняет действие:
//   Определить Доступность Хотябы Одного Элемента
//
// Параметры:
//     ЭлементСписок - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ОпределитьДоступностьХотябыОдногоЭлемента( ЭлементСписок ) Экспорт

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

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


// Процедура выполняет действие:
//   Получить Текст Письма Из Макета
//
// Параметры:
//     ЛицензияМП - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьТекстПисьмаИзМакета(ЛицензияМП) Экспорт

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



// Функция - Получить текст письма из макета для блоков функционала
// 
// Возвращаемое значение:
//   - Произвольный
//
Функция ПолучитьТекстПисьмаИзМакетаДляБлоковФункционала() Экспорт

	Шаблон = ПолучитьОбщийМакет("ИТ_ЗапросАктивацииМП").ПолучитьТекст();
	
	Шаблон = СтрЗаменить(Шаблон, " на блок обмена с мобильным приложением", " на используемые блоки функционала");
	
	СерийныйНомерКлюча = ИТ_МобильноеПриложениеСервер.ПолучитьСерийныйНомерКлюча();
		
	Шаблон = СтрЗаменить(Шаблон, "%ID_ключа_защиты%", СерийныйНомерКлюча);
	Возврат Шаблон;
	
КонецФункции


// Процедура выполняет действие:
//   Получить Структуру Данных Проведения S L A
//
// Параметры:
//     Ссылка - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьСтруктуруДанныхПроведенияSLA(Ссылка)Экспорт
		
	Если Не ЗначениеЗаполнено(Ссылка) Тогда
		
		Возврат Новый Структура("Статус, ТекстОшибки", "Не проведен", "Документ не записан");
		
	Иначе
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		" ВЫБРАТЬ   РАЗРЕШЕННЫЕ  
		|	ИТ_СтатусыПроведенияSLA.Проведен,
		|	ИТ_СтатусыПроведенияSLA.ОписаниеОшибок
		| ИЗ 
		|	РегистрСведений.ИТ_СтатусыПроведенияSLA КАК  ИТ_СтатусыПроведенияSLA
		| ГДЕ 
		|	ИТ_СтатусыПроведенияSLA.ИспользуемыйДокумент = &Документ";
		
		Запрос.УстановитьПараметр( "Документ" , Ссылка);
		
		Результат = Запрос.Выполнить();
		Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
		
		Если Выборка.Следующий() Тогда
			
			Если Выборка.Проведен Тогда
				
				Возврат Новый Структура("Статус, ТекстОшибки", "Проведен", "");
				
			Иначе
				
				Если ПустаяСтрока(Выборка.ОписаниеОшибок)  Тогда
					
					Возврат Новый Структура("Статус, ТекстОшибки", "Ожидает проведения", Неопределено);
					
				Иначе
					
					Возврат Новый Структура("Статус, ТекстОшибки", "Ошибка проведения", Выборка.ОписаниеОшибок );
					
				КонецЕсли;
				
				
				
			КонецЕсли; 
			
		Иначе
			
			Возврат Новый Структура("Статус, ТекстОшибки", "Не проведен", "Документ не записан");
			
		КонецЕсли;  
		
	КонецЕсли; 
	
КонецФункции


// Процедура выполняет действие:
//   Получить Массив Контрагентов Клиента
//
// Параметры:
//     Клиент - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьМассивКонтрагентовКлиента(Клиент)Экспорт
	
	Запрос = новый Запрос;
	Запрос.Текст =" ВЫБРАТЬ   РАЗРЕШЕННЫЕ 
	              |	Клиенты.Ссылка КАК  Клиент,
	              |	Клиенты.Контрагент КАК  Контрагент
	              | ИЗ 
	              |	Справочник.Клиенты КАК  Клиенты
	              | ГДЕ 
	              |	 ВЫБОР 
	              |			 КОГДА   НЕ  &КлиентХолдинг
	              |					 И   НЕ  &КлиентЮрЛицо
	              |				  ТОГДА   Клиенты.Ссылка = &Клиент
	              |			 КОГДА  &КлиентХолдинг
	              |					 ИЛИ  &КлиентЮрЛицо
	              |				  ТОГДА   Клиенты.Ссылка В  ИЕРАРХИИ  (&Клиент)
	              |			 ИНАЧЕ   ЛОЖЬ 
	              |		 КОНЕЦ 
	              |	 И  Клиенты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";
	
	Запрос.УстановитьПараметр("Клиент",Клиент);
	Запрос.УстановитьПараметр("КлиентХолдинг",Клиент.Холдинг);
	Запрос.УстановитьПараметр("КлиентЮрЛицо",Клиент.ЮридическоеЛицо);
	
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Контрагент");
	
	
КонецФункции


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


// Процедура выполняет действие:
//   Получить Список Документов Коллективного S L A Клиента
//
// Параметры:
//     Клиент - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьСписокДокументовКоллективногоSLAКлиента(Клиент) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		" ВЫБРАТЬ   РАЗРЕШЕННЫЕ   РАЗЛИЧНЫЕ 
		|	ДоговорПодразделения.Клиент КАК  Клиент,
		|	ДоговорПодразделения.Ссылка КАК  Договор
		| ПОМЕСТИТЬ  ВТ
		| ИЗ 
		|	Документ.Договор.Подразделения КАК  ДоговорПодразделения
		| ГДЕ 
		|	ДоговорПодразделения.Клиент.Холдинг
		|
		| ОБЪЕДИНИТЬ   ВСЕ 
		|
		| ВЫБРАТЬ 
		|	ДоговорПодразделения.Клиент,
		|	ДоговорПодразделения.Ссылка
		| ИЗ 
		|	Документ.Договор.Подразделения КАК  ДоговорПодразделения
		| ГДЕ 
		|	ДоговорПодразделения.Клиент.ЮридическоеЛицо
		|
		|ИНДЕКСИРОВАТЬ  ПО 
		|	Клиент
		|;
		|
		|//////////////////////////////////////////////////////////////////////////////// 
		| ВЫБРАТЬ 
		|	ВТ.Клиент КАК  Клиент,
		|	ВТ.Договор КАК  Ссылка
		| ИЗ 
		|	ВТ КАК  ВТ
		| ГДЕ 
		|	ВТ.Клиент В(&КлиентСписок)
		|
		| ОБЪЕДИНИТЬ   ВСЕ 
		|
		| ВЫБРАТЬ 
		|	ДоговорПодразделения.Клиент,
		|	ДоговорПодразделения.Ссылка
		| ИЗ 
		|	Документ.Договор.Подразделения КАК  ДоговорПодразделения
		| ГДЕ 
		|	 НЕ  ДоговорПодразделения.Клиент.ЮридическоеЛицо
		|	 И   НЕ  ДоговорПодразделения.Клиент.Холдинг
		|	 И  ДоговорПодразделения.Клиент = &Клиент";
	
	Запрос.УстановитьПараметр("КлиентСписок", ПолучитьИерархиюКлиента(Клиент));
	Запрос.УстановитьПараметр("Клиент", Клиент);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	СписокЗначений = Новый СписокЗначений;
	СписокЗначений.ЗагрузитьЗначения( РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка") );
	
	Возврат СписокЗначений;
	
КонецФункции


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

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


// Процедура выполняет действие:
//   Скопировать Структуру
//
// Параметры:
//     Структура - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция СкопироватьСтруктуру(Структура)Экспорт

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

    Возврат СтрВозврата;
    
КонецФункции  // ()


// Процедура выполняет действие:
//   Получить Текст Будет Создан При Записи
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьТекстБудетСозданПриЗаписи()Экспорт

	Возврат НСтр("ru = '<будет создан при записи>'");

КонецФункции  // ()


// Процедура выполняет действие:
//   Получить Контактное Лицо По Физ Лицу
//
// Параметры:
//     ФизЛицо - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьКонтактноеЛицоПоФизЛицу(ФизЛицо) Экспорт
	
	Если ЗначениеЗаполнено(ФизЛицо) Тогда
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		" ВЫБРАТЬ   РАЗРЕШЕННЫЕ    ПЕРВЫЕ  1
		|	ИТ_КонтактныеЛица.Ссылка
		| ИЗ 
		|	Справочник.ИТ_КонтактныеЛица КАК  ИТ_КонтактныеЛица
		| ГДЕ 
		|	ИТ_КонтактныеЛица.ФизЛицо = &ФизЛицо";
		
		Запрос.УстановитьПараметр( "ФизЛицо" , ФизЛицо );
		
		Результат = Запрос.Выполнить();
		Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
		
		Пока Выборка.Следующий() Цикл
		
			Возврат Выборка.ссылка;
		
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат Справочники.ИТ_КонтактныеЛица.ПустаяСсылка();
	
КонецФункции  // ПолучитьКонтактноеЛицоПоФизЛицу(ФизЛицо)


// Процедура выполняет действие:
//   Получить Строку Без Спец Символов Для Наименования
//
// Параметры:
//     Строка - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьСтрокуБезСпецСимволовДляНаименования(Строка) Экспорт
	
	Строка = СтрЗаменить(Строка," ","_");
	Строка = СтрЗаменить(Строка,"(","_");
	Строка = СтрЗаменить(Строка,")","_");
	
	Строка = СтрЗаменить(Строка,"!","_");
	Строка = СтрЗаменить(Строка,"?","_");
	Строка = СтрЗаменить(Строка,"-","_");
	
	Строка = СтрЗаменить(Строка,"""","_");  // Кавычки
	Строка = СтрЗаменить(Строка,"'","_");
	Строка = СтрЗаменить(Строка,"/","_");
	Строка = СтрЗаменить(Строка,"\","_");
	Строка = СтрЗаменить(Строка,"+","_");
	Строка = СтрЗаменить(Строка,"=","_");
	Строка = СтрЗаменить(Строка,"%","_");
	Строка = СтрЗаменить(Строка,"$","_");
	Строка = СтрЗаменить(Строка,"#","_");
	Строка = СтрЗаменить(Строка,"@","_");
	Строка = СтрЗаменить(Строка,"&","_");
	Строка = СтрЗаменить(Строка,"*","_");
	Строка = СтрЗаменить(Строка,"|","_");
	Строка = СтрЗаменить(Строка,".","_");
	Строка = СтрЗаменить(Строка,",","_");
	Строка = СтрЗаменить(Строка,";","_");
	Строка = СтрЗаменить(Строка,"`","_");
	Строка = СтрЗаменить(Строка,"~","_");
	Строка = СтрЗаменить(Строка,"[","_");
	Строка = СтрЗаменить(Строка,"]","_");	
	Строка = СтрЗаменить(Строка,"«","_");	
	Строка = СтрЗаменить(Строка,"»","_");		
	Строка = СтрЗаменить(Строка,":","_");	
	Строка = СтрЗаменить(Строка,">","_");	
	Строка = СтрЗаменить(Строка,"<","_");	
	
	Возврат Строка
	
КонецФункции  // ПолучитьСтрокуБезСпецСимволов

// Процедура выполняет действие: УстановитьКодЗакрытия(Состояние, КодЗакрытия)
//
// Параметры:
//     Состояние - Произвольный 
//     СсылкаНаОбъект - Произвольный 
//     КодЗакрытия - Произвольный
Процедура УстановитьКодЗакрытияИзФормы( Состояние, СсылкаНаОбъект ,КодЗакрытия ) Экспорт

	Если 	Состояние <> СсылкаНаОбъект.Состояние и 
			Состояние.ТребоватьЗаполнениеКодаЗакрытия и
			Не ЗначениеЗаполнено(КодЗакрытия) Тогда
			
		КодЗакрытия = Состояние.КодЗакрытия;
	         
	КонецЕсли;

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


// ////////////////////////////////////////////////////////////////////////////
// ////  Оповещения текущего сотрудника (начало)////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьОповещенияТекущегоСотрудника() Экспорт
    
    ТекущийСотрудник = ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийСотрудник");        

    Запрос = Новый Запрос;
    Запрос.Текст = 
        " ВЫБРАТЬ   РАЗРЕШЕННЫЕ  
        |   ИТ_ОповещаемыеПоНовымДокументам.Сотрудник,
        |   ИТ_ОповещаемыеПоНовымДокументам.ИД,
        |   ИТ_ОповещаемыеПоНовымДокументам.ИспользуемыйДокумент КАК Документ,
        |   ИТ_ОповещаемыеПоНовымДокументам.Текст
        | ИЗ 
        |   РегистрСведений.ИТ_ОповещаемыеПоНовымДокументам КАК  ИТ_ОповещаемыеПоНовымДокументам
        | ГДЕ 
        |   ИТ_ОповещаемыеПоНовымДокументам.Сотрудник = &Сотрудник";

    Запрос.УстановитьПараметр("Сотрудник", ТекущийСотрудник );

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

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

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

    Возврат Массив;


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

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

// ////////////////////////////////////////////////////////////////////////////
// ////  Оповещения текущего сотрудника (окончание)/////////////////////////////
// ////////////////////////////////////////////////////////////////////////////
//
// Параметры:
//     Объект - Произвольный 
//     ИнтерактивноеРедактирование - Произвольный
Процедура УстановитьКодЗакрытияИзМодуля( Объект , ИнтерактивноеРедактирование ) Экспорт

	Если	Не ИнтерактивноеРедактирование и 
			Объект.Состояние.ТребоватьЗаполнениеКодаЗакрытия и
			Не ЗначениеЗаполнено(Объект.КодЗакрытия) Тогда
			
		Объект.КодЗакрытия = Объект.Состояние.КодЗакрытия;
	         
	КонецЕсли;

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


// Процедура выполняет действие:
//   Выполнить Серверные Действия При Начале Работы Системы
//
// Возвращаемое значение:
//    Произвольный
Функция ВыполнитьСерверныеДействияПриНачалеРаботыСистемы() Экспорт
 
	Структура = Новый Структура("ЗавершитьРаботуСистемы, Текст, ЭтоИтилиум", Ложь, "",  ЛОЖЬ );

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

// Работа  с допполями
//
// Параметры:
//     СтрокаДействия - Произвольный 
//     СсылкаНаДокумент - Произвольный 
//     ОбъектДопПоля - Произвольный 
//     ДопПоля - Произвольный
//     Клиент - Произвольный
//     ОргПодразделение - Произвольный
Процедура ЗаполнитьТаблицуДопПоля(СтрокаДействия, СсылкаНаДокумент,  ОбъектДопПоля, ДопПоля, Клиент = Неопределено, ОргПодразделение = Неопределено) Экспорт
	
	Если НЕ ПолучитьФункциональнуюОпцию("Использовать_ДопПоля") Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Инцидент")
		ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Наряд")
		ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Изменение")
		ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Релиз")
		ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.Проблема")
		ИЛИ ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.ИТ_Событие")
	Тогда
		
		Если Клиент = Неопределено Тогда
			Клиент = СсылкаНаДокумент.Клиент;
		КонецЕсли;
		Если ОргПодразделение = Неопределено Тогда
			ОргПодразделение = СсылкаНаДокумент.ОргПодразделение;
		КонецЕсли;
	КонецЕсли;
	
	Если ТипЗнч(СсылкаНаДокумент) = Тип("СправочникСсылка.Клиенты")	Тогда
		Клиент = СсылкаНаДокумент;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	ИмяРеквизита = ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент);
	Если ИмяРеквизита = "ИТ_Событие" Тогда
		ИмяРеквизита = "Событие";
	ИначеЕсли ИмяРеквизита = "ИТ_ШаблоныНарядов" Тогда
		ИмяРеквизита = "ШаблоныНарядов";
	КонецЕсли;
	
	Если РольДоступна(Метаданные.Роли.ПотребительУслуг) или 
		РольДоступна(Метаданные.Роли.ПотребительУслугКуратор) Тогда
		
		ТекстПараметра = " ДопПоля.ВидимостьДляПользователя ";
		УчитыватьВидимостьДляПользователя = Истина;
	Иначе
		ТекстПараметра = "  ИСТИНА  ";
		УчитыватьВидимостьДляПользователя = Ложь;
	КонецЕсли;
	
	ДопПоляНаименованиеПоля = ПолучитьНаименованиеТЧДопПолейПоСсылкеДокумента(СсылкаНаДокумент);
	
	Если ПолучитьФункциональнуюОпцию("ИТ_ИспользоватьНаборыДопПолей") И ДопПоляНаименованиеПоля <> "" Тогда
		Если ИмяРеквизита = "ШаблоныИнцидентов" Тогда
			ИмяРеквизита = "Инцидент";
		ИначеЕсли ИмяРеквизита = "ИТ_ШаблоныНарядов" ИЛИ ИмяРеквизита = "ШаблоныНарядов" Тогда
			ИмяРеквизита = "Наряд";
		ИначеЕсли ИмяРеквизита = "ШаблоныСобытий" Тогда
			ИмяРеквизита = "Событие";
		КонецЕсли;
		
		Если Клиент <> Неопределено Тогда
			СписокКлиентовПоИерархии = ПолучениеЗначенийСервер.ПолучитьСписокКлиентовИерархически(Клиент);
		Иначе
			СписокКлиентовПоИерархии = Новый СписокЗначений;
		КонецЕсли;
		
		Запрос = Новый Запрос;
		Запрос.Текст =" ВЫБРАТЬ   РАЗРЕШЕННЫЕ  
		|	СвойстваДокументов.ИспользуемыйДокумент КАК Документ,
		|	СвойстваДокументов.Свойство,
		|	СвойстваДокументов.Значение
		| ПОМЕСТИТЬ  ТабСвойстваДокументов
		| ИЗ 
		|	РегистрСведений.СвойстваДокументов КАК  СвойстваДокументов
		| ГДЕ 
		|	СвойстваДокументов.ИспользуемыйДокумент = &Документ
		|;
		|
		|//////////////////////////////////////////////////////////////////////////////// 
		| ВЫБРАТЬ 
		|	ДополнительныеПоля.Ссылка,
		|	ДополнительныеПоля.ВидимостьДляПользователя
		| ПОМЕСТИТЬ  ДопПоля
		| ИЗ 
		|	ПланВидовХарактеристик.ДополнительныеПоля КАК  ДополнительныеПоля 	
		| ГДЕ  "
		+ ?(УчитыватьВидимостьДляПользователя, " ДополнительныеПоля.ВидимостьДляПользователя =  ИСТИНА   И  ","") + "
		|	ДополнительныеПоля.ПометкаУдаления =  ЛОЖЬ 
		|	 И  ДополнительныеПоля." + ИмяРеквизита + " =  ИСТИНА  
		|;
		|//////////////////////////////////////////////////////////////////////////////// 
		|
		| ВЫБРАТЬ
		| 	Клиенты.Ссылка КАК Клиент
		| ПОМЕСТИТЬ ВТ
		| ИЗ
		| 	Справочник.Клиенты КАК Клиенты
		| ГДЕ
		|	Клиенты.Ссылка В (&СписокКлиентовПоИерархии)
		| ;
		|////////////////////////////////////////////////////////////////////////////////
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ИспользоватьИерархию КАК ИспользоватьИерархию,
		| 	НаборыДопПолей.Клиент КАК Клиент,
		| 	НаборыДопПолей.ОргПодразделение КАК ОргПодразделение
		| ПОМЕСТИТЬ ПоляНаборов
		| ИЗ
		| 	Справочник.НаборыДопПолей КАК НаборыДопПолей
		| ;
		| ////////////////////////////////////////////////////////////////////////////////
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ДополнительноеПоле КАК ДополнительноеПоле 
		| ПОМЕСТИТЬ ДопПоляИзНаборов
		| ИЗ
		| 	Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
		| ГДЕ
		| 	НаборыДопПолей.Ссылка.Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
		| 	И НаборыДопПолей.Ссылка.ОргПодразделение = ЗНАЧЕНИЕ(Справочник.ОрганизационныеПодразделения.ПустаяСсылка)
		|	И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
		| 
		| ОБЪЕДИНИТЬ
		| 
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ДополнительноеПоле
		| ИЗ
		| 	Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
		| ГДЕ
		| 	НаборыДопПолей.Ссылка.ОргПодразделение = ЗНАЧЕНИЕ(Справочник.ОрганизационныеПодразделения.ПустаяСсылка)
		| 	И НаборыДопПолей.Ссылка.Клиент = &Клиент
		| 	И НаборыДопПолей.Ссылка.ИспользоватьИерархию = ЛОЖЬ
		|	И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
		| 
		| ОБЪЕДИНИТЬ
		| 
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ДополнительноеПоле 
		| ИЗ
		| 	Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
		| 	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
		| 	ПО НаборыДопПолей.Ссылка.Клиент = ВТ.Клиент
		| 		И (НаборыДопПолей.Ссылка.ИспользоватьИерархию)
		| ГДЕ
		| 	НаборыДопПолей.Ссылка.ОргПодразделение = ЗНАЧЕНИЕ(Справочник.ОрганизационныеПодразделения.ПустаяСсылка)
		|	И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
		| 
		| ОБЪЕДИНИТЬ
		| 
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ДополнительноеПоле 
		| ИЗ
		| 	Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
		| ГДЕ
		| 	НаборыДопПолей.Ссылка.ОргПодразделение = &ОргПодразделение
		| 	И НаборыДопПолей.Ссылка.Клиент = &Клиент
		| 	И НаборыДопПолей.Ссылка.ИспользоватьИерархию = ЛОЖЬ
		|	И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
		| 
		| ОБЪЕДИНИТЬ
		| 
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ДополнительноеПоле 
		| ИЗ
		| 	Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей
		| 	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
		| 	ПО НаборыДопПолей.Ссылка.Клиент = ВТ.Клиент
		| 		И (НаборыДопПолей.Ссылка.ИспользоватьИерархию)
		| ГДЕ
		| 	НаборыДопПолей.Ссылка.ОргПодразделение = &ОргПодразделение
		|	И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
		| 
		| ОБЪЕДИНИТЬ
		| 
		| ВЫБРАТЬ
		| 	НаборыДопПолей.ДополнительноеПоле 
		| ИЗ
		| 	Справочник.НаборыДопПолей.%ДопПоляНаименованиеПоля% КАК НаборыДопПолей 
		| ГДЕ
		| 	НаборыДопПолей.Ссылка.ОргПодразделение = &ОргПодразделение
		| 	И НаборыДопПолей.Ссылка.Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
		|	И НЕ НаборыДопПолей.ДополнительноеПоле.ПометкаУдаления
		| ;
		|//////////////////////////////////////////////////////////////////////////////// 
		| ВЫБРАТЬ
		| 	ДопПоля.Ссылка КАК Ссылка,
		|	ДопПоля.ВидимостьДляПользователя КАК ВидимостьДляПользователя
		| ПОМЕСТИТЬ ДопПоляПослеОбработки
		| ИЗ
		| 	ДопПоляИзНаборов КАК ДопПоляИзНаборов
		|		ЛЕВОЕ СОЕДИНЕНИЕ ДопПоля КАК ДопПоля
		|			ПО ДопПоля.Ссылка = ДопПоляИзНаборов.ДополнительноеПоле
		| ;
		|//////////////////////////////////////////////////////////////////////////////// 
		| ВЫБРАТЬ 
		|	ТабСвойстваДокументов.Документ,
		|	ЕСТЬNULL(ТабСвойстваДокументов.Свойство, ДопПоля.Ссылка) КАК  Свойство,
		|	ТабСвойстваДокументов.Значение,
		|	" + ТекстПараметра + " КАК  Видимость
		| ПОМЕСТИТЬ  Предитог
		| ИЗ 
		|	ТабСвойстваДокументов КАК  ТабСвойстваДокументов
		|		 ПОЛНОЕ   СОЕДИНЕНИЕ  ДопПоляПослеОбработки КАК  ДопПоля
		|		 ПО  ТабСвойстваДокументов.Свойство = ДопПоля.Ссылка "
		+ ?(УчитыватьВидимостьДляПользователя, "  ГДЕ  ДопПоля.ВидимостьДляПользователя =  ИСТИНА  ", "")
		+ "; 
		| ВЫБРАТЬ
		|	Предитог.Документ,
		|	Предитог.Свойство,
		|	Предитог.Значение,
		|	ЕСТЬNULL(СортировкаДопПолейВОбъектах.ПорядковыйНомерСтроки, 1000) КАК  НомерСтроки,
		|	Предитог.Видимость
		| ИЗ 
		|	ПредИтог КАК  Предитог
		|		 ЛЕВОЕ   СОЕДИНЕНИЕ  РегистрСведений.СортировкаДопПолейВОбъектах КАК  СортировкаДопПолейВОбъектах
		|		 ПО  Предитог.Свойство = СортировкаДопПолейВОбъектах.ДопПоле
		|			 И  (СортировкаДопПолейВОбъектах.Объект = &Объект)
		|			 И  (СортировкаДопПолейВОбъектах.Пользователь = &ТекПользователь)";
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "%ДопПоляНаименованиеПоля%", ДопПоляНаименованиеПоля);
		
		Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
		Запрос.УстановитьПараметр("Объект", Строка(ТипЗнч(СсылкаНаДокумент)));
		Запрос.УстановитьПараметр("ТекПользователь", ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийПользователь"));
		Запрос.УстановитьПараметр("Клиент", Клиент);
		Запрос.УстановитьПараметр("ОргПодразделение", ОргПодразделение);
		Запрос.УстановитьПараметр("СписокКлиентовПоИерархии", СписокКлиентовПоИерархии);
	Иначе
		Запрос = Новый Запрос;
		Запрос.Текст =" ВЫБРАТЬ   РАЗРЕШЕННЫЕ  
		|	СвойстваДокументов.ИспользуемыйДокумент КАК Документ,
		|	СвойстваДокументов.Свойство,
		|	СвойстваДокументов.Значение
		| ПОМЕСТИТЬ  ТабСвойстваДокументов
		| ИЗ 
		|	РегистрСведений.СвойстваДокументов КАК  СвойстваДокументов
		| ГДЕ 
		|	СвойстваДокументов.ИспользуемыйДокумент = &Документ
		|;
		|
		|//////////////////////////////////////////////////////////////////////////////// 
		| ВЫБРАТЬ 
		|	ДополнительныеПоля.Ссылка,
		|	ДополнительныеПоля.ВидимостьДляПользователя
		| ПОМЕСТИТЬ  ДопПоля
		| ИЗ 
		|	ПланВидовХарактеристик.ДополнительныеПоля КАК  ДополнительныеПоля 	
		| ГДЕ  "
		+ ?(УчитыватьВидимостьДляПользователя, " ДополнительныеПоля.ВидимостьДляПользователя =  ИСТИНА   И  ","") + "
		|	ДополнительныеПоля.ПометкаУдаления =  ЛОЖЬ 
		|	 И  ДополнительныеПоля." + ИмяРеквизита + " =  ИСТИНА  
		|;
		|
		|//////////////////////////////////////////////////////////////////////////////// 
		| ВЫБРАТЬ 
		|	ТабСвойстваДокументов.Документ,
		|	ЕСТЬNULL(ТабСвойстваДокументов.Свойство, ДопПоля.Ссылка) КАК  Свойство,
		|	ТабСвойстваДокументов.Значение,
		|	" + ТекстПараметра + " КАК  Видимость
		| ПОМЕСТИТЬ  Предитог
		| ИЗ 
		|	ТабСвойстваДокументов КАК  ТабСвойстваДокументов
		|		 ПОЛНОЕ   СОЕДИНЕНИЕ  ДопПоля КАК  ДопПоля
		|		 ПО  ТабСвойстваДокументов.Свойство = ДопПоля.Ссылка "
		+ ?(УчитыватьВидимостьДляПользователя, "  ГДЕ  ДопПоля.ВидимостьДляПользователя =  ИСТИНА  ", "")
		+ "; ВЫБРАТЬ
		|	Предитог.Документ,
		|	Предитог.Свойство,
		|	Предитог.Значение,
		|	ЕСТЬNULL(СортировкаДопПолейВОбъектах.ПорядковыйНомерСтроки, 1000) КАК  НомерСтроки,
		|	Предитог.Видимость
		| ИЗ 
		|	ПредИтог КАК  Предитог
		|		 ЛЕВОЕ   СОЕДИНЕНИЕ  РегистрСведений.СортировкаДопПолейВОбъектах КАК  СортировкаДопПолейВОбъектах
		|		 ПО  Предитог.Свойство = СортировкаДопПолейВОбъектах.ДопПоле
		|			 И  (СортировкаДопПолейВОбъектах.Объект = &Объект)
		|			 И  (СортировкаДопПолейВОбъектах.Пользователь = &ТекПользователь)";
		
		Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
		Запрос.УстановитьПараметр("Объект", Строка(ТипЗнч(СсылкаНаДокумент)));
		Запрос.УстановитьПараметр("ТекПользователь", ИТ_ГлобальныйМодульСервер.Ит_глЗначениеПеременной("глТекущийПользователь"));

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


// Функция выполняет действие: ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент)
//
// Параметры:
//     СсылкаНаДокумент - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент) Экспорт
	
	Возврат Метаданные.НайтиПоТипу(ТипЗнч(СсылкаНаДокумент)).Имя;

КонецФункции  // ПолучитьИмяРеквизитаПоТипуДокументаВДопПолях(СсылкаНаДокумент)


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

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

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

КонецПроцедуры  // ПересчептКрайнегоСрокаПриПрограммномИзмененииСостоянияДокумента


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

	
	Запрос.УстановитьПараметр( "Список" , СписокСотрудников);
	Запрос.УстановитьПараметр( "ТекущаяДата" , ЧасовыеПоясаСервер.ТекущееВремяИБ());
    
    СмещениеИБ = упрПолучениеЗначений.ПолучитьРеквизит(ИТ_ГлобальныйМодульСервер.ИТ_глЗначениеПеременной("глЧасовойПоясБазы"),"Смещение");
	Запрос.УстановитьПараметр( "СмещениеИБ",?(СмещениеИБ = Неопределено, 0, СмещениеИБ));

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

// Процедура обработчик события: УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников()
//
// Параметры:
//     ЭтаФорма - Произвольный
Процедура УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников(ЭтаФорма) Экспорт

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

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

	
КонецПроцедуры  // УстановитьУсловноеОфорлмениеТаблицДокументаПоСотояниямСотрудников()

// Функция выполняет действие:
//   Установить Условное Оформление Таблиц Документа Дерево
//
// Параметры:
//     ЭтаФорма - Произвольный 
//     Объект - Произвольный
Процедура УстановитьУсловноеОформлениеТаблицДокументаДерево(ЭтаФорма, Объект) Экспорт
	
	ДобавитьЭлементУсловногоОформления(ЭтаФОрма, Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"), "ДеревоДокументов.Документ", "ДеревоДокументов", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый",  ИСТИНА , ЛОЖЬ, ЛОЖЬ,  ЛОЖЬ ));
	ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИТ_ОбщегоНазначенияСерверПовтИсп.ПолучитьСтрокуЗапланированоСозданиеНаряда(), "ДеревоДокументов.Документ", "ДеревоДокументов", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый",  ИСТИНА , ЛОЖЬ, ЛОЖЬ,  ЛОЖЬ ));
	ДобавитьЭлементУсловногоОформления(ЭтаФОрма, ИСТИНА, "ДеревоДокументов.ПометкаУдаления", "ДеревоДокументов", Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ЛОЖЬ, ЛОЖЬ,  ЛОЖЬ ,  ИСТИНА ));
	
	СоответствиеДляОтборов = Новый Соответствие;
	СоответствиеДляОтборов.Вставить("ДеревоДокументов.ПометкаУдаления",  ИСТИНА );
	СоответствиеДляОтборов.Вставить("ДеревоДокументов.Документ", Новый ПолеКомпоновкиДанных("Объект.ГлавныйДокумент"));
	
	ДобавитьЭлементУсловногоОформленияСГруппойОтборов(ЭтаФОрма, "ДеревоДокументов", СоответствиеДляОтборов, Новый Структура("Жирный, Наклонный, Подчеркнутый, Зачеркнутый", ИСТИНА, ЛОЖЬ,  ЛОЖЬ ,  ИСТИНА ));
	
КонецПроцедуры

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


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


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

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


// Процедура выполняет действие:
//   Получить Текст Для Отображения Адресованных Сообщений
//
// Параметры:
//     Стр - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьТекстДляОтображенияАдресованныхСообщений(Стр) Экспорт

    Если ИТ_ОбщегоНазначенияСерверПовтИсп.ПользовательПотребительУслугИлиКуратор() Тогда
        
        Возврат "";
        
    КонецЕсли;
    
    
    ТекстHTML = "<FONT color=#536ac2 size=1>(Видимость: %1)</FONT>";
    
    Текст = "";
    Если Стр.ОтправитьИнициаторуИОповещаемым Тогда
    
    	Текст = "Инициатор, Оповещаемые лица";
    
    КонецЕсли;
    
    Если Стр.ОтправитьОператору Тогда
    
    	Текст = Текст + ?(ПустаяСтрока(Текст) = Истина,"",", ") +  "Оператор";
    
    КонецЕсли;
    
    Если Стр.ОтправитьОтветственному Тогда
    
    	Текст = Текст + ?(ПустаяСтрока(Текст) = Истина,"",", ") + "Ответственный";
    
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Стр.ОтправитьФизЛицу)  Тогда
    // 
    // // тут надо подумать
    // 
    КонецЕсли;

    
    ТекстHTML = СтрЗаменить(ТекстHTML,"%1", Текст);
    
    Возврат ТекстHTML;

КонецФункции  // ()


// Процедура выполняет действие:
//   Сформировать Штрих Код
//
// Параметры:
//     Код - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция СформироватьШтрихКод(Код) Экспорт
        
    НеНашлиУникальный = Истина;
	ТекКод = Код;
	Сч = 0;
	Пока НеНашлиУникальный Цикл
		ТекКод = Формат(Число(ТекКод) + Сч, "ЧГ=");
		         
        Пока СтрДлина(ТекКод) < 10 Цикл
        	ТекКод = "0" + ТекКод;
        КонецЦикла;
        
        Штрихкод = "21" + ТекКод;

        
		Штрихкод = Штрихкод + КонтрольныйСимволEAN(ШтрихКод, 13);
		
		НеНашлиУникальный = Не ПроверитьУникальностьШтрихКода(ШтрихКод, Код);
		
		Сч = Сч+1;
	КонецЦикла;
	
	Возврат Штрихкод;

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


// Процедура выполняет действие:
//   Контрольный Символ E A N
//
// Параметры:
//     ШтрихКод - Произвольный 
//     Тип - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция КонтрольныйСимволEAN(ШтрихКод, Тип) Экспорт
	
	Четн   = 0;
	Нечетн = 0;
	
	КоличествоИтераций = ?(Тип = 13 ИЛИ Тип = 14, 6, 4);
	
	Для Индекс = 1 По КоличествоИтераций Цикл
		Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда
		Иначе
			Четн   = Четн   + Сред(ШтрихКод, 2 * Индекс, 1);
		КонецЕсли;
		Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1);
	КонецЦикла;
	
	Если Тип = 14 Тогда
		Нечетн = Нечетн + Сред(ШтрихКод, 13, 1);
		Нечетн = Нечетн * 3;
	ИначеЕсли Тип = 13 Тогда
		Четн = Четн * 3;
	Иначе
		Нечетн = Нечетн * 3;
	КонецЕсли;
	
	КонтЦифра = 10 - (Четн + Нечетн) % 10;
	
	Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
	
КонецФункции  // КонтрольныйСимволEAN()


// Процедура выполняет действие:
//   Проверить Уникальность Штрих Кода
//
// Параметры:
//     ШтрихКод - Произвольный 
//     Код - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПроверитьУникальностьШтрихКода(ШтрихКод, Код) Экспорт
	
	Если Не ЗначениеЗаполнено(ШтрихКод) Тогда
		Результат = Истина;
	Иначе
		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("ШтрихКод", ШтрихКод);
		Запрос.УстановитьПараметр("Код"     , Код);
		
		Запрос.Текст = "
		| ВЫБРАТЬ   ПЕРВЫЕ  1
		|	1 КАК  Результат
		| ИЗ 
		|	РегистрСведений.ИТ_Штрихкоды КАК  Штрихкоды
		| ГДЕ 
		|	Штрихкоды.Код <> &Код
		|	 И  Штрихкоды.ШтрихКод = &ШтрихКод
		|";
		
		Результат = Запрос.Выполнить().Пустой();
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции  // ПроверитьУникальностьШтрихКода()


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


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


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


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

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


// Функции для отчета Динамика обращений
//
// Параметры:
//     ПериодДетализации - Произвольный 
//     Дата1 - Произвольный 
//     Дата2 - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьЧислоПериодовДетализацииВПериодеОтчета(ПериодДетализации, Дата1, Дата2) Экспорт
	
	Если ПериодДетализации = "Год" Тогда
		Возврат ПериодВГодах(Дата1, Дата2);
		
	ИначеЕсли ПериодДетализации = "Квартал" Тогда
		Возврат ПериодВКварталах(Дата1, Дата2);
		
	ИначеЕсли ПериодДетализации = "Месяц" Тогда
		Возврат ПериодВМесяцах(Дата1, Дата2);
		
	ИначеЕсли ПериодДетализации = "Неделя" Тогда
		Возврат ПериодВНеделях(Дата1, Дата2);
		
	ИначеЕсли ПериодДетализации = "День" Тогда
		Возврат ПериодВДнях(Дата1, Дата2);
		
	КонецЕсли;
	
КонецФункции


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

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


// Процедура выполняет действие:
//   Доступна Роль
//
// Параметры:
//     Наименование - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ДоступнаРоль(Наименование) Экспорт
	
	Попытка 
		
		Возврат РольДоступна(Наименование);
		
	Исключение	
		
		Возврат Ложь;
		
	КонецПопытки	
	
КонецФункции


// Процедура выполняет действие:
//   Дата Находится В Графике Оказания Услуги
//
// Параметры:
//     Дата - Произвольный 
//     КомпонентаУслуги - Произвольный 
//     Клиент - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ДатаНаходитсяВГрафикеОказанияУслуги(Дата, КомпонентаУслуги, Клиент) ЭКспорт
	
	ПараметрыУслуги = ПолучениеЗначенийСервер.ПолучитьПараметрыУслуги(Дата, Клиент, КомпонентаУслуги);
	
	Если ПараметрыУслуги.Свойство("КодОшибки") Тогда
	    Возврат Новый Структура("ВходитВГрафик",  ЛОЖЬ );	
	КонецЕсли;
	
	Если ПолучениеЗначенийСервер.ПолучитьКонецДняПоГрафику(ПараметрыУслуги.ВремяОказанияУслуги, Дата) < Дата Тогда 
		
		Возврат Новый Структура("ВходитВГрафик, НачалоСледующегоДня",  ЛОЖЬ ,ПолучениеЗначенийСервер.ПолучитьНачалоДняПоГрафику(ПараметрыУслуги.ВремяОказанияУслуги, КонецДня(Дата) + 1 ));
		
	Иначе 
		Возврат Новый Структура("ВходитВГрафик",  ИСТИНА );
		
	КонецЕсли;
		
КонецФункции


// Процедура выполняет действие:
//   Получить Функциональную Опцию На Сервере
//
// Параметры:
//     НазваниеОпции - Произвольный
//
// Возвращаемое значение:
//    Произвольный
Функция ПолучитьФункциональнуюОпциюНаСервере(НазваниеОпции) Экспорт
	
	Возврат ПолучитьФункциональнуюОпцию(НазваниеОпции);
	
КонецФункции


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


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

	КонецЦикла;
	
	Возврат СтруктураОпций;
	
КонецФункции

// Процедура - Записать параметры функциональных опций
//
Процедура ЗаписатьПараметрыФункциональныхОпций() Экспорт

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

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

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

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


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

	Возврат НеобходимоОбновитьИнтерфейс;
	

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

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

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

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

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

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

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

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

					Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
				
					Если ПустаяСтрока(Статус) Тогда
						
						ЗафиксироватьТранзакцию();
						
						СтруктураРезультата = Новый Структура("Статус, ТекстОшибки",  ИСТИНА , " На данный момент выбранный договор ожидает проведения. ");
						
					Иначе
						
						Если ТранзакцияАктивна()Тогда ОтменитьТранзакцию();КонецЕсли;
						СтруктураРезультата = Новый Структура("Статус, ТекстОшибки",  ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
						
					КонецЕсли;
					
					// Возврат Новый Структура("Статус, ТекстОшибки", "Ожидает проведения", );;
					
				Иначе
					
					// Проверить, есть ли в табличной части
					// Если есть - отказ
					// Если нет - записать в табличную часть
					
					Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
				
					Если ПустаяСтрока(Статус) Тогда
						
						ЗафиксироватьТранзакцию();
						
						СтруктураРезультата =  Новый Структура("Статус, ТекстОшибки",  ИСТИНА , " На данный момент выбранный договор в состоянии ""Ошибка проведения"". ");
						
					Иначе
						
						Если ТранзакцияАктивна()Тогда ОтменитьТранзакцию();КонецЕсли;
						СтруктураРезультата =  Новый Структура("Статус, ТекстОшибки",  ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
						
					КонецЕсли;
					
					// Возврат Новый Структура("Статус, ТекстОшибки", "Ошибка проведения", Выборка.ОписаниеОшибок );
					
				КонецЕсли;
			
			КонецЕсли;
			
		Иначе
			 // Такого быть не должно никак.
			// Проверить, есть ли в табличной части
			// Если есть - отказ
			// Если нет - записать в табличную часть
			Статус = ПолучитьРезультатДобавленияВТабличнуюЧастьSLAКлиента(Клиент, Пользователь, Договор, МассивСтруктурДоговоров);
			
			Если ПустаяСтрока(Статус) Тогда
				
				ЗафиксироватьТранзакцию();
				
				СтруктураРезультата =  Новый Структура("Статус, ТекстОшибки",  ИСТИНА , " На данный момент выбранный договор не проведен. ");
				
			Иначе
				
				Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию();КонецЕсли;
				СтруктураРезультата =  Новый Структура("Статус, ТекстОшибки",  ЛОЖЬ , "Не удалось добавить данные о клиенте в Табличную часть договора(SLA) по причине: " + Статус);
				
			КонецЕсли;

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

				 Возврат СтруктураРезультата;
				 
			 КонецЕсли;
			
		КонецЕсли;
		
	Исключение
		
		Ошибка = ОписаниеОшибки();
		
		Если ТранзакцияАктивна() Тогда
			
			ОтменитьТранзакцию();
			
		КонецЕсли;
		
		Возврат Новый Структура("Статус,ТекстОшибки",  ЛОЖЬ , "Не удалось добавить клиента в SLA по причине: " + Ошибка  );
		
	КонецПопытки
	
КонецФункции

Процедура ЗаписатьСтатусНеобходимоПровести(Договор)
	
	НаборСтатусыДляДоговоров = РегистрыСведений.ИТ_СтатусыПроведенияSLA.СоздатьНаборЗаписей();
	НаборСтатусыДляДоговоров.Отбор.Регистратор.Установить(Договор);
	НаборСтатусыДляДоговоров.Прочитать();
	
	Если НаборСтатусыДляДоговоров.Количество() Тогда
		
		НаборСтатусыДляДоговоров[0].Проведен = ЛОЖЬ;
		НаборСтатусыДляДоговоров[0].ОписаниеОшибок = "";
		
		НаборСтатусыДляДоговоров.Записать(Истина);
		
	КонецЕсли;
	
	
КонецПроцедуры

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

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

	Возврат ТаблицаДоговоров;
	
КонецФункции

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

Функция СкопироватьМассив(Массив)

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

КонецФункции  // ()

Функция СкопироватьЗначение(Значение)

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

КонецФункции  // ()

// Процедура обработчик события:
Процедура ДополнитьСписокЭлементамиИзТаблицы( ЭтаФорма, ИмяЭлементФормы, ИмяРеквизита, СписокЭлементов, СтруктураСписков, ИмяРеквизитаФормы = Неопределено)

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

КонецПроцедуры  // ДополнитьСписокЭлементамиИзТаблицы()

// Процедура обработчик события: ЗаполнитьСостояние
Процедура ЗаполнитьСостояние(Таблица, ИмяРеквизита, Соответствие)

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

КонецПроцедуры  // ЗаполнитьСостояние()

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

	
	
КонецПроцедуры  // ДобавитьУсловноеОформление()

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

 
 КонецПроцедуры  // ДобавитьЭлементУсловногоОформления

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

 
 КонецПроцедуры  // ДобавитьЭлементУсловногоОформления

Функция ПериодВГодах(Дата1, Дата2)
	Возврат Год(Дата2) - Год(Дата1) + 1;
КонецФункции

Функция ПериодВКварталах(Дата1, Дата2)
	Квартал1 = Квартал(Дата1);
	Квартал2 = Квартал(Дата2);
	Если Год(Дата2) <> Год(Дата1) Тогда
		ПолныхЛетМеждуДатами = Год(Дата2) - Год(Дата1) - 1;
		КварталовПолныхЛет = ?(ПолныхЛетМеждуДатами > 0, ПолныхЛетМеждуДатами*4, 0);
		Возврат (4-Квартал1+1) + (КварталовПолныхЛет) + Квартал2;  // Кварталов в первом году + кварталов полных лет + кварталов в последнем году
	Иначе
		Возврат Квартал2 - Квартал1 + 1;
	КонецЕсли;
КонецФункции

Функция ПериодВМесяцах(Дата1, Дата2)
	Месяц1 = Месяц(Дата1);
	Месяц2 = Месяц(Дата2);
	Если Год(Дата2) <> Год(Дата1) Тогда
		ПолныхЛетМеждуДатами = Год(Дата2) - Год(Дата1) - 1;
		МесяцевПолныхЛет = ?(ПолныхЛетМеждуДатами > 0, ПолныхЛетМеждуДатами*12, 0);
		Возврат (12-Месяц1+1) + (МесяцевПолныхЛет) + Месяц2;  // Месяцев в первом году + Месяцев полных лет + Месяцев в последнем году
	Иначе
		Возврат Месяц2 - Месяц1 + 1;
	КонецЕсли;
КонецФункции

Функция ПериодВДнях(Дата1, Дата2)
	День1 = ДеньГода(Дата1);
	День2 = ДеньГода(Дата2);
	Год1 = Год(Дата1);
	Год2 = Год(Дата2);
	Если Год2 <> Год1 Тогда
		ДнейПолныхЛет = ЧислоДнейПолныхЛет(Год1, Год2);
		Возврат (ЧислоДнейВГоду(Год1)-День1+1) + (ДнейПолныхЛет) + День2;  // Дней в первом году + Дней полных лет + Дней в последнем году
	Иначе
		Возврат День2 - День1 + 1;
	КонецЕсли;
КонецФункции

Функция ПериодВНеделях(Дата1, Дата2)
	ЧислоНедель = 0;
	ЧастьНеделиУчтена = ЛОЖЬ;
	Неделя1 = НеделяГода(Дата1);
	Неделя2 = НеделяГода(Дата2);
	Год1 = Год(Дата1);
	Год2 = Год(Дата2);
	Если Год2 <> Год1 Тогда
		Для год = Год1 по Год2 Цикл
			
			Если год = Год1 Тогда
				ЧислоНедельВТекущемГоду = ЧислоНедельВГоду(год) - Неделя1 + 1;
			ИначеЕсли год = Год2 Тогда
				ЧислоНедельВТекущемГоду = Неделя2;
			Иначе
				ЧислоНедельВТекущемГоду = ЧислоНедельВГоду(год);
			КонецЕсли;
			
			ЧислоНедель = ЧислоНедель + ЧислоНедельВТекущемГоду + ?(ЧастьНеделиУчтена, -1, 0);
			ЧастьНеделиУчтена = (ПоследнийДеньНеделиВГоду(год) <> 7);
			
		КонецЦикла;
		Возврат ЧислоНедель;
	Иначе
		Возврат Неделя2 - Неделя1 + 1;
	КонецЕсли;
КонецФункции

Функция ЧислоДнейВГоду(Год)
	Возврат ?(ГодВисокосный(Год), 366, 365);
КонецФункции

// Включая неполные
Функция ЧислоНедельВГоду(Год)
	ПоследнийДень = Дата(СтрЗаменить(Строка(Год), " ", "")+"1231");
	Возврат НеделяГода(ПоследнийДень);
КонецФункции

// Включая неполные
Функция ПоследнийДеньНеделиВГоду(Год)
	ПоследнийДень = Дата(СтрЗаменить(Строка(Год), " ", "")+"1231");
	Возврат ДеньНедели(ПоследнийДень);
КонецФункции

Функция ГодВисокосный(Год)
	Возврат Остаток(Год, 400) = 0 ИЛИ (Остаток(Год, 4) = 0 И Остаток(Год, 100) <> 0);
КонецФункции

Функция Остаток(Делимое, Делитель)
	Возврат Делимое - Цел(Делимое/Делитель)*Делитель;
КонецФункции

Функция ЧислоДнейПолныхЛет(Год1, Год2)
	СуммаДней = 0;
	Для год = Год1+1 по Год2-1 Цикл
		СуммаДней = СуммаДней + ЧислоДнейВГоду(год);
	КонецЦикла;
	Возврат СуммаДней;
КонецФункции

Функция Квартал(Дата)
	Возврат Месяц(КонецКвартала(Дата))/3;
КонецФункции

// Процедура выполняет действие:
//   Проверить Версия Платформы Выше 8 3 1 3
//
// Возвращаемое значение:
//    Произвольный
Функция ПроверитьВерсияПлатформыВыше8313() Экспорт
	
	Информация = Новый СистемнаяИнформация;
	
	Попытка
		ВерсияПлатформы = Число(Сред(Информация.ВерсияПриложения, 3, 1));
	Исключение
		ВерсияПлатформы = 3;
	КонецПопытки;
	
	Попытка
		РелизПлатформы = Число(Сред(Информация.ВерсияПриложения, 5, 2));	
	Исключение
		РелизПлатформы = 9;
	КонецПопытки;
	
	Если ВерсияПлатформы > 3 ИЛИ (ВерсияПлатформы = 3 И РелизПлатформы > 13) Тогда
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

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