Списание затрат на выпуск / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

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

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

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

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

#КонецЕсли

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