Назначения / Форма выбора / Модуль формы

файл

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

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

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

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

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

&НаКлиенте
Процедура ПереключательВариантыВыбораПриИзменении(Элемент)
	НастроитьФормуПоВариантуВыбораНазначения();
КонецПроцедуры

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

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

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

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

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

#Область НастройкаФормы

&НаСервере
Процедура НастроитьФормуПоВариантуВыбораНазначения()

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

&НаСервере
Процедура УстановитьЗаголовокФормы()
	
	Заголовок = НСтр("ru = 'Выбор назначения'");
	Если ЗначениеЗаполнено(Параметры.Номенклатура) Тогда
		ТекстНоменклатура = СтрЗаменить(НСтр("ru = 'Номенклатура: %1'"), "%1", Параметры.Номенклатура);
		Если ЗначениеЗаполнено(Параметры.Характеристика) Тогда
			ТекстНоменклатура = ТекстНоменклатура + ", "
				+ СтрЗаменить(НСтр("ru = 'Характеристика: %1'"), "%1", Параметры.Характеристика);
		КонецЕсли;
		Заголовок = Заголовок + " (" + ТекстНоменклатура + ")";
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьНадписьОтобраныНазначения()
	
	Элементы.НадписьОтобраныНазначения.Видимость = Ложь;
	
КонецПроцедуры

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

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

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

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

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