Заявка на командировку / Форма документа / Модуль формы

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

&НаКлиенте
Перем ПараметрыДляЗаписи Экспорт;

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

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	// СтандартныеПодсистемы.УправлениеДоступом
	УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	ПриЧтенииСозданииНаСервере();

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

&НаКлиенте
Процедура ОбработкаВыбора(РезультатВыбора, ИсточникВыбора)
	
	Если Окно <> Неопределено Тогда
		Окно.Активизировать();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
	
	Если ТекущийСтатус <> Объект.Статус Тогда
		СтатусПриИзмененииСервер();
		ТекущийСтатус = Объект.Статус;
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура СотрудникПриИзменении(Элемент)
	
	ЗаполнитьКонтактнуюИнформацию();
	
КонецПроцедуры

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

&НаСервере
Процедура СписокФизЛицПриИзмененииНаСервере()
	
	Элементы.ГруппаКомандируемыеСотрудники.Заголовок = ЗаголовокКомандируемыеСотрудники();
	
	НастроитьЗависимыеЭлементыФормыНаСервере("СписокФизЛиц");
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
	
	Если Объект.ДатаНачала > Объект.ДатаОкончания Тогда
		Объект.ДатаОкончания = Объект.ДатаНачала;
	КонецЕсли;
	
	ПериодПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаОкончанияПриИзменении(Элемент)
	
	Если Объект.ДатаОкончания < Объект.ДатаНачала Тогда
		Объект.ДатаНачала = Объект.ДатаОкончания;
	КонецЕсли;
	
	ПериодПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодПриИзменении()
	
	Объект.БронироватьУбытиеТудаНеРаньше = Объект.ДатаНачала;
	Объект.БронироватьПрибытиеТудаНеПозже = Объект.ДатаНачала;
	Объект.БронироватьУбытиеОбратноНеРаньше = Объект.ДатаОкончания;
	Объект.БронироватьПрибытиеОбратноНеПозже = Объект.ДатаОкончания;
	
	РассчитатьЧислоДней();
	
КонецПроцедуры

&НаКлиенте
Процедура ЧислоДнейПриИзменении(Элемент)
	
	СекундВМинуте = 60;
	МинутВЧасе = 60;
	ЧасовВДне = 24;
	
	Объект.ДатаОкончания = Объект.ДатаНачала + (ЧислоДней - 1) * СекундВМинуте * МинутВЧасе * ЧасовВДне;
	
	Элементы.ЧислоДней.Заголовок = ОбщегоНазначенияУТКлиентСервер.СклонениеСлова(
		ЧислоДней, НСтр("ru='день, дня, дней, м'"));
	
КонецПроцедуры

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

&НаКлиенте
Процедура СверхЛимитаПриИзменении(Элемент)
	
	НастроитьЗависимыеЭлементыФормы(Элемент.Имя);
	
КонецПроцедуры

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

