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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ПодготовитьФормуНаСервере(ТекущийОбъект.Ссылка);
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура НастроитьСоставРегистров(Команда)

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

&НаКлиенте
Процедура ПереключитьАктивностьДвижений(Команда)

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

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

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

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

#Область ИзменениеРеквизитов

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьСписокПараметров(Форма, ТекущиеДанные, ШаблонИмяПоляОбъекта, ИмяПоляСчетУчета)

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

	Возврат СписокПараметров;

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

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

#Область ЗаполнениеДвижений

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

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

#Область ОтрисовкаФормы

&НаСервере
Процедура ПодготовитьФормуНаСервере(ДокументДвижений)

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

&НаСервере
Функция ПолучитьМассивИспользуемыхРегистров(ДокументДвижений)
	УстановитьПривилегированныйРежим(Истина);

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

&НаСервере
Процедура ЗаполнитьТаблицуРегистров(МетаданныеДокумента)

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

		СтрокаРегистра.ТипРегистра = ТипРегистра;
		СтрокаРегистра.Синоним     = МетаданныеРегистра.Синоним;
		
	КонецЦикла;
	
	// Сначала показывается регистр бухгалтерии, затем регистры накопления, затем - сведений
	Регистры.Сортировать("ТипРегистра, Синоним");

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

&НаСервере
Процедура УстановитьОтображениеВТаблицеРегистров(РегистрыСДвижениями)

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

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

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

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

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

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

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

			ТекГруппа = Элементы.Вставить(ИмяГруппы, Тип("ГруппаФормы"), Элементы.ПанельРегистров, СледующаяГруппа);
			
			ТекГруппа.Заголовок      = СтрокаРегистра.Синоним;
			СтрокаРегистра.Отрисован = Истина;

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

			РеквизитыНабораЗаписей = ЭтотОбъект[ПутьКДаннымТаблицы].Выгрузить(Новый Массив);

			// Некоторые колонки не показываем
			РеквизитыНабораЗаписей.Колонки.Удалить("Регистратор");
			РеквизитыНабораЗаписей.Колонки.Удалить("Активность");

			Если РеквизитыНабораЗаписей.Колонки.Найти("МоментВремени") <> Неопределено Тогда
				РеквизитыНабораЗаписей.Колонки.Удалить("МоментВремени");
			КонецЕсли;

			Если РеквизитыНабораЗаписей.Колонки.Найти("Период") <> Неопределено Тогда
				РеквизитыНабораЗаписей.Колонки.Удалить("Период");
			КонецЕсли;

			Если РеквизитыНабораЗаписей.Колонки.Найти("Организация") <> Неопределено Тогда
				РеквизитыНабораЗаписей.Колонки.Удалить("Организация");
			КонецЕсли;

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

	КонецЦикла;

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

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

#Область НастройкаСоставаРегистров

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

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

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

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

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

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

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

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

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

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