Отчет переработчика (2.4) / Подбор продукции из поступлений / Модуль формы

файл

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПеренестиВДокумент(Команда)

	ПеренестиСтрокиВДокумент();

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

&НаКлиенте
Процедура ВыбратьСтроки(Команда)

	ОтметитьСтроки(Истина);

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

&НаКлиенте
Процедура ИсключитьСтроки(Команда)

	ОтметитьСтроки(Ложь);

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

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

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

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

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

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

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

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

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

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

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаТовары.Имя);

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

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

&НаСервере
Процедура ЗаполнитьТаблицуТоваров()
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Регистратор",             Параметры.Ссылка);
	Запрос.УстановитьПараметр("Организация",             Параметры.Организация);
	Запрос.УстановитьПараметр("Переработчик",            Параметры.Партнер);
	Запрос.УстановитьПараметр("ТипСтоимости",            Параметры.ТипСтоимости);
	Запрос.УстановитьПараметр("НаправлениеДеятельности", Параметры.НаправлениеДеятельности);
	
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|		ВложенныйЗапрос.Организация                   КАК Организация,
	|		ВложенныйЗапрос.Распоряжение                  КАК Распоряжение,
	|		ВложенныйЗапрос.КодСтроки                     КАК КодСтроки,
	|		ВложенныйЗапрос.АналитикаУчетаНоменклатуры    КАК АналитикаУчетаНоменклатуры,
	|		ВложенныйЗапрос.КоличествоОстаток             КАК Количество
	|ПОМЕСТИТЬ втТоварыПолученныеОтПереработчикаОстатки
	|	ИЗ
	|		РегистрНакопления.ТоварыПолученныеОтПереработчика.Остатки(,
	|			ТИПЗНАЧЕНИЯ(Распоряжение) = ТИП(Документ.ПоступлениеОтПереработчика)
	|			И ТипСтоимости = &ТипСтоимости) КАК ВложенныйЗапрос
	|	ГДЕ
	|		ВложенныйЗапрос.КоличествоОстаток > 0
	|
	|	ОБЪЕДИНИТЬ ВСЕ
	|
	|	ВЫБРАТЬ
	|		ВложенныйЗапрос.Организация                   КАК Организация,
	|		ВложенныйЗапрос.Распоряжение                  КАК Распоряжение,
	|		ВложенныйЗапрос.КодСтроки                     КАК КодСтроки,
	|		ВложенныйЗапрос.АналитикаУчетаНоменклатуры    КАК АналитикаУчетаНоменклатуры,
	|		ВложенныйЗапрос.Количество                    КАК Количество
	|	ИЗ
	|		РегистрНакопления.ТоварыПолученныеОтПереработчика КАК ВложенныйЗапрос
	|	ГДЕ
	|		ВложенныйЗапрос.Регистратор = &Регистратор
	|		И ВложенныйЗапрос.ТипСтоимости = &ТипСтоимости
	|		И ТИПЗНАЧЕНИЯ(ВложенныйЗапрос.Распоряжение) = ТИП(Документ.ПоступлениеОтПереработчика)
	|;
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВложенныйЗапрос.Организация                                 КАК Организация,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.МестоХранения    КАК Переработчик,
	|	ДокПоступлениеОтПереработчика.Подразделение                 КАК Подразделение,
	|	ВложенныйЗапрос.Распоряжение                                КАК Распоряжение,
	|	ВложенныйЗапрос.КодСтроки                                   КАК КодСтроки,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Номенклатура     КАК Номенклатура,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Характеристика   КАК Характеристика,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Назначение       КАК Назначение,
	|	ЕСТЬNULL(ТаблицаПродукция.Упаковка, ТаблицаОтходы.Упаковка) КАК Упаковка,
	|	СУММА(ВложенныйЗапрос.Количество)                           КАК Количество,
	|	СУММА(ВложенныйЗапрос.Количество / 
	|		ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки1, 
	|			ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки2, 1)))    КАК КоличествоУпаковок,
	|	ВЫБОР
	|		КОГДА ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Номенклатура.ИспользованиеХарактеристик В (
	|				ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры), 
	|				ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры), 
	|				ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры))
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ХарактеристикиИспользуются,
	|	ДокПоступлениеОтПереработчика.НаправлениеДеятельности КАК НаправлениеДеятельности
	|ИЗ
	|	втТоварыПолученныеОтПереработчикаОстатки КАК ВложенныйЗапрос
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеОтПереработчика КАК ДокПоступлениеОтПереработчика
	|		ПО (ДокПоступлениеОтПереработчика.Ссылка = ВложенныйЗапрос.Распоряжение)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеОтПереработчика.Товары КАК ТаблицаПродукция
	|		ПО (ТаблицаПродукция.Ссылка = ВложенныйЗапрос.Распоряжение)
	|			И (ТаблицаПродукция.КодСтроки = ВложенныйЗапрос.КодСтроки)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеОтПереработчика.ВозвратныеОтходы КАК ТаблицаОтходы
	|		ПО (ТаблицаОтходы.Ссылка = ВложенныйЗапрос.Распоряжение)
	|			И (ТаблицаОтходы.КодСтроки = ВложенныйЗапрос.КодСтроки)
	|ГДЕ
	|	(&Переработчик = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
	|			ИЛИ ВложенныйЗапрос.АналитикаУчетаНоменклатуры.МестоХранения = &Переработчик)
	|	И (&Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
	|			ИЛИ ВложенныйЗапрос.Организация = &Организация)
	|	И (&НаправлениеДеятельности = ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка)
	|			ИЛИ ДокПоступлениеОтПереработчика.НаправлениеДеятельности = &НаправлениеДеятельности)
	|
	|СГРУППИРОВАТЬ ПО
	|	ДокПоступлениеОтПереработчика.Ссылка,
	|	ВложенныйЗапрос.Организация,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.МестоХранения,
	|	ВложенныйЗапрос.Распоряжение,
	|	ВложенныйЗапрос.КодСтроки,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Номенклатура,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Характеристика,
	|	ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Назначение,
	|	ЕСТЬNULL(ТаблицаПродукция.Упаковка, ТаблицаОтходы.Упаковка),
	|		ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки1, 
	|			ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки2, 1)),
	|	ВЫБОР
	|		КОГДА ВложенныйЗапрос.АналитикаУчетаНоменклатуры.Номенклатура.ИспользованиеХарактеристик В (
	|				ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры), 
	|				ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры), 
	|				ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры))
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ,
	|	ДокПоступлениеОтПереработчика.НаправлениеДеятельности
	|ИМЕЮЩИЕ
	|	СУММА(ВложенныйЗапрос.Количество) > 0
	|УПОРЯДОЧИТЬ ПО
	|	ДокПоступлениеОтПереработчика.Дата,
	|	ДокПоступлениеОтПереработчика.Номер,
	|	ДокПоступлениеОтПереработчика.Ссылка";
	
	Запрос.Текст = СтрЗаменить(
		Запрос.Текст,
		"&ТекстЗапросаКоэффициентУпаковки1",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
			"ТаблицаПродукция.Упаковка",
			"ТаблицаПродукция.Номенклатура"));
	
	Запрос.Текст = СтрЗаменить(
		Запрос.Текст,
		"&ТекстЗапросаКоэффициентУпаковки2",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
			"ТаблицаОтходы.Упаковка",
			"ТаблицаОтходы.Номенклатура"));
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		ДанныеСтроки = ТаблицаТовары.Добавить();
		ЗаполнитьЗначенияСвойств(ДанныеСтроки, Выборка);
		
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаСервере
Процедура ОтметитьСтроки(Значение)

	Для Каждого СтрокаТЧ Из ТаблицаТовары.НайтиСтроки(Новый Структура("СтрокаВыбрана", Не Значение)) Цикл

		СтрокаТЧ.СтрокаВыбрана = Значение;

	КонецЦикла;

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

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

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

ВыполняетсяЗакрытие = Ложь;

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

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