&НаКлиенте
Процедура БронироватьСамолетТудаПриИзменении(Элемент)
	
	УстановитьПодсказкуПриЗаказеБилетов(ЭтотОбъект, Ложь);
	ЗаполнитьПараметрыБронирования(ЭтотОбъект, Элементы.ГруппаЗаказатьТуда, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура БронироватьПоездТудаПриИзменении(Элемент)
	
	УстановитьПодсказкуПриЗаказеБилетов(ЭтотОбъект, Ложь);
	ЗаполнитьПараметрыБронирования(ЭтотОбъект, Элементы.ГруппаЗаказатьТуда, Ложь)
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура БронироватьУбытиеТудаАвтоПодбор(
			Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

	ОбработкаВыбораОбъектовБронирования(Элемент.Имя, ВыбранноеЗначение, СтандартнаяОбработка);

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

&НаКлиенте
Процедура БронироватьПрибытиеТудаАвтоПодбор(
			Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

	ОбработкаВыбораОбъектовБронирования(Элемент.Имя, ВыбранноеЗначение, СтандартнаяОбработка);
	
	Объект.БронироватьМестоТрансфераТудаЭтоРегион = ВыбранноеЗначение.ЭтоРегион;

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

&НаКлиенте
Процедура БронироватьМестоТрансфераТудаАвтоПодбор(
			Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

	ОбработкаВыбораОбъектовБронирования(Элемент.Имя, ВыбранноеЗначение, СтандартнаяОбработка);

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

&НаКлиенте
Процедура БронироватьУбытиеОбратноАвтоПодбор(
			Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

	ОбработкаВыбораОбъектовБронирования(Элемент.Имя, ВыбранноеЗначение, СтандартнаяОбработка);

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

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

	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;

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

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

	ОбработкаВыбораОбъектовБронирования(Элемент.Имя, ВыбранноеЗначение, СтандартнаяОбработка);
	
	Объект.БронироватьМестоТрансфераОбратноЭтоРегион = ВыбранноеЗначение.ЭтоРегион;

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

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

	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;

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

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

&НаКлиенте
Процедура БронироватьМестоПроживанияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	ОбработкаВыбораОбъектовБронирования(Элемент.Имя, ВыбранноеЗначение, СтандартнаяОбработка);
	
	Объект.БронироватьМестоПроживанияЭтоРегион = ВыбранноеЗначение.ЭтоРегион;

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

&НаКлиенте
Процедура БронироватьМестоПроживанияАвтоПодбор(
			Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	//++ Локализация
	ПодобратьОбъектыСмартвей(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

	ОкончаниеВводаТекстаЭлементовБронирования(Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

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

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

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

#Область ОбработчикиСобытийТабличнойЧастиСотрудники

&НаКлиенте
Процедура КомандируемыеСотрудникиПриИзменении(Элемент)
	
	Элементы.ГруппаКомандируемыеСотрудники.Заголовок = ЗаголовокКомандируемыеСотрудники();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СотрудникиПриИзменении(Элемент)
	
	Элементы.ГруппаВыдатьПодОтчет.Заголовок = НСтр("ru='Выдать под отчет на командировочные расходы:'") +
		" " + Объект.ВыдачаПодОтчет.Итог("Сумма") + " " + Строка(Объект.Валюта);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура РассчитатьЧислоДней()
	
	СекундВМинуте = 60;
	МинутВЧасе = 60;
	ЧасовВДне = 24;
	
	ЧислоДней = (Объект.ДатаОкончания - Объект.ДатаНачала) / (СекундВМинуте * МинутВЧасе * ЧасовВДне) + 1;
	
	Элементы.ЧислоДней.Заголовок = ОбщегоНазначенияУТКлиентСервер.СклонениеСлова(
		ЧислоДней, НСтр("ru='день, дня, дней, м'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьСотрудников(Команда)
	
	ЗаполнитьСотрудниковНаСервере();
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ОбновитьДанныеБронирования(Команда)
	
	//++ Локализация
	ОбновитьДанныеБронированияЛокализация(Команда);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

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

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

#Область Свойства

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

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

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

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

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

#Область УправлениеЭлементамиФормы

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	
КонецПроцедуры

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

&НаКлиенте
Процедура НастроитьЗависимыеЭлементыФормы(ИзмененныйРеквизит = "")
	
	ДенежныеСредстваКлиентСервер.НастроитьЭлементыФормы(ЭтаФорма, ИзмененныйРеквизит, РеквизитыФормы(ЭтаФорма));
	
КонецПроцедуры

&НаСервере
Процедура НастроитьЗависимыеЭлементыФормыНаСервере(ИзмененныйРеквизит = "")
	
	ДенежныеСредстваКлиентСервер.НастроитьЭлементыФормы(ЭтаФорма, ИзмененныйРеквизит, РеквизитыФормы(ЭтаФорма));
	
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Функция СуммаЗакрыто(Ссылка)
	
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ
	|	-СУММА(ДенежныеСредства.Сумма) КАК Закрыто
	|ИЗ
	|	РегистрНакопления.ДенежныеСредстваКВыплате КАК ДенежныеСредства
	|ГДЕ
	|	ДенежныеСредства.ЗаявкаНаРасходованиеДенежныхСредств = &Ссылка
	|	И ДенежныеСредства.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
	|	И ДенежныеСредства.Сумма < 0
	|";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить();
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат РезультатЗапроса.Выгрузить()[0].Закрыто;
	
КонецФункции

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

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

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

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

#Область Прочее

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

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

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

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

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

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

&НаСервере
Процедура ИнициализироватьЭлементыБронирования()

	ЭлементыБронирования = Новый Соответствие;
	ЭлементыБронирования.Вставить("БронироватьУбытиеТуда", Новый Структура);
	ЭлементыБронирования.Вставить("БронироватьПрибытиеТуда", Новый Структура);
	ЭлементыБронирования.Вставить("БронироватьМестоТрансфераТуда", Новый Структура);
	ЭлементыБронирования.Вставить("БронироватьУбытиеОбратно", Новый Структура);
	ЭлементыБронирования.Вставить("БронироватьПрибытиеОбратно", Новый Структура);
	ЭлементыБронирования.Вставить("БронироватьМестоТрансфераОбратно", Новый Структура);
	ЭлементыБронирования.Вставить("БронироватьМестоПроживания", Новый Структура);
	
	ПараметрыЭлементовБронирования = Новый ФиксированноеСоответствие(ЭлементыБронирования);
	
	Идентификаторы = Новый Соответствие;
	Идентификаторы.Вставить("БронироватьУбытиеТуда", "БронироватьУбытиеТудаИдентификатор");
	Идентификаторы.Вставить("БронироватьПрибытиеТуда", "БронироватьПрибытиеТудаИдентификатор");
	Идентификаторы.Вставить("БронироватьМестоТрансфераТуда", "БронироватьМестоТрансфераТудаИдентификатор");
	Идентификаторы.Вставить("БронироватьУбытиеОбратно", "БронироватьУбытиеОбратноИдентификатор");
	Идентификаторы.Вставить("БронироватьПрибытиеОбратно", "БронироватьПрибытиеОбратноИдентификатор");
	Идентификаторы.Вставить("БронироватьМестоТрансфераОбратно", "БронироватьМестоТрансфераОбратноИдентификатор");
	Идентификаторы.Вставить("БронироватьМестоПроживания", "БронироватьМестоПроживанияИдентификатор");
	
	ИдентификаторыЭлементовБронирования = Новый ФиксированноеСоответствие(Идентификаторы);

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

&НаКлиентеНаСервереБезКонтекста
Функция ИнициализироватьПараметрыБронирования()

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ИзменитьПараметрЭлементаБронирования(Форма, ИмяЭлемента, ОбратноеНаправление)

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

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

&НаКлиентеНаСервереБезКонтекста
Функция СвойстваБронирования(Форма, ОбратноеНаправление)

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

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

&НаКлиенте
Функция ЭлементВГруппе(Элемент, ИмяГруппы)

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

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

&НаКлиентеНаСервереБезКонтекста
Функция НеизменныеПараметрыЭлементаБронирования(ИмяЭлемента)

	ИсключаяСвойства = "";
	
	Если ИмяЭлемента = "БронироватьУбытиеТуда"
		ИЛИ ИмяЭлемента = "БронироватьПрибытиеТуда"
		ИЛИ ИмяЭлемента = "БронироватьУбытиеОбратно"
		ИЛИ ИмяЭлемента = "БронироватьПрибытиеОбратно" Тогда
		ИсключаяСвойства = "БронироватьТрансфер, БронироватьПроживание";
	ИначеЕсли ИмяЭлемента = "БронироватьМестоПроживания" Тогда
		ИсключаяСвойства = "БронироватьСамолет, БронироватьПоезд, БронироватьТрансфер";
	ИначеЕсли ИмяЭлемента = "БронироватьМестоТрансфераТуда"
		ИЛИ ИмяЭлемента = "БронироватьМестоТрансфераОбратно" Тогда
		ИсключаяСвойства = "БронироватьПроживание";
	КонецЕсли;
	
	Возврат ИсключаяСвойства;

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция СоставЭлементаБронирования(Код, Представление, ЭтоРегион = Ложь)

	СтруктураЭлемента = Новый Структура("Код, Представление");
	СтруктураЭлемента.Вставить("Код", Код);
	СтруктураЭлемента.Вставить("Представление", Представление);
	СтруктураЭлемента.Вставить("ЭтоРегион", ЭтоРегион);
	
	Возврат СтруктураЭлемента;

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

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

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

//++ Локализация
#Область Локализация

#Область Локализация_ПодключаемыеОбработчикиСобытийФормы

&НаСервере
Процедура Подключаемый_ПриСозданииНаСервереЛокализация(Отказ, СтандартнаяОбработка)
	
	ПриСозданииНаСервере(Отказ, СтандартнаяОбработка);
	
	Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		ПриЧтенииСозданииНаСервереЛокализация();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ПриЧтенииНаСервереЛокализация(ТекущийОбъект)
	
	ПриЧтенииНаСервере(ТекущийОбъект);
	
	ПриЧтенииСозданииНаСервереЛокализация();
	
КонецПроцедуры

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

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

#Область ЛокализацияОбработчикиСобытийЭлементовФормы

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

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

#Область ЛокализацияКоманды

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

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

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

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

#Область ЛокализацияСлужебные

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Процедура СформироватьСписокОбъектовСмартвейНаСервере(Текст, ДанныеВыбора, ПараметрыПодбора)

	ДанныеВыбора = Новый СписокЗначений;
	
	Если Не ПараметрыПодбора.БронироватьСамолет
		И Не ПараметрыПодбора.БронироватьПоезд Тогда
		
		ТаблицаРегионов = ИнтеграцияСмартвей.ОтелиИРегионы(Текст, Ложь, Истина);
	
		Для Каждого СтрокаТаблицы Из ТаблицаРегионов Цикл
			
			Представление = СтрШаблон(НСтр("ru = '%1, %2'"), СтрокаТаблицы.Название, СтрокаТаблицы.Город);
			ЗначениеЭлемента = СоставЭлементаБронирования(СтрокаТаблицы.Код, Представление, СтрокаТаблицы.ЭтоРегион);
			ДанныеВыбора.Добавить(ЗначениеЭлемента, Представление);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если ПараметрыПодбора.БронироватьСамолет Тогда
		
		ТаблицаАэропортов = ИнтеграцияСмартвей.Аэропорты(Текст);
		
		Для Каждого СтрокаТаблицы Из ТаблицаАэропортов Цикл
			
			Представление = ПредставлениеАэропорта(СтрокаТаблицы);
			ЗначениеЭлемента = СоставЭлементаБронирования(СтрокаТаблицы.Код, Представление);
			ДанныеВыбора.Добавить(ЗначениеЭлемента, Представление);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если ПараметрыПодбора.БронироватьПоезд Тогда
		
		ТаблицаСтанций = ИнтеграцияСмартвей.ЖелезнодорожныеСтанции(Текст);
		
		Для Каждого СтрокаТаблицы Из ТаблицаСтанций Цикл
			
			ЗначениеЭлемента = СоставЭлементаБронирования(СтрокаТаблицы.Код, СтрокаТаблицы.Название);
			ДанныеВыбора.Добавить(ЗначениеЭлемента, СтрокаТаблицы.Название);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если ПараметрыПодбора.БронироватьТрансфер
		ИЛИ ПараметрыПодбора.БронироватьПроживание Тогда
		
		ТаблицаОтелей = ИнтеграцияСмартвей.ОтелиИРегионы(Текст, Истина, Ложь);
		
		Для Каждого СтрокаТаблицы Из ТаблицаОтелей Цикл
			
			Представление = СтрШаблон(НСтр("ru = '%1, %2'"), СтрокаТаблицы.Название, СтрокаТаблицы.Город);
			ЗначениеЭлемента = СоставЭлементаБронирования(СтрокаТаблицы.Код, Представление, СтрокаТаблицы.ЭтоРегион);
			ДанныеВыбора.Добавить(ЗначениеЭлемента, Представление);
			
		КонецЦикла;
		
	КонецЕсли;

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

&НаСервереБезКонтекста
Функция ПредставлениеАэропорта(Реквизиты)

	Если Реквизиты.Город = Реквизиты.Название Тогда
		
		Если ЗначениеЗаполнено(Реквизиты.Город) Тогда
			Представление = СтрШаблон(НСтр("ru = '%1, %2 (%3)'"),
										Реквизиты.Город, Реквизиты.Страна, Реквизиты.Код);
		Иначе 
			
			Если ЗначениеЗаполнено(Реквизиты.Страна) Тогда 
				Представление = СтрШаблон(НСтр("ru = '%1 (%2)'"),
											Реквизиты.Страна, Реквизиты.Код);
			Иначе
				Представление = СтрШаблон(НСтр("ru = '%1'"), Реквизиты.Код);
			КонецЕсли;
			
		КонецЕсли;
		
	Иначе
		Представление = СтрШаблон(НСтр("ru = '%1, %2 (%3 - %4)'"),
									Реквизиты.Город, Реквизиты.Страна, Реквизиты.Название, Реквизиты.Код);
	КонецЕсли;
	
	Возврат Представление;

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

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

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

#Область Инициализация

#Если НаСервере Тогда

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

#КонецЕсли

#КонецОбласти
//-- Локализация

Связанные материалы