Пересчет товаров / Модуль менеджера

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

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

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("АдресныйСклад");
	МеханизмыДокумента.Добавить("Обеспечение");
	МеханизмыДокумента.Добавить("СерийныйУчет");
	
	ПересчетТоваровЛокализация.ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента);
	
КонецПроцедуры

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

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

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

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

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

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

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
	Отчеты.ВедомостьПоТоварамНаСкладах.ДобавитьКомандуПоПересчетуТоваров(КомандыОтчетов);
		
	Отчеты.ОформлениеИзлишковНедостачТоваров.ДобавитьКомандуОформлениеПересчет(КомандыОтчетов);
	
	ПересчетТоваровЛокализация.ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры);

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

// Имена реквизитов, от значений которых зависят параметры указания серий
//
//	Возвращаемое значение:
//		Строка - имена реквизитов, перечисленные через запятую.
//
Функция ИменаРеквизитовДляЗаполненияПараметровУказанияСерий() Экспорт
	
	ИменаРеквизитов = "Склад,Помещение,Дата";
	Возврат ИменаРеквизитов;
	
КонецФункции

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

// Возвращает значение распоряжения на поступление или отгрузку.
//
// Параметры:
//  ЗначенияПолейДляОпределенияРаспоряжения	 - Структура - состав полей определяется значением
//  поля ИменаПолейДляОпределенияРаспоряжения параметров указания серий этого документа.
//
// Возвращаемое значение:
//  ДокументСсылка - ссылка на распоряжение.
//
Функция РаспоряжениеНаВыполнениеСкладскойОперации(ЗначенияПолейДляОпределенияРаспоряжения) Экспорт
	
	Возврат ЗначенияПолейДляОпределенияРаспоряжения.Ссылка;
	
КонецФункции

// Возвращает текст запроса для расчета статусов указания серий
//
// Параметры:
//  ПараметрыУказанияСерий	 - Структура - состав полей задается в функции НоменклатураКлиентСервер.ПараметрыУказанияСерий.
//
// Возвращаемое значение:
//  Строка - текст запроса
//
Функция ТекстЗапросаЗаполненияСтатусовУказанияСерий(ПараметрыУказанияСерий) Экспорт
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Серия КАК Серия,
	|	Товары.СтатусУказанияСерий КАК СтатусУказанияСерий
	|ПОМЕСТИТЬ Товары
	|ИЗ
	|	&Товары КАК Товары
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.Номенклатура КАК Номенклатура,
	|	ВЫРАЗИТЬ(Товары.Номенклатура КАК Справочник.Номенклатура).ВидНоменклатуры КАК ВидНоменклатуры,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Серия КАК Серия,
	|	Товары.СтатусУказанияСерий КАК СтатусУказанияСерий
	|ПОМЕСТИТЬ ТоварыДляЗапроса
	|ИЗ
	|	Товары КАК Товары
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.НомерСтроки КАК НомерСтроки,
	|	Товары.СтатусУказанияСерий КАК СтарыйСтатусУказанияСерий,
	|	ВЫБОР
	|		КОГДА ПолитикиУчетаСерий.ПолитикаУчетаСерий ЕСТЬ NULL 
	|			ТОГДА 0
	|		КОГДА ПолитикиУчетаСерий.ПолитикаУчетаСерий.УчитыватьСебестоимостьПоСериям
	|			ТОГДА ВЫБОР
	|					КОГДА Товары.Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
	|						ТОГДА 13
	|					ИНАЧЕ 14
	|				КОНЕЦ
	|		КОГДА ПолитикиУчетаСерий.ПолитикаУчетаСерий.УказыватьПриПланированииОтгрузки
	|			ТОГДА ВЫБОР
	|					КОГДА Товары.Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
	|						ТОГДА 9
	|					ИНАЧЕ 10
	|				КОНЕЦ
	|		КОГДА ПолитикиУчетаСерий.ПолитикаУчетаСерий.УказыватьПриПланированииОтбора
	|			ТОГДА ВЫБОР
	|					КОГДА ПолитикиУчетаСерий.ПолитикаУчетаСерий.УчетСерийПоFEFO
	|						ТОГДА ВЫБОР
	|								КОГДА Товары.Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
	|									ТОГДА 5
	|								ИНАЧЕ 6
	|							КОНЕЦ
	|					ИНАЧЕ ВЫБОР
	|							КОГДА Товары.Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
	|								ТОГДА 7
	|							ИНАЧЕ 8
	|						КОНЕЦ
	|				КОНЕЦ
	|		КОГДА ПолитикиУчетаСерий.ПолитикаУчетаСерий.УказыватьПоФактуОтбора
	|				И ПолитикиУчетаСерий.ПолитикаУчетаСерий.УчитыватьОстаткиСерий
	|			ТОГДА ВЫБОР
	|					КОГДА Товары.Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
	|						ТОГДА 3
	|					ИНАЧЕ 4
	|				КОНЕЦ
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК СтатусУказанияСерий
	|ПОМЕСТИТЬ Статусы
	|ИЗ
	|	ТоварыДляЗапроса КАК Товары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНоменклатуры.ПолитикиУчетаСерий КАК ПолитикиУчетаСерий
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
	|			ПО (&Склад = Склады.Ссылка)
	|		ПО (ПолитикиУчетаСерий.Склад = &Склад)
	|			И Товары.ВидНоменклатуры = ПолитикиУчетаСерий.Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Статусы.НомерСтроки КАК НомерСтроки,
	|	Статусы.СтатусУказанияСерий КАК СтатусУказанияСерий
	|ИЗ
	|	Статусы КАК Статусы
	|ГДЕ
	|	Статусы.СтатусУказанияСерий <> Статусы.СтарыйСтатусУказанияСерий
	|
	|УПОРЯДОЧИТЬ ПО
	|	Статусы.НомерСтроки";
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

// Возвращает таблицу состояний и дат пересчетов ячеек после проведения пересчета товаров.
//
// Параметры:
//  ДокументСсылка	 - ДокументСсылка.ПересчетТоваров - ссылка на пересчет товаров
//  Статус			 - ПеречислениеСсылка.СтатусыПересчетовТоваров - статус пересчета.
//
// Возвращаемое значение:
//  ТаблицаЗначений - таблица значений с состояниями и датами ячеек.
//
Функция ТаблицаСостоянийПересчетовЯчеек(ДокументСсылка, Статус) Экспорт
	
	ТаблицаСостоянийПересчетовЯчеек = Новый ТаблицаЗначений;
	
	Если Статус = Перечисления.СтатусыПересчетовТоваров.Выполнено Тогда

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

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Склад)";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

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

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

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

#Область Проведение

// Используется в механизмах обновления ИБ
//
// Параметры:
//  ИмяРегистра	 - Строка	 - имя регистра.
//
// Возвращаемое значение:
//  Соответствие -
//
Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

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

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

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

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

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

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

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

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

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

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

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

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

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

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

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

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

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

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

#Область ГенерацияЗаданийНаПересчет

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

Процедура РазбитьПоКоличествуЯчеекВЗадании(ПараметрыГенерации, МассивЯчеек, КоличествоСозданныхЗаданий )
	
	ЯчейкиПоКоличеству = Новый Массив;	

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

Процедура УстановитьЗначениеПараметраНастроек(Настройки, ИмяПараметра, Значение)
	
	Параметр = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
	
	Если Параметр <> Неопределено Тогда
		Параметр.Значение = Значение;
		Параметр.Использование = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

#КонецЕсли
#КонецЕсли

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