Акт выполненных внутренних работ / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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