Правила распределения расходов / Настройка распределения статьи расходов / Модуль формы

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

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

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

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

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

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

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

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

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	//++ НЕ УТ

	// Настройка счетов учета.
	НастройкаСчетовУчетаСервер.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	//-- НЕ УТ

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

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

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	
	ДоходыИРасходыСервер.ПослеЗаписиНаСервере(ЭтотОбъект);
	УстановитьДоступностьЭлементов(ЭтаФорма);
	УстановитьВидимостьЭлементов(ЭтаФорма);
	
	//++ НЕ УТ

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

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

#Область ОбработчикиСобытийПравилаРаспределения

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

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

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

&НаКлиенте
Процедура ДоляСтоимостиНаПроизводствоПриИзменении(Элемент)
	
	НастроитьОформлениеПолей(ЭтаФорма);
	
КонецПроцедуры

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

&НаКлиенте
Процедура СпособРаспределенияПоПодразделениямПриИзменении(Элемент)
	
	ОбработатьИзменениеСпособаРаспределения();
	
КонецПроцедуры

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

&НаКлиенте
Процедура БазаРаспределенияПоПартиямПриИзменении(Элемент)
	
	ОбработатьИзменениеБазаРаспределенияПоПартиям();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СписаниеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	//++ НЕ УТ

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СписаниеАналитикаРасходовОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	ДоходыИРасходыКлиент.ОкончаниеВводаТекстаАналитикиРасходов(ЭтотОбъект, Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбработатьИзменениеИспользоватьРаспределениеПоПодразделениям()

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

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

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

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

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

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

	НастроитьЗаголовкиПолей(ЭтаФорма, "ОтборНаправленияРаспределения");

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

//++ Локализация

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьВидимостьЭлементовПоФО()
	
	//++ Локализация
	Элементы.ГруппаОтборПоГруппамПродукции.Видимость = ПартионныйУчет21
		 И (ПолучитьФункциональнуюОпцию("АналитическийУчетПоГруппамПродукции")
			Или ОтборПоГруппамПродукции.Количество());
	//-- Локализация
	
КонецПроцедуры

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

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

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

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

	//++ Локализация
	Если Форма.ПартионныйУчет21 И Объект.БазаРаспределенияПоПартиям = ПредопределенноеЗначение("Перечисление.ТипыБазыРаспределенияРасходов.СуммаМатериальныхИТрудозатрат") Тогда
		
		Форма.ТекстДобавитьИзменитьОтборБазыРаспределенияПоПартиям = НСтр("ru = 'Отбор недоступен.'");
		Элементы.ТекстДобавитьИзменитьОтборБазыРаспределенияПоПартиям.Гиперссылка = Ложь;
		Элементы.ТекстДобавитьИзменитьОтборБазыРаспределенияПоПартиям.ЦветТекста = WebЦвета.ТемноСерый;
		
	КонецЕсли;
	
	Если Форма.ПартионныйУчет21 И (ИмяРеквизита = "ОтборПоГруппамПродукции" 
		Или ИмяРеквизита = Неопределено) Тогда
		Форма.ТекстДобавитьИзменитьОтборПоГруппамПродукции = 
			ПредставлениеГиперссылокОтбора.Получить(Форма.ОтборПоГруппамПродукции.Количество() > 0);
	КонецЕсли;
	//-- Локализация
	
КонецПроцедуры

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

#Область ИнициализацияФормы

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

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

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

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

#Область Отборы

//++ Локализация

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

КонецПроцедуры
//-- Локализация

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

// Открывает форму настройки отборов.
// Параметры:
//	ПараметрыОткрытия - Структура - описание структуры в ПараметрыОткрытияНастройкиОтборов
&НаКлиенте
Процедура ОткрытьФормуНастройкиОтборов(ПараметрыОткрытия, ЗаголовокФормы = "")

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

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

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

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

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

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

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

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

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

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

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

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

#Область ВзаимодействиеСПользователем

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

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

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

#Область РаботаСТипамиБаз

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

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

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

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

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

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

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

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

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

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

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