Помощник исправления остатков товаров организаций / Модуль объекта

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

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

Перем Процент;

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

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

Процедура ОбновитьДанныеПоОтрицательнымОстаткамИСальдо() Экспорт
	
	КоличествоПозицийОтрицательныйОстаток       = 0;
	КоличествоПозицийОтрицательныйОстатокПрочее = 0;
	КоличествоПозицийРазвернутоеСальдо          = 0;
		
	Если ЗначениеЗаполнено(МесяцИсправления) Тогда
		Запрос           = ЗапросКоличестваПроблемныхПозиций();
		РезультатЗапроса = Запрос.ВыполнитьПакет(); 		
		ВГраница         = РезультатЗапроса.ВГраница();
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса[ВГраница - 2].Выбрать();
		Если ВыборкаДетальныеЗаписи.Следующий() Тогда
			ВсегоПроблемныхПозиций = ВыборкаДетальныеЗаписи.КоличествоПозиций;
		КонецЕсли;
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса[ВГраница - 1].Выбрать();
		Если ВыборкаДетальныеЗаписи.Следующий() Тогда
			КоличествоПозицийОтрицательныйОстаток = ВыборкаДетальныеЗаписи.КоличествоПозиций;
		КонецЕсли;
		
		
		КоличествоПозицийРазвернутоеСальдо = ВсегоПроблемныхПозиций - КоличествоПозицийОтрицательныйОстаток;
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьМесяцИсправления() Экспорт

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

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

			Запрос.УстановитьПараметр("ГраницаПериода" + Формат(ТекМесяц, "ДФ=yyyyMM"), Новый Граница(ТекМесяц, ВидГраницы.Включая));
			Запрос.УстановитьПараметр("Период" + Формат(ТекМесяц, "ДФ=yyyyMM"), ТекМесяц);

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

	КонецЕсли;
	
КонецПроцедуры

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

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

Процедура СформироватьНовыеРезервыПоНовымНастройкам() Экспорт
	
	Если Не ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	СформироватьНовыеРезервы(Истина);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

Процедура Инициализировать() Экспорт
	
	МетаданныеОбработки = Метаданные();
	Для Каждого Поле Из МетаданныеОбработки.Реквизиты Цикл
		ЭтотОбъект[Поле.Имя] = Неопределено;
	КонецЦикла;
	Для Каждого ТЧ Из МетаданныеОбработки.ТабличныеЧасти Цикл
		ЭтотОбъект[ТЧ.Имя].Очистить();
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура СообщитьПрогрессПерезаполненияВидовЗапасов()
	
	Если Не КоличествоПозицийРазвернутоеСальдоБыло Тогда
		Возврат;
	КонецЕсли;
	
	ТекстСообщения = НСтр("ru = 'Выполняется перезаполнение видов запасов'");
	Если Процент = Неопределено Тогда
		Процент = 0;
		ДлительныеОперации.СообщитьПрогресс(0, ТекстСообщения);
	КонецЕсли;
	НовыйПроцент = 
		100 
		- (КоличествоПозицийОтрицательныйОстаток + КоличествоПозицийРазвернутоеСальдо) 
		/ (КоличествоПозицийОтрицательныйОстатокБыло + КоличествоПозицийРазвернутоеСальдоБыло) 
		* 100;
	Если НовыйПроцент - Процент > 1 Тогда // срабатывает не более 100 раз
		Процент = НовыйПроцент;
		ДлительныеОперации.СообщитьПрогресс(Окр(Процент), ТекстСообщения);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Функция ИмяСобытия()
	Возврат НСтр("ru = 'Ошибка при работе помощника исправления остатков товаров организаций'",  
		ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
КонецФункции

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

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

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

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

	Если ТолькоПервыйИсточник Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТолькоПервыйИсточник,", "ПЕРВЫЕ 1");
	Иначе	
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТолькоПервыйИсточник,", "");
	КонецЕсли;
		
	Запрос.УстановитьПараметр("ВключаяСобственные", 	    ВключаяСобственные);
	Запрос.УстановитьПараметр("ТипыЗапасовВнешнийВладелец", Перечисления.ТипыЗапасов.ТипыЗапасовВнешнийВладелец());
	Запрос.УстановитьПараметр("ГраницаИсправления", 	    Новый Граница(КонецМесяца(МесяцИсправления), ВидГраницы.Включая));
	Запрос.УстановитьПараметр("ПериодИсправления",          КонецМесяца(МесяцИсправления));
	
	Возврат Запрос;

КонецФункции

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

	Если ТолькоПервыйИсточник Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТолькоПервыйИсточник,", "ПЕРВЫЕ 1");
	Иначе	
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТолькоПервыйИсточник,", "");
	КонецЕсли;
		
	Запрос.УстановитьПараметр("ВключаяСобственные", 	    ВключаяСобственные);
	Запрос.УстановитьПараметр("ТипыЗапасовВнешнийВладелец", Перечисления.ТипыЗапасов.ТипыЗапасовВнешнийВладелец());
	Запрос.УстановитьПараметр("ГраницаИсправления", 	    Новый Граница(КонецМесяца(МесяцИсправления), ВидГраницы.Включая));
	Запрос.УстановитьПараметр("ПериодИсправления",          КонецМесяца(МесяцИсправления));
	
	Возврат Запрос;

КонецФункции

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

	Возврат ТекстЗапроса;

КонецФункции

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

	Возврат ТекстЗапроса;

КонецФункции

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

КонецФункции

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

		
	Возврат Запрос;

КонецФункции

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

КонецФункции

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

КонецФункции

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

КонецФункции

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

	Возврат Запрос;

КонецФункции

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

#КонецЕсли

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