Порча товаров / Модуль объекта

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

#Область ПрограммныйИнтерфейс

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

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

// Процедура заполняет табличную часть документа по остаткам к оформлению излишков и недостач.
//
// Параметры:
//  ДокументОснование	 - ДокументСсылка.ПересчетТоваров, ДокументСсылка.ОрдерНаОтражениеПорчиТоваров - основание для заполнения.
//
Процедура ЗаполнитьТабличнуюЧастьТовары(ДокументОснование = Неопределено) Экспорт

	Запрос = Новый Запрос;
	
	ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач = СкладыСервер.ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач(Склад);
	
	Если ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач Тогда 

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

// Заполняет аналитики учета номенклатуры. Используется в отчете ОстаткиТоваровОрганизаций.
//
Процедура ЗаполнитьАналитикиУчетаНоменклатуры() Экспорт
	
	ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров();

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

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

// Заполняет реквизиты, хранящие информацию о видах запасов и аналитиках учета номенклатуры в табличной части 'Товары'
// документа, а также заполняет табличную часть 'ВидыЗапасов'.
//
// Параметры:
//	Отказ - Булево - признак того, что не удалось заполнить данные.
//	ТаблицыДокумента - см. Документы.ПорчаТоваров.КоллекцияТабличныхЧастейТоваров.
//
Процедура ЗаполнитьВидыЗапасовПриОбмене(Отказ, ТаблицыДокумента) Экспорт
	
	ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров();
	
	Если ТаблицыДокумента <> Неопределено Тогда
		ЗаполнитьАналитикиУчетаНоменклатурыВТабличныхЧастяхТоваров(ТаблицыДокумента);
		ДополнительныеСвойства.Вставить("ТаблицыЗаполненияВидовЗапасовПриОбмене", ТаблицыДокумента);
	Иначе
		ИмяПараметра = "ТаблицыДокумента";
		
		ТекстИсключения = НСтр("ru = 'Для заполнения видов запасов не передан параметр ""%1"".'");
		ТекстИсключения = СтрШаблон(ТекстИсключения, ИмяПараметра);
		
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	
	ЗаполнитьВидыЗапасов(Отказ);
	ДополнительныеСвойства.Удалить("ТаблицыЗаполненияВидовЗапасовПриОбмене");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

#Область ИнициализацияИЗаполнение

Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)

	Ответственный = Пользователи.ТекущийПользователь();
	Автор = Пользователи.ТекущийПользователь();

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

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

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

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

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

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

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

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

		Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", Выборка.НомерСтроки, "Номенклатура");
			
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура УдалитьСтрокиИзТаблицы(Таблица, МассивСтрок)
	Для Каждого Строка Из МассивСтрок Цикл
		Таблица.Удалить(Строка);
	КонецЦикла;
КонецПроцедуры

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

#Область ВидыЗапасов

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

Функция ПроверитьИзменениеТоваров(МенеджерВременныхТаблиц)
	
	Запрос = Новый Запрос("
	|////////////////////////////////////////////////////////////////////////////////
	|// Проверим соответствие табличных частей Товары и ВидыЗапасов
	|ВЫБРАТЬ
	|	ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
	|	ТаблицаТоваров.АналитикаУчетаНоменклатурыОприходование КАК АналитикаУчетаНоменклатурыОприходование
	|ИЗ (
	|	ВЫБРАТЬ
	|		ТаблицаТоваров.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
	|		ТаблицаТоваров.АналитикаУчетаНоменклатурыОприходование КАК АналитикаУчетаНоменклатурыОприходование,
	|		ТаблицаТоваров.Количество КАК Количество,
	|		ВЫРАЗИТЬ(ТаблицаТоваров.Количество * ТаблицаТоваров.Цена КАК ЧИСЛО(31,2)) КАК Сумма,
	|		ВЫРАЗИТЬ(ТаблицаТоваров.Количество * ТаблицаТоваров.ЦенаЗабаланс КАК ЧИСЛО(31,2)) КАК СуммаЗабаланс
	|	ИЗ
	|		ТаблицаТоваров КАК ТаблицаТоваров
	|
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры,
	|		ТаблицаВидыЗапасов.АналитикаУчетаНоменклатурыОприходование,
	|		-ТаблицаВидыЗапасов.Количество КАК Количество,
	|		-ТаблицаВидыЗапасов.Сумма КАК Сумма,
	|		-ТаблицаВидыЗапасов.СуммаЗабаланс КАК СуммаЗабаланс
	|	ИЗ
	|		ТаблицаВидыЗапасов КАК ТаблицаВидыЗапасов
	|
	|	) КАК ТаблицаТоваров
	|
	|СГРУППИРОВАТЬ ПО
	|	ТаблицаТоваров.АналитикаУчетаНоменклатуры,
	|	ТаблицаТоваров.АналитикаУчетаНоменклатурыОприходование
	|
	|ИМЕЮЩИЕ
	|	СУММА(ТаблицаТоваров.Количество) <> 0
	|	ИЛИ СУММА(ТаблицаТоваров.Сумма) <> 0
	|	ИЛИ СУММА(ТаблицаТоваров.СуммаЗабаланс) <> 0
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|");
	Запрос.УстановитьПараметр("ПриходПоСебестоимости", ПриходоватьТоварыПоСебестоимостиСписания);
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

	РезультатЗапрос = Запрос.Выполнить();
	
	Возврат (Не РезультатЗапрос.Пустой());
	
КонецФункции 

Функция ПараметрыЗаполненияВидовЗапасов()
	
	ПараметрыЗаполнения = ЗапасыСервер.ПараметрыЗаполненияВидовЗапасов();
	ПараметрыЗаполнения.НалогообложениеНДС = ВидДеятельностиНДС;
	ПараметрыЗаполнения.СторнируемыйДокумент = СторнируемыйДокумент;
	
	
	ПараметрыЗаполнения.ПодбиратьВТЧТоварыПринятыеНаОтветственноеХранение.Вставить(Перечисления.ТипыЗапасов.ТоварНаХраненииСПравомПродажи, "Всегда");
	
	Возврат ПараметрыЗаполнения;
	
КонецФункции

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

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

#КонецЕсли

